diff --git a/.beans/nuzlocke-tracker-0arz--integration-tests-for-runs-encounters-api.md b/.beans/nuzlocke-tracker-0arz--integration-tests-for-runs-encounters-api.md new file mode 100644 index 0000000..1dee4bc --- /dev/null +++ b/.beans/nuzlocke-tracker-0arz--integration-tests-for-runs-encounters-api.md @@ -0,0 +1,30 @@ +--- +# nuzlocke-tracker-0arz +title: Integration tests for Runs & Encounters API +status: draft +type: task +created_at: 2026-02-10T09:33:21Z +updated_at: 2026-02-10T09:33:21Z +parent: nuzlocke-tracker-yzpb +--- + +Write integration tests for the core run tracking and encounter API endpoints. This is the heart of the application. + +## Checklist + +- [ ] Test run CRUD operations (create, list, get, update, delete) +- [ ] Test run creation with rules configuration (JSONB field) +- [ ] Test encounter logging on a run (create encounter on a route) +- [ ] Test encounter status changes (alive → dead, alive → retired, etc.) +- [ ] Test duplicate encounter prevention (dupes clause logic) +- [ ] Test shiny encounter handling +- [ ] Test egg encounter handling +- [ ] Test ending a run (completion/failure) +- [ ] Test error cases (encounter on invalid route, duplicate route encounters, etc.) + +## Notes + +- Run endpoints: `backend/src/app/api/runs.py` +- Encounter endpoints: `backend/src/app/api/encounters.py` +- This is the most critical area — Nuzlocke rules enforcement should be thoroughly tested +- Tests need game + pokemon + route fixtures as prerequisites \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-1guz--component-tests-for-key-frontend-components.md b/.beans/nuzlocke-tracker-1guz--component-tests-for-key-frontend-components.md new file mode 100644 index 0000000..3040f20 --- /dev/null +++ b/.beans/nuzlocke-tracker-1guz--component-tests-for-key-frontend-components.md @@ -0,0 +1,30 @@ +--- +# nuzlocke-tracker-1guz +title: Component tests for key frontend components +status: draft +type: task +created_at: 2026-02-10T09:33:45Z +updated_at: 2026-02-10T09:33:45Z +parent: nuzlocke-tracker-yzpb +--- + +Write component tests for the most important frontend React components, focusing on user interactions and rendering correctness. + +## Checklist + +- [ ] Test `EncounterModal` — form submission, validation, Pokemon selection +- [ ] Test `StatusChangeModal` — status transitions, confirmation flow +- [ ] Test `EndRunModal` — run completion/failure flow +- [ ] Test `GameGrid` — game selection rendering, click handling +- [ ] Test `RulesConfiguration` — rules toggle interactions, state management +- [ ] Test `Layout` — navigation rendering, responsive behavior +- [ ] Test admin form modals (GameFormModal, RouteFormModal, PokemonFormModal) — CRUD form flows +- [ ] Test `AdminTable` — sorting, filtering, action buttons + +## Notes + +- Focus on user-facing behavior, not implementation details +- Use @testing-library/user-event for simulating clicks, typing, etc. +- Mock API responses for components that fetch data +- Don't aim for 100% coverage — prioritise the most complex/interactive components +- Page components (RunEncounters, RunDashboard, etc.) are large and complex — consider testing their sub-components instead \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-9c66--integration-tests-for-genlockes-bosses-api.md b/.beans/nuzlocke-tracker-9c66--integration-tests-for-genlockes-bosses-api.md new file mode 100644 index 0000000..d6087e1 --- /dev/null +++ b/.beans/nuzlocke-tracker-9c66--integration-tests-for-genlockes-bosses-api.md @@ -0,0 +1,30 @@ +--- +# nuzlocke-tracker-9c66 +title: Integration tests for Genlockes & Bosses API +status: draft +type: task +created_at: 2026-02-10T09:33:26Z +updated_at: 2026-02-10T09:33:26Z +parent: nuzlocke-tracker-yzpb +--- + +Write integration tests for the genlocke challenge and boss battle API endpoints. + +## Checklist + +- [ ] Test genlocke CRUD operations (create, list, get, update, delete) +- [ ] Test leg management (add/remove legs to a genlocke) +- [ ] Test Pokemon transfers between genlocke legs +- [ ] Test boss battle CRUD (create, list, update, delete per game) +- [ ] Test boss battle results per run (record win/loss) +- [ ] Test stats endpoint for run statistics +- [ ] Test export endpoint +- [ ] Test error cases (invalid transfers, boss results for wrong game, etc.) + +## Notes + +- Genlocke endpoints: `backend/src/app/api/genlockes.py` +- Boss endpoints: `backend/src/app/api/bosses.py` +- Stats endpoints: `backend/src/app/api/stats.py` +- Export endpoints: `backend/src/app/api/export.py` +- Genlocke tests require multiple runs as fixtures \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-ch77--integration-tests-for-games-routes-api.md b/.beans/nuzlocke-tracker-ch77--integration-tests-for-games-routes-api.md new file mode 100644 index 0000000..f2dc843 --- /dev/null +++ b/.beans/nuzlocke-tracker-ch77--integration-tests-for-games-routes-api.md @@ -0,0 +1,26 @@ +--- +# nuzlocke-tracker-ch77 +title: Integration tests for Games & Routes API +status: draft +type: task +created_at: 2026-02-10T09:33:13Z +updated_at: 2026-02-10T09:33:13Z +parent: nuzlocke-tracker-yzpb +--- + +Write integration tests for the games and routes API endpoints in `backend/src/app/api/games.py`. + +## Checklist + +- [ ] Test CRUD operations for games (create, list, get, update, delete) +- [ ] Test route management within a game (create, list, reorder, update, delete) +- [ ] Test route encounter management (add/remove Pokemon to routes) +- [ ] Test bulk import functionality +- [ ] Test region grouping/filtering +- [ ] Test error cases (404 for missing games, validation errors, duplicate handling) + +## Notes + +- Use the httpx AsyncClient fixture from the test infrastructure task +- Each test should be independent — use fixtures to set up required data +- Test both success and error response codes and bodies \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-d8cp--set-up-frontend-test-infrastructure.md b/.beans/nuzlocke-tracker-d8cp--set-up-frontend-test-infrastructure.md new file mode 100644 index 0000000..462a336 --- /dev/null +++ b/.beans/nuzlocke-tracker-d8cp--set-up-frontend-test-infrastructure.md @@ -0,0 +1,33 @@ +--- +# nuzlocke-tracker-d8cp +title: Set up frontend test infrastructure +status: draft +type: task +priority: normal +created_at: 2026-02-10T09:33:33Z +updated_at: 2026-02-10T09:34:00Z +parent: nuzlocke-tracker-yzpb +blocking: + - nuzlocke-tracker-ee9s + - nuzlocke-tracker-1guz +--- + +Set up the test infrastructure for the React/TypeScript frontend. No testing tooling currently exists. + +## Checklist + +- [ ] Install Vitest, @testing-library/react, @testing-library/jest-dom, @testing-library/user-event, jsdom +- [ ] Configure Vitest in `vite.config.ts` or a dedicated `vitest.config.ts` +- [ ] Set up jsdom as the test environment +- [ ] Create a test setup file (e.g. `src/test/setup.ts`) that imports @testing-library/jest-dom matchers +- [ ] Create test utility helpers (e.g. render wrapper with providers — QueryClientProvider, BrowserRouter) +- [ ] Add a \`test\` script to package.json +- [ ] Verify the setup by writing a simple smoke test +- [ ] Set up MSW (Mock Service Worker) or a similar API mocking strategy for hook/component tests + +## Notes + +- Vitest integrates natively with Vite, which the project already uses +- React Testing Library is the standard for testing React components +- The app uses React Query (TanStack Query) and React Router — the test wrapper needs to provide these contexts +- MSW is recommended for mocking API calls in hook and component tests, but simpler approaches (vi.mock) may suffice initially \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-ee9s--unit-tests-for-frontend-utilities-and-hooks.md b/.beans/nuzlocke-tracker-ee9s--unit-tests-for-frontend-utilities-and-hooks.md new file mode 100644 index 0000000..ecc0e92 --- /dev/null +++ b/.beans/nuzlocke-tracker-ee9s--unit-tests-for-frontend-utilities-and-hooks.md @@ -0,0 +1,31 @@ +--- +# nuzlocke-tracker-ee9s +title: Unit tests for frontend utilities and hooks +status: draft +type: task +created_at: 2026-02-10T09:33:38Z +updated_at: 2026-02-10T09:33:38Z +parent: nuzlocke-tracker-yzpb +--- + +Write unit tests for the frontend utility functions and custom React hooks. + +## Checklist + +- [ ] Test `utils/formatEvolution.ts` — evolution chain formatting logic +- [ ] Test `utils/download.ts` — file download utility +- [ ] Test `hooks/useRuns.ts` — run CRUD hook with mocked API +- [ ] Test `hooks/useGames.ts` — game fetching hook +- [ ] Test `hooks/useEncounters.ts` — encounter operations hook +- [ ] Test `hooks/usePokemon.ts` — pokemon data hook +- [ ] Test `hooks/useGenlockes.ts` — genlocke operations hook +- [ ] Test `hooks/useBosses.ts` — boss operations hook +- [ ] Test `hooks/useStats.ts` — stats fetching hook +- [ ] Test `hooks/useAdmin.ts` — admin operations hook + +## Notes + +- Utility functions are pure functions — straightforward to test +- Hooks wrap React Query — test that they call the right API endpoints, handle loading/error states, and invalidate queries correctly +- Use `@testing-library/react`'s `renderHook` for hook testing +- Mock the API client (from `src/api/`) rather than individual fetch calls \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-hjkk--unit-tests-for-pydantic-schemas-and-model-validati.md b/.beans/nuzlocke-tracker-hjkk--unit-tests-for-pydantic-schemas-and-model-validati.md new file mode 100644 index 0000000..cfd7a6b --- /dev/null +++ b/.beans/nuzlocke-tracker-hjkk--unit-tests-for-pydantic-schemas-and-model-validati.md @@ -0,0 +1,28 @@ +--- +# nuzlocke-tracker-hjkk +title: Unit tests for Pydantic schemas and model validation +status: draft +type: task +created_at: 2026-02-10T09:33:03Z +updated_at: 2026-02-10T09:33:03Z +parent: nuzlocke-tracker-yzpb +--- + +Write unit tests for the Pydantic schemas in `backend/src/app/schemas/`. These are pure validation logic and can be tested without a database. + +## Checklist + +- [ ] Test `CamelModel` base class (snake_case → camelCase alias generation) +- [ ] Test run schemas — creation validation, required fields, optional fields, serialization +- [ ] Test game schemas — validation rules, field constraints +- [ ] Test encounter schemas — status enum validation, field dependencies +- [ ] Test boss schemas — nested model validation +- [ ] Test genlocke schemas — complex nested structures +- [ ] Test stats schemas — response model structure +- [ ] Test evolution schemas — validation of evolution chain data + +## Notes + +- Focus on: valid input acceptance, invalid input rejection, serialization output format +- The `CamelModel` base class does alias generation — verify both input (camelCase) and output (camelCase) work +- Test edge cases like empty strings, negative numbers, missing required fields \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-iam7--unit-tests-for-services-layer.md b/.beans/nuzlocke-tracker-iam7--unit-tests-for-services-layer.md new file mode 100644 index 0000000..d8b542a --- /dev/null +++ b/.beans/nuzlocke-tracker-iam7--unit-tests-for-services-layer.md @@ -0,0 +1,24 @@ +--- +# nuzlocke-tracker-iam7 +title: Unit tests for services layer +status: draft +type: task +created_at: 2026-02-10T09:33:08Z +updated_at: 2026-02-10T09:33:08Z +parent: nuzlocke-tracker-yzpb +--- + +Write unit tests for the business logic in `backend/src/app/services/`. Currently this is the `families.py` service which handles Pokemon evolution family resolution. + +## Checklist + +- [ ] Test family resolution with simple linear evolution chains (e.g. A → B → C) +- [ ] Test family resolution with branching evolutions (e.g. Eevee) +- [ ] Test family resolution with region-specific evolutions +- [ ] Test edge cases: single-stage Pokemon, circular references (if possible), missing data + +## Notes + +- `services/families.py` contains the core logic for resolving Pokemon evolution families +- These tests may need mock database sessions or in-memory data depending on how the service queries data +- If the service methods take a DB session, mock it; if they operate on data objects, pass test data directly \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-rrcf--set-up-backend-test-infrastructure.md b/.beans/nuzlocke-tracker-rrcf--set-up-backend-test-infrastructure.md new file mode 100644 index 0000000..c0f8465 --- /dev/null +++ b/.beans/nuzlocke-tracker-rrcf--set-up-backend-test-infrastructure.md @@ -0,0 +1,36 @@ +--- +# nuzlocke-tracker-rrcf +title: Set up backend test infrastructure +status: draft +type: task +priority: normal +created_at: 2026-02-10T09:32:57Z +updated_at: 2026-02-10T09:33:59Z +parent: nuzlocke-tracker-yzpb +blocking: + - nuzlocke-tracker-hjkk + - nuzlocke-tracker-iam7 + - nuzlocke-tracker-ch77 + - nuzlocke-tracker-ugb7 + - nuzlocke-tracker-0arz + - nuzlocke-tracker-9c66 +--- + +Set up the foundational test infrastructure for the FastAPI backend so that all subsequent test tasks can build on it. + +## Checklist + +- [ ] Create `backend/tests/conftest.py` with shared fixtures +- [ ] Set up a test database strategy (use a separate test PostgreSQL database or SQLite for speed — evaluate trade-offs) +- [ ] Create an async test client fixture using `httpx.AsyncClient` with the FastAPI `app` +- [ ] Create a database session fixture that creates/drops tables per test session or uses transactions for isolation +- [ ] Add factory fixtures or helpers for creating common test entities (games, pokemon, runs, etc.) +- [ ] Verify the setup works by writing a simple smoke test (e.g. health endpoint returns 200) +- [ ] Document how to run tests (e.g. `pytest` from backend dir, any env vars needed) + +## Notes + +- pytest, pytest-asyncio, and httpx are already in pyproject.toml dev dependencies +- AsyncIO mode is set to "auto" in pyproject.toml +- The app uses SQLAlchemy async with asyncpg — test fixtures need to handle async session management +- Consider using `SAVEPOINT`-based transaction rollback for test isolation (faster than recreating tables) \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-ugb7--integration-tests-for-pokemon-evolutions-api.md b/.beans/nuzlocke-tracker-ugb7--integration-tests-for-pokemon-evolutions-api.md new file mode 100644 index 0000000..b2b2b95 --- /dev/null +++ b/.beans/nuzlocke-tracker-ugb7--integration-tests-for-pokemon-evolutions-api.md @@ -0,0 +1,25 @@ +--- +# nuzlocke-tracker-ugb7 +title: Integration tests for Pokemon & Evolutions API +status: draft +type: task +created_at: 2026-02-10T09:33:16Z +updated_at: 2026-02-10T09:33:16Z +parent: nuzlocke-tracker-yzpb +--- + +Write integration tests for the Pokemon and evolutions API endpoints. + +## Checklist + +- [ ] Test Pokemon CRUD operations (create, list, search, update, delete) +- [ ] Test Pokemon filtering and search +- [ ] Test evolution chain CRUD (create, list, get, update, delete) +- [ ] Test evolution family resolution endpoint +- [ ] Test error cases (invalid Pokemon references, circular evolutions, etc.) + +## Notes + +- Pokemon endpoints are in `backend/src/app/api/pokemon.py` +- Evolution endpoints are in `backend/src/app/api/evolutions.py` +- Evolution tests should cover multi-stage and branching chains \ No newline at end of file diff --git a/.beans/nuzlocke-tracker-yzpb--implement-unit-integration-tests.md b/.beans/nuzlocke-tracker-yzpb--implement-unit-integration-tests.md new file mode 100644 index 0000000..6f7cd60 --- /dev/null +++ b/.beans/nuzlocke-tracker-yzpb--implement-unit-integration-tests.md @@ -0,0 +1,27 @@ +--- +# nuzlocke-tracker-yzpb +title: Implement Unit & Integration Tests +status: draft +type: epic +created_at: 2026-02-10T09:32:47Z +updated_at: 2026-02-10T09:32:47Z +--- + +Add comprehensive unit and integration test coverage to both the backend (FastAPI/Python) and frontend (React/TypeScript). The project currently has zero tests — pytest is configured in pyproject.toml with pytest-asyncio and httpx, but no actual test files exist. The frontend has no test tooling at all. + +**Scope:** +- Unit tests for isolated logic (schemas, services, utilities) +- Integration tests for API endpoints (using httpx AsyncClient against a test database) +- Frontend unit/component tests (using Vitest + React Testing Library) + +**Explicitly out of scope:** +- End-to-end / browser tests (e.g. Selenium, Playwright) — requires specialised infrastructure + +## Success Criteria + +- [ ] Backend test infrastructure is set up (conftest, fixtures, test DB) +- [ ] Backend schemas and services have unit test coverage +- [ ] Backend API endpoints have integration test coverage +- [ ] Frontend test infrastructure is set up (Vitest, RTL) +- [ ] Frontend utilities and hooks have unit test coverage +- [ ] Frontend components have basic render/interaction tests \ No newline at end of file