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

77 lines
3.1 KiB
Markdown

# 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`](TEST_MODEL.md) | Global coverage matrix, risk areas, TC-ID conventions |
| [`FEATURE_POST_LIFECYCLE.md`](FEATURE_POST_LIFECYCLE.md) | CRUD, publish, visibility |
| [`FEATURE_RBAC.md`](FEATURE_RBAC.md) | Roles, permissions, access policies |
| [`FEATURE_DOMAIN_FOUNDATION.md`](FEATURE_DOMAIN_FOUNDATION.md) | Entities, value objects, exceptions |
| [`FEATURE_INFRASTRUCTURE.md`](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`