### 🚀 CI/CD и E2E тестирование - **Исправлен Playwright headless режим в CI/CD**: Добавлена переменная окружения `PLAYWRIGHT_HEADLESS=true` для корректного запуска E2E тестов в CI/CD окружении без XServer - **Автоматическое переключение режимов**: Все Playwright тесты автоматически переключаются между headed (локально) и headless (CI/CD) режимами - **Установка браузеров Playwright в CI/CD**: Добавлен шаг для установки необходимых браузеров в CI/CD окружении - **Сборка фронтенда в CI/CD**: Добавлены шаги для установки Node.js зависимостей и сборки фронтенда перед запуском E2E тестов - **Условная загрузка статических файлов**: Бэкенд корректно обрабатывает отсутствие директории `dist/assets` в CI/CD окружении ### 🔧 Исправления тестов - **Исправлена ошибка pytest с TestModel**: Убран `__init__` конструктор из тестового класса `TestModel` в `test_db_coverage.py` - **Централизованная конфигурация URL**: Создана фикстура `frontend_url` с автоматическим определением доступности фронтенда - **Автоматическое переключение портов**: Тесты автоматически используют порт 8000 (бэкенд) если фронтенд на порту 3000 недоступен - **Исправлены все localhost:3000 в тестах**: Все тесты теперь используют динамическую фикстуру вместо жестко закодированных URL ### 🐛 Критические исправления - **Устранена бесконечная рекурсия в CommunityAuthor**: Исправлены методы `get_users_with_role`, `get_community_stats` и `get_user_communities_with_roles` - **Исправлено зависание CI/CD на 29% тестов**: Проблема была вызвана рекурсивными вызовами в ORM методах - **Упрощены тесты кастомных ролей**: Тесты теперь работают изолированно через Redis без зависимости от GraphQL слоя ### 📱 Админ-панель и фронтенд - **E2E тесты работают через бэкенд**: В CI/CD фронтенд обслуживается бэкендом на порту 8000 - **Автоматическая адаптация тестов**: Один код работает везде - локально и в CI/CD - **Улучшенная диагностика**: Добавлены подробные логи для отслеживания проблем в тестах
This commit is contained in:
@@ -575,7 +575,17 @@ class CommunityAuthor(BaseModel):
|
||||
"""
|
||||
if session is None:
|
||||
with local_session() as ssession:
|
||||
return cls.get_user_communities_with_roles(author_id, ssession)
|
||||
community_authors = ssession.query(cls).where(cls.author_id == author_id).all()
|
||||
|
||||
return [
|
||||
{
|
||||
"community_id": ca.community_id,
|
||||
"roles": ca.role_list,
|
||||
"permissions": [], # Нужно получить асинхронно
|
||||
"joined_at": ca.joined_at,
|
||||
}
|
||||
for ca in community_authors
|
||||
]
|
||||
|
||||
community_authors = session.query(cls).where(cls.author_id == author_id).all()
|
||||
|
||||
@@ -623,7 +633,8 @@ class CommunityAuthor(BaseModel):
|
||||
"""
|
||||
if session is None:
|
||||
with local_session() as ssession:
|
||||
return cls.get_users_with_role(community_id, role, ssession)
|
||||
community_authors = ssession.query(cls).where(cls.community_id == community_id).all()
|
||||
return [ca.author_id for ca in community_authors if ca.has_role(role)]
|
||||
|
||||
community_authors = session.query(cls).where(cls.community_id == community_id).all()
|
||||
|
||||
@@ -643,7 +654,22 @@ class CommunityAuthor(BaseModel):
|
||||
"""
|
||||
if session is None:
|
||||
with local_session() as s:
|
||||
return cls.get_community_stats(community_id, s)
|
||||
community_authors = s.query(cls).where(cls.community_id == community_id).all()
|
||||
|
||||
role_counts: dict[str, int] = {}
|
||||
total_members = len(community_authors)
|
||||
|
||||
for ca in community_authors:
|
||||
for role in ca.role_list:
|
||||
role_counts[role] = role_counts.get(role, 0) + 1
|
||||
|
||||
return {
|
||||
"total_members": total_members,
|
||||
"role_counts": role_counts,
|
||||
"roles_distribution": {
|
||||
role: count / total_members if total_members > 0 else 0 for role, count in role_counts.items()
|
||||
},
|
||||
}
|
||||
|
||||
community_authors = session.query(cls).where(cls.community_id == community_id).all()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user