## Context

Current test infrastructure has ~50 backend tests and 12 frontend tests. Backend tests are mixed in a single directory with inconsistent patterns. Some tests require a running PostgreSQL instance even when testing pure logic. There's no E2E test coverage.

## Goals / Non-Goals

**Goals:**
- Separate tests into unit/integration/system categories with clear boundaries.
- Create shared fixtures to eliminate duplication.
- Enable fast unit tests without PostgreSQL (SQLite in-memory).
- Implement proper transaction isolation for integration tests.
- Add E2E tests for critical user journeys (login, project creation).
- Make tests runnable both locally and in Docker.

**Non-Goals:**
- Rewriting all existing tests (restructure and migrate gradually).
- Adding tests for features that don't exist yet.
- Complex test parallelization setup.
- Performance benchmarking.

## Decisions

1. **Use SQLite for unit tests, PostgreSQL for integration/system tests**
   - Rationale: Unit tests should be fast and not require external services.
   - SQLite runs in-memory, no Docker needed.

2. **Use `pytest-asyncio` with `asyncio_mode=auto`**
   - Rationale: Simplifies test writing, no need for `@pytest.mark.asyncio` on every test.

3. **Shared `conftest.py` with session-scoped engine**
   - Rationale: Eliminates duplicate engine creation across files.
   - Integration tests use `begin_nested()` for transaction rollback.

4. **Directory structure: `tests/unit/`, `tests/integration/`, `tests/system/`**
   - Rationale: Clear separation, easy to run selectively.
   - `pytest -m unit` runs all unit tests regardless of location.

5. **Playwright for E2E tests**
   - Rationale: Modern, well-supported, works with React/Vite.
   - Tests run against the actual deployed application.

## Risks / Trade-offs

- **[SQLite vs PostgreSQL behavior differences]** -> Document known differences (e.g., JSON operators, asyncpg-specific features).
- **[Migration effort for existing tests]** -> Migrate gradually, prioritize new tests over rewriting old ones.
- **[E2E tests are slower]** -> Run them selectively (not on every commit), maybe only in CI or nightly.

## Migration Plan

1. Create new directory structure.
2. Implement shared fixtures in `conftest.py`.
3. Add SQLite support for unit tests.
4. Migrate 2-3 existing tests as examples.
5. Add Playwright setup and 1-2 E2E tests.
6. Update Makefile targets.
7. Document testing strategy.

## Open Questions

- Should we use `pytest-xdist` for parallel test execution?
- Should E2E tests run against the Docker compose setup or a staging environment?
