## [0.9.6] - 2025-08-12
Some checks failed
Deploy on push / deploy (push) Has been cancelled

### 🚀 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:
2025-08-12 16:40:34 +03:00
parent 81b2ec41fa
commit d6d88133bd
6 changed files with 156 additions and 73 deletions

View File

@@ -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()