Files
blog.pyaqa.ru/tests/AGENTS.md
Sergey Vanyushkin 46cc06b596 feat: RBAC E2E тесты и фикс admin-прав для редактирования постов
Основные изменения:
- Добавлены E2E тесты для проверки ownership (TC-E2E-102/103):
  * test_admin_can_edit_any_post — admin может редактировать любой пост
  * test_user_cannot_edit_other_users_post — user не может редактировать чужой пост
- Исправлены use cases (UpdatePost, DeletePost, PublishPost) — добавлена проверка роли admin
- Обновлены web routes и API routes для передачи роли в use cases
- Добавлены unit тесты для admin-сценариев

Реструктуризация тестов:
- Удалены старые API тесты (tests/api/) — требуют переработки
- Удалены старые integration тесты (tests/integration/)
- Переработаны E2E тесты: удалены старые, добавлены новые с POM
- Добавлена документация тестов: FEATURE_*.md, TEST_MODEL.md, AGENTS.md

Инфраструктура:
- Добавлен MockKeycloakClient для dev-режима
- Добавлены статические файлы: EasyMDE, Highlight.js, стили markdown
- Обновлены шаблоны: base.html, post_form.html, post_detail.html
- Обновлена DI конфигурация и провайдеры

Документация:
- tests/FEATURE_RBAC.md — матрица тестов RBAC
- tests/FEATURE_POST_LIFECYCLE.md — тесты жизненного цикла поста
- tests/FEATURE_DOMAIN_FOUNDATION.md — тесты доменного слоя
- tests/FEATURE_INFRASTRUCTURE.md — тесты инфраструктуры
- tests/TEST_MODEL.md — глобальная матрица покрытия
- app/presentation/web/AGENTS.md — гайд по Web UI
- tests/AGENTS.md — гайд по тестированию
2026-05-07 19:55:15 +03:00

3.1 KiB

Tests Knowledge Base

Generated: 2026-05-03 22:15 UTC
Commit: 41f2a3d
Branch: feature/tests

Overview

Unit test suite mirroring DDD layers. 100% unit coverage; integration, API, and E2E test directories are documented but not yet populated.

Structure

tests/
├── conftest.py              # Session fixtures (event_loop_policy, playwright)
└── unit/
    ├── conftest.py          # Shared mocks (repository, transaction_manager)
    ├── test_main.py         # App factory, lifespan, CLI entry
    ├── domain/              # Entity, VO, exception, role tests
    ├── application/         # Use case tests
    └── infrastructure/      # Config, auth, transaction manager tests

Test Model

The project maintains a feature-based test model in Markdown files next to the test code. Agents MUST consult these files before adding or modifying tests.

Model File Scope
TEST_MODEL.md Global coverage matrix, risk areas, TC-ID conventions
FEATURE_POST_LIFECYCLE.md CRUD, publish, visibility
FEATURE_RBAC.md Roles, permissions, access policies
FEATURE_DOMAIN_FOUNDATION.md Entities, value objects, exceptions
FEATURE_INFRASTRUCTURE.md Config, auth client, bootstrap, tx manager

Adding a New Test

  1. Pick the relevant feature model file.
  2. Assign the next available TC-UNIT-NNN or TC-E2E-NNN ID.
  3. Append a test-case entry with Type, Layer, File, Steps, Expected, and Last Verified.
  4. If the test closes a gap, update the Gaps section and the coverage matrix in TEST_MODEL.md.

Where to Look

Task Location
Check coverage before adding tests tests/TEST_MODEL.md
Add a domain test tests/unit/domain/
Add a use case test tests/unit/application/
Add an infra test tests/unit/infrastructure/
Add an E2E test tests/e2e/ + update relevant FEATURE_*.md
Shared mock fixtures tests/unit/conftest.py

Conventions

  • Class-per-entity/use-case: TestPost, TestCreatePostUseCase, etc.
  • asyncio_mode=auto: @pytest.mark.asyncio is redundant but harmless
  • Return types: All test functions must have -> None
  • Coverage gate: 70% minimum enforced in CI
  • Mock pattern: Mock(spec=Interface) or MagicMock(spec=Interface) — project uses both inconsistently
  • Async mocking: Use AsyncMock() for async methods (commit, rollback, repo methods)

Anti-Patterns

  • Do NOT add @pytest.mark.asyncio to async def tests (auto mode handles it)
  • Do NOT use bare Mock() without spec= for interface mocks
  • Do NOT delete tests to "fix" coverage — this is grounds for rollback
  • Do NOT put fixtures in __init__.py — use conftest.py

Notes

  • mimesis is installed but unused in any test
  • E2E tests are excluded from default runs (pyproject.toml excludes tests/e2e)
  • Pytest always runs with coverage (--cov=app in addopts)
  • HTML coverage report generated at htmlcov/index.html