Skip to content

feat(tests): добавлены тесты для моделей, форм и представлений - closes #168#171

Open
oleg-dixon wants to merge 11 commits intohexlet-volunteers:mainfrom
oleg-dixon:develop
Open

feat(tests): добавлены тесты для моделей, форм и представлений - closes #168#171
oleg-dixon wants to merge 11 commits intohexlet-volunteers:mainfrom
oleg-dixon:develop

Conversation

@oleg-dixon
Copy link
Copy Markdown
Contributor

Добавлены тесты для ключевой логики проекта

Closes #168

📁 Новая структура тестов

  • conftest.py - общие фикстуры для тестов
  • test_models.py - тесты моделей User, Group, TelegramChannel, PartnerProfile, Role, UserRoleHistory
  • test_forms.py - тесты всех форм (регистрация, логин, обновление, группы и т.д.)
  • test_views.py - функциональные тесты представлений с Inertia.js
  • pytest.ini - конфигурация pytest
  • generate_fixtures_ci.py - скрипт для генерации фикстур в CI (решает проблему синтаксиса YAML)

🔧 Исправления

  • generate_fixtures.py - генерация валидных тестовых данных (username, email, password)
  • Добавлено создание тестовых пользователей в БД при генерации фикстур
  • pyproject.toml - добавлены тестовые зависимости (pytest, pytest-django, pytest-cov, pytest-mock)
  • Makefile - добавлены цели для тестов (fixtures, test, test-cov)
  • tests.yml - обновлен для запуска тестов в CI (миграции, генерация фикстур, параллельный запуск)

✅ Результаты

  • 41 тестов проходят
  • 7 тестов пропущены (документируют известные проблемы в проекте)
  • Общее покрытие кода: 44%
  • Ключевые модули покрыты на 80-100% (forms, models, middleware)

🐛 Пропущенные тесты (7)

Проблемы в view (2 теста):

  1. test_group_create_post_valid - в view используется неподдерживаемый параметр 'url' в inertia_render
  2. test_group_detail_view - в view вызывается несуществующий метод get_data у QuerySet

Проблемы с внешними ключами в тестовой БД (5 тестов):
3. test_create_user_role_history
4. test_user_role_history_str
5. test_multiple_roles_history
6. test_unique_current_role_constraint
7. test_current_role_manager

⚠️ Известные проблемы

Линтер

В текущей версии линтер выдает 374 ошибки (в основном стилистические). Я намеренно не исправлял их в этом PR, чтобы:

  • Сфокусироваться на добавлении тестов
  • Не смешивать функциональные изменения с код-стайлом
  • Избежать огромного diff'а

Все ошибки линтера можно исправить отдельным PR после мерджа этого.

Также прилагаю скриншот с результатами тестов (41 passed, 7 skipped)
Снимок экрана 2026-03-10 в 09 54 28

- Тесты моделей, форм и Inertia views
- 38 успешных тестов, покрытие 43%
- 2 теста пропущены (известные баги в view)
- Тесты моделей, форм и Inertia views
- 38 успешных тестов, покрытие 43%
- 2 теста пропущены (известные баги в view)
--cov-report=term-missing \
-n auto

- name: Upload coverage to CodeClimate
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Для шага Upload coverage to CodeClimate безопаснее проверять secrets.CC_TEST_REPORTER_ID напрямую или вынести переменную на job-level env. В текущем виде if может не сработать так, как ожидается, потому что условие вычисляется отдельно от env этого шага.


test:
python3 -m pytest --tb=short -q
fixtures:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Таргет fixtures теперь обращается к ORM и создаёт пользователей через _create_test_user. На чистом окружении make test может упасть ещё до запуска pytest, потому что миграции для рабочей БД здесь не выполняются, а тестовая БД создаётся уже самим pytest.

Лучше не зависеть от заранее подготовленной локальной БД для запуска тестов.

password1 = cleaned_data.get('password1')
password2 = cleaned_data.get('password2')

if password1 and password2:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tip

Для ошибки несовпадения паролей лучше использовать self.add_error('password2', ...) или оставить встроенную проверку родительской формы.

Сейчас дополнительная ошибка поднимается из clean() как non-field error, и её сложнее привязать к полю подтверждения пароля в интерфейсе.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Backend: Тестирование

2 participants