# 14 Testing, CI and Quality Assurance This chapter centralizes the project's testing strategy, CI configuration, and quality targets. ## Overview CalMiner uses a combination of unit, integration, and end-to-end tests to ensure quality. ### Frameworks - Backend: pytest for unit and integration tests. - Frontend: pytest with Playwright for E2E tests. - Database: pytest fixtures with psycopg2 for DB tests. ### Test Types - Unit Tests: Test individual functions/modules. - Integration Tests: Test API endpoints and DB interactions. - E2E Tests: Playwright for full user flows. ### CI/CD - Use GitHub Actions for CI. - Run tests on pull requests. - Code coverage target: 80% (using pytest-cov). ### Running Tests - Unit: `pytest tests/unit/` - E2E: `pytest tests/e2e/` - All: `pytest` ### Test Directory Structure Organize tests under the `tests/` directory mirroring the application structure: ```text tests/ unit/ test_.py e2e/ test_.py fixtures/ conftest.py ```python ### Fixtures and Test Data - Define reusable fixtures in `tests/fixtures/conftest.py`. - Use temporary in-memory databases or isolated schemas for DB tests. - Load sample data via fixtures for consistent test environments. - Leverage the `seeded_ui_data` fixture in `tests/unit/conftest.py` to populate scenarios with related cost, maintenance, and simulation records for deterministic UI route checks. ### E2E (Playwright) Tests The E2E test suite, located in `tests/e2e/`, uses Playwright to simulate user interactions in a live browser environment. These tests are designed to catch issues in the UI, frontend-backend integration, and overall application flow. #### Fixtures - `live_server`: A session-scoped fixture that launches the FastAPI application in a separate process, making it accessible to the browser. - `playwright_instance`, `browser`, `page`: Standard `pytest-playwright` fixtures for managing the Playwright instance, browser, and individual pages. #### Smoke Tests - UI Page Loading: `test_smoke.py` contains a parameterized test that systematically navigates to all UI routes to ensure they load without errors, have the correct title, and display a primary heading. - Form Submissions: Each major form in the application has a corresponding test file (e.g., `test_scenarios.py`, `test_costs.py`) that verifies: page loads, create item by filling the form, success message, and UI updates. ### Running E2E Tests To run the Playwright tests: ```bash pytest tests/e2e/ ``` To run headed mode: ```bash pytest tests/e2e/ --headed ``` ### Mocking and Dependency Injection - Use `unittest.mock` to mock external dependencies. - Inject dependencies via function parameters or FastAPI's dependency overrides in tests. ### Code Coverage - Install `pytest-cov` to generate coverage reports. - Run with coverage: `pytest --cov --cov-report=term` (use `--cov-report=html` when visualizing hotspots). - Target 95%+ overall coverage. Focus on historically low modules: `services/simulation.py`, `services/reporting.py`, `middleware/validation.py`, and `routes/ui.py`. - Latest snapshot (2025-10-21): `pytest --cov=. --cov-report=term-missing` returns **91%** overall coverage. ### CI Integration - Configure GitHub Actions workflow in `.github/workflows/ci.yml` to: - Install dependencies, including Playwright browsers (`playwright install`). - Run `pytest` with coverage for unit tests. - Run `pytest tests/e2e/` for E2E tests. - Fail on coverage <80%. - Upload coverage artifacts under `reports/coverage/`.