- Session-scoped async engine: creates all tables once via `Base.metadata.create_all()`, drops them after all tests finish
- Function-scoped `db_session` fixture: provides a fresh `AsyncSession`, overrides the `get_session` FastAPI dependency, and truncates all tables after each test for isolation
- Function-scoped `client` fixture: `httpx.AsyncClient` with `ASGITransport` — hits the real app stack including middleware and routing
-`asyncio_default_fixture_loop_scope = "session"` and `asyncio_default_test_loop_scope = "session"` added to pyproject.toml so all fixtures and tests share the same session event loop (required to avoid asyncpg "Future attached to different loop" errors)
- Test database URL read from `TEST_DATABASE_URL` env var (default: `postgresql+asyncpg://postgres:postgres@localhost:5433/nuzlocke_test`)
- The test DB is provided by `docker-compose.test.yml` (postgres on port 5433, `nuzlocke_test` DB created automatically)