diff --git a/Docs/runner.csx b/Docs/runner.csx index 45ae2a1..900b17e 100644 --- a/Docs/runner.csx +++ b/Docs/runner.csx @@ -24,7 +24,7 @@ Console.CancelKeyPress += (_, e) => // ── Paths ───────────────────────────────────────────────────────────────────── var repoRoot = Directory.GetCurrentDirectory(); -var tasksFile = Path.Combine(repoRoot, "Docs", "Tasks.md"); +var tasksFile = Path.Combine(repoRoot, "Docs", "tasks.md"); if (!File.Exists(tasksFile)) { @@ -102,7 +102,7 @@ for (int i = 0; i < items.Count; i++) // Step 1 — run the task prompt await RunCopilot(Enumerable.Empty(), $"/caveman full"); - await RunCopilot(new[] { "--continue" }, $"read ./Docs/instructions.md. {item}"); + await RunCopilot(new[] { "--continue" }, $"{item}"); if (cts.IsCancellationRequested) break; // Step 2 — confirm completion in the same chat session diff --git a/Docs/tasks.md b/Docs/tasks.md index e69de29..4fd8b19 100644 --- a/Docs/tasks.md +++ b/Docs/tasks.md @@ -0,0 +1,2075 @@ + +## Global / Infrastructure Issues + +### Task INFRA-1: Fix Server Startup in Robot Framework Suite Setup + +- **Failing Step**: `Suite Setup → Start Aniworld Server → Wait For Server` +- **Failure Message**: `Server did not become healthy within 30 seconds` +- **Files to Check**: + - `tests/robot/resources/common.resource` (keywords: `Start Aniworld Server`, `Wait For Server`) + - `tests/robot/run.sh` + - `tests/robot/__init__.robot` +- **Reference Docs**: + - `Docs/TESTING.md` + - `Docs/API.md` §1 (Base URL and Versioning) +- **Expected Behavior**: + - The suite setup should start the FastAPI uvicorn server on `127.0.0.1:8765`. + - The `Wait For Server` keyword should poll `/health` and receive HTTP 200 within 30 seconds. + - The server process should remain running for the duration of the test suite. +- **Actual Behavior**: + - The server process likely fails to start because the active Python environment (`base` conda env, Python 3.13.5) does not have the project's dependencies installed. + - `run.sh` invokes plain `python`, which resolves to the base environment instead of the project's `AniWorld` conda environment. +- **Suggested Fix**: + - Update `tests/robot/resources/common.resource` to start the server with `conda run -n AniWorld python -m uvicorn ...` instead of plain `python -m uvicorn`. + - Alternatively, ensure the `AniWorld` conda environment is activated before running `tests/robot/run.sh`. + +--- + +### Task INFRA-2: Fix Suite Teardown — Close Browser Keyword Argument Mismatch + +- **Failing Step**: `Suite Teardown → Close Browser` +- **Failure Message**: `Keyword 'common.Close Browser' expected 0 arguments, got 1` +- **Files to Check**: + - `tests/robot/__init__.robot` + - `tests/robot/resources/common.resource` + - `tests/robot/resources/ui_keywords.resource` +- **Reference Docs**: + - `Docs/TESTING.md` +- **Expected Behavior**: + - The suite teardown should cleanly close the browser and stop the server without errors. +- **Actual Behavior**: + - The `Close Browser` keyword is being called with an argument (likely `${BROWSER}` or similar), but the keyword definition expects 0 arguments. +- **Suggested Fix**: + - Review `__init__.robot` line: `Close Browser` — remove any passed arguments. + - Or, if a custom wrapper keyword is intended, define it in `ui_keywords.resource` and call that instead. + +--- + +## API Tests — `Robot.Api.Anime` (14 tests, 0 passed, 14 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-ANIME-1: Get Anime Library Status + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `tests/robot/resources/common.resource` + - `tests/robot/resources/api_keywords.resource` + - `src/server/controllers/anime_controller.py` (or equivalent) +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/anime/status` returns HTTP 200 with JSON containing `directory` and `series_count`. + +--- + +### Task API-ANIME-2: Rescan Library + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/anime/rescan` returns HTTP 200, triggering a library rescan. + +--- + +### Task API-ANIME-3: Scan Status During Idle + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/anime/scan-status` returns HTTP 200 with `in_progress: False` when idle. + +--- + +### Task API-ANIME-4: Search Anime + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/anime/search?q=attack` returns HTTP 200 with valid JSON search results. + +--- + +### Task API-ANIME-5: Add New Series + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/anime/` with payload `{url, name, year}` returns HTTP 201 and a `key` in the response. + +--- + +### Task API-ANIME-6: Get Series Details + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/anime/{key}` returns HTTP 200 with `key`, `name`, `folder`, `episodes`. + +--- + +### Task API-ANIME-7: Update Series Settings + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `PUT /api/anime/{key}/settings` returns HTTP 200 and persists settings like `preferred_language`. + +--- + +### Task API-ANIME-8: Get Series Episodes + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/anime/{key}/episodes` returns HTTP 200 with valid JSON episode list. + +--- + +### Task API-ANIME-9: Delete Series + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `DELETE /api/anime/{key}` returns HTTP 200. + - Subsequent `GET /api/anime/{key}` returns HTTP 404. + +--- + +### Task API-ANIME-10: List All Series + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/anime/` returns HTTP 200 with valid JSON list. + +--- + +### Task API-ANIME-11: List Missing Episodes Only + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/anime/?filter=missing` returns HTTP 200 with series that have missing episodes. + +--- + +### Task API-ANIME-12: List No Episodes + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/anime/?filter=no_episodes` returns HTTP 200 with series having zero episodes. + +--- + +### Task API-ANIME-13: Duplicate Folders Detection + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Endpoint returns duplicate folder groups if any exist. + +--- + +### Task API-ANIME-14: Regenerate NFO For Series + +- **Test File**: `tests/robot/api/anime.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/anime.robot` + - `src/server/controllers/anime_controller.py` + - `src/server/services/nfo_service.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/NFO_GUIDE.md` +- **Expected Behavior**: + - `POST /api/anime/{key}/regenerate-nfo` returns HTTP 200 and triggers NFO regeneration. + +--- + +## API Tests — `Robot.Api.Auth` (12 tests, 0 passed, 12 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-AUTH-1: Setup Master Password + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `tests/robot/resources/common.resource` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/auth/setup` with `{master_password, anime_directory, name, ...}` returns HTTP 201. + - Subsequent auth status shows `configured: True`. + +--- + +### Task API-AUTH-2: Setup Rejects Weak Password + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/auth/setup` with weak password returns HTTP 400. + +--- + +### Task API-AUTH-3: Setup Rejects Duplicate + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Second `POST /api/auth/setup` returns HTTP 400 when already configured. + +--- + +### Task API-AUTH-4: Login With Valid Password + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/auth/login` with correct password returns HTTP 200 and a JWT `access_token`. + +--- + +### Task API-AUTH-5: Login With Invalid Password + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/auth/login` with wrong password returns HTTP 401. + +--- + +### Task API-AUTH-6: Login Rate Limiting + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` + - `src/server/middleware/rate_limiter.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - After 6 failed login attempts, subsequent attempts return HTTP 429 (or remain 401 depending on implementation). + +--- + +### Task API-AUTH-7: Auth Status Unconfigured + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/auth/status` before setup returns `configured: False`. + +--- + +### Task API-AUTH-8: Auth Status Configured Unauthenticated + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/auth/status` after setup but without token returns `configured: True`, `authenticated: False`. + +--- + +### Task API-AUTH-9: Auth Status Authenticated + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/auth/status` with valid Bearer token returns `authenticated: True`. + +--- + +### Task API-AUTH-10: Logout + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/controllers/auth_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/auth/logout` with valid token returns HTTP 200 and invalidates the token. + +--- + +### Task API-AUTH-11: Protected Endpoint Without Auth + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/middleware/auth.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Accessing a protected endpoint without a token returns HTTP 401 or 403. + +--- + +### Task API-AUTH-12: Protected Endpoint With Auth + +- **Test File**: `tests/robot/api/auth.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/auth.robot` + - `src/server/middleware/auth.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Accessing a protected endpoint with a valid Bearer token returns HTTP 200. + +--- + +## API Tests — `Robot.Api.Config` (10 tests, 0 passed, 10 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-CONFIG-1: Get Default Config + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `GET /api/config` returns HTTP 200 with keys: `name`, `data_dir`, `scheduler`, `logging`, `backup`, `nfo`. + +--- + +### Task API-CONFIG-2: Update Config + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `PUT /api/config` updates fields and returns HTTP 200. Persisted values are reflected on subsequent GET. + +--- + +### Task API-CONFIG-3: Validate Valid Config + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `POST /api/config/validate` with well-formed config returns HTTP 200 and `valid: True`. + +--- + +### Task API-CONFIG-4: Validate Invalid Config Missing Name + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `POST /api/config/validate` missing required `name` field returns HTTP 422. + +--- + +### Task API-CONFIG-5: Validate Invalid Schedule Time + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `POST /api/config/validate` with `schedule_time: 25:00` returns HTTP 422. + +--- + +### Task API-CONFIG-6: Validate Invalid Log Level + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `POST /api/config/validate` with `logging.level: INVALID` returns HTTP 422. + +--- + +### Task API-CONFIG-7: Config Backup Create + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `POST /api/config/backup` creates a backup and returns HTTP 200. + +--- + +### Task API-CONFIG-8: Config Backup List + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `GET /api/config/backups` returns HTTP 200 with a list of backups. + +--- + +### Task API-CONFIG-9: Config Backup Restore + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `POST /api/config/restore` restores a selected backup and returns HTTP 200. + +--- + +### Task API-CONFIG-10: Config Backup Delete + +- **Test File**: `tests/robot/api/config.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/config.robot` + - `src/server/controllers/config_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `DELETE /api/config/backup/{id}` removes the backup and returns HTTP 200. + +--- + +## API Tests — `Robot.Api.Download` (12 tests, 0 passed, 12 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-DL-1: Get Empty Queue Status + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/download/queue` returns HTTP 200 with `status`, `statistics`, and `pending: 0`. + +--- + +### Task API-DL-2: Add Episodes To Queue + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/queue` with episode list returns HTTP 201 and `item_ids`. + +--- + +### Task API-DL-3: Start Queue + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/start` returns HTTP 200 and begins processing. + +--- + +### Task API-DL-4: Stop Queue + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/stop` returns HTTP 200 and halts processing. + +--- + +### Task API-DL-5: Pause Queue + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/pause` returns HTTP 200 and pauses processing. + +--- + +### Task API-DL-6: Resume Queue + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/resume` returns HTTP 200 and resumes processing. + +--- + +### Task API-DL-7: Clear Completed Downloads + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/clear/completed` returns HTTP 200 and removes completed items. + +--- + +### Task API-DL-8: Clear Failed Downloads + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/clear/failed` returns HTTP 200 and removes failed items. + +--- + +### Task API-DL-9: Clear Pending Downloads + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/clear/pending` returns HTTP 200 and removes pending items. + +--- + +### Task API-DL-10: Remove Item From Queue + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `DELETE /api/download/queue/{item_id}` returns HTTP 200 and removes the specific item. + +--- + +### Task API-DL-11: Retry Failed Item + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/download/retry/{item_id}` returns HTTP 200 and re-queues the failed item. + +--- + +### Task API-DL-12: Queue Statistics Accuracy + +- **Test File**: `tests/robot/api/download.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/download.robot` + - `src/server/controllers/download_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/download/queue` statistics reflect the actual state of pending, active, completed, and failed items. + +--- + +## API Tests — `Robot.Api.Health` (2 tests, 0 passed, 2 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-HEALTH-1: Basic Health Check + +- **Test File**: `tests/robot/api/health.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/health.robot` + - `src/server/controllers/health_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /health` returns HTTP 200 with `status: healthy`. + +--- + +### Task API-HEALTH-2: Detailed Health Check + +- **Test File**: `tests/robot/api/health.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/health.robot` + - `src/server/controllers/health_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /health/detailed` returns HTTP 200 with `status`, `version`, `uptime`, `memory`, `cpu`. + +--- + +## API Tests — `Robot.Api.Logging` (6 tests, 0 passed, 6 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-LOG-1: Get Logging Config + +- **Test File**: `tests/robot/api/logging.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/logging.robot` + - `src/server/controllers/logging_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/InstructionsLogging.md` +- **Expected Behavior**: + - `GET /api/logging/config` returns HTTP 200 with `level`, `file`, `max_bytes`, `backup_count`. + +--- + +### Task API-LOG-2: List Log Files + +- **Test File**: `tests/robot/api/logging.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/logging.robot` + - `src/server/controllers/logging_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/InstructionsLogging.md` +- **Expected Behavior**: + - `GET /api/logging/files` returns HTTP 200 with a list of available log files. + +--- + +### Task API-LOG-3: Tail Log File + +- **Test File**: `tests/robot/api/logging.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/logging.robot` + - `src/server/controllers/logging_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/InstructionsLogging.md` +- **Expected Behavior**: + - `GET /api/logging/tail/{filename}` returns HTTP 200 with the tail contents of the log file. + +--- + +### Task API-LOG-4: Download Log File + +- **Test File**: `tests/robot/api/logging.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/logging.robot` + - `src/server/controllers/logging_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/InstructionsLogging.md` +- **Expected Behavior**: + - `GET /api/logging/download/{filename}` returns HTTP 200 with `Content-Type: application/octet-stream`. + +--- + +### Task API-LOG-5: Write Test Log Messages + +- **Test File**: `tests/robot/api/logging.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/logging.robot` + - `src/server/controllers/logging_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/InstructionsLogging.md` +- **Expected Behavior**: + - `POST /api/logging/test` writes test messages at various levels and returns HTTP 200. + +--- + +### Task API-LOG-6: Cleanup Old Logs + +- **Test File**: `tests/robot/api/logging.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/logging.robot` + - `src/server/controllers/logging_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/InstructionsLogging.md` +- **Expected Behavior**: + - `DELETE /api/logging/cleanup` deletes old log files and returns HTTP 200. + +--- + +## API Tests — `Robot.Api.Nfo` (4 tests, 0 passed, 4 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-NFO-1: Get NFO Diagnostics + +- **Test File**: `tests/robot/api/nfo.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/nfo.robot` + - `src/server/controllers/nfo_controller.py` + - `src/server/services/nfo_service.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/NFO_GUIDE.md` +- **Expected Behavior**: + - `GET /api/nfo/diagnostics/{series_key}` returns HTTP 200 with diagnostic info. + +--- + +### Task API-NFO-2: Repair NFO For Series + +- **Test File**: `tests/robot/api/nfo.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/nfo.robot` + - `src/server/controllers/nfo_controller.py` + - `src/server/services/nfo_service.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/NFO_GUIDE.md` +- **Expected Behavior**: + - `POST /api/nfo/repair/{series_key}` returns HTTP 200 and regenerates NFO files. + +--- + +### Task API-NFO-3: List Series Needing Repair + +- **Test File**: `tests/robot/api/nfo.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/nfo.robot` + - `src/server/controllers/nfo_controller.py` + - `src/server/services/nfo_service.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/NFO_GUIDE.md` +- **Expected Behavior**: + - `GET /api/nfo/needs-repair` returns HTTP 200 with `total` and `series` list. + +--- + +### Task API-NFO-4: Run NFO Scan + +- **Test File**: `tests/robot/api/nfo.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/nfo.robot` + - `src/server/controllers/nfo_controller.py` + - `src/server/services/nfo_service.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/NFO_GUIDE.md` +- **Expected Behavior**: + - `POST /api/nfo/scan` returns HTTP 200 with `total`, `created`, `updated`, `errors_count`, `duration_seconds`. + +--- + +## API Tests — `Robot.Api.Scheduler` (6 tests, 0 passed, 6 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-SCHED-1: Get Scheduler Config + +- **Test File**: `tests/robot/api/scheduler.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/scheduler.robot` + - `src/server/controllers/scheduler_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `GET /api/scheduler/config` returns HTTP 200 with `success`, `config` (enabled, interval_minutes, schedule_time, schedule_days, auto_download_after_rescan), and `status` (is_running, next_run, last_run, scan_in_progress). + +--- + +### Task API-SCHED-2: Update Scheduler Config + +- **Test File**: `tests/robot/api/scheduler.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/scheduler.robot` + - `src/server/controllers/scheduler_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `PUT /api/scheduler/config` updates settings and returns HTTP 200 with persisted values. + +--- + +### Task API-SCHED-3: Trigger Manual Rescan + +- **Test File**: `tests/robot/api/scheduler.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/scheduler.robot` + - `src/server/controllers/scheduler_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `POST /api/scheduler/trigger` returns HTTP 200 with `success: True`. + +--- + +### Task API-SCHED-4: Invalid Schedule Time + +- **Test File**: `tests/robot/api/scheduler.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/scheduler.robot` + - `src/server/controllers/scheduler_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `PUT /api/scheduler/config` with `schedule_time: 25:00` returns HTTP 422. + +--- + +### Task API-SCHED-5: Invalid Schedule Days + +- **Test File**: `tests/robot/api/scheduler.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/scheduler.robot` + - `src/server/controllers/scheduler_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `PUT /api/scheduler/config` with `schedule_days: ['monday', 'tuesday']` returns HTTP 422. + +--- + +### Task API-SCHED-6: Empty Schedule Days + +- **Test File**: `tests/robot/api/scheduler.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/scheduler.robot` + - `src/server/controllers/scheduler_controller.py` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - `PUT /api/scheduler/config` with `schedule_days: []` returns HTTP 200 (empty list accepted). + +--- + +## API Tests — `Robot.Api.Setup` (3 tests, 0 passed, 3 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-SETUP-1: List Unresolved Folders + +- **Test File**: `tests/robot/api/setup.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/setup.robot` + - `src/server/controllers/setup_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/setup/unresolved` returns HTTP 200 with a list of unresolved folders. + +--- + +### Task API-SETUP-2: Get Unresolved Folder Details + +- **Test File**: `tests/robot/api/setup.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/setup.robot` + - `src/server/controllers/setup_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `GET /api/setup/unresolved/{folder}` returns HTTP 200 with folder details. + +--- + +### Task API-SETUP-3: Resolve Folder With Provider Key + +- **Test File**: `tests/robot/api/setup.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/setup.robot` + - `src/server/controllers/setup_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `POST /api/setup/resolve` with `{folder, provider_key}` returns HTTP 200 and maps the folder. + +--- + +## API Tests — `Robot.Api.Websocket` (4 tests, 0 passed, 4 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task API-WS-1: Connect To WebSocket + +- **Test File**: `tests/robot/api/websocket.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/websocket.robot` + - `src/server/controllers/websocket_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `ws://127.0.0.1:8765/ws/connect?token={jwt}` establishes a WebSocket connection. +- **Note**: + - Test currently uses `Pass Execution` placeholder because a custom keyword library is needed for full WebSocket testing. + +--- + +### Task API-WS-2: Subscribe To Rooms + +- **Test File**: `tests/robot/api/websocket.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/websocket.robot` + - `src/server/controllers/websocket_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Client can subscribe to rooms: `downloads`, `queue`, `scan`, `system`. +- **Note**: + - Test currently uses `Pass Execution` placeholder. + +--- + +### Task API-WS-3: Receive Ping Pong + +- **Test File**: `tests/robot/api/websocket.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/websocket.robot` + - `src/server/controllers/websocket_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Server sends periodic ping/pong heartbeat messages. +- **Note**: + - Test currently uses `Pass Execution` placeholder. + +--- + +### Task API-WS-4: Receive System Notification + +- **Test File**: `tests/robot/api/websocket.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/api/websocket.robot` + - `src/server/controllers/websocket_controller.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Triggering an action emits a system message over WebSocket. +- **Note**: + - Test currently uses `Pass Execution` placeholder. + +--- + +## UI Tests — `Robot.Ui.Anime Settings` (3 tests, 0 passed, 3 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task UI-ANIME-1: Anime Settings Page Loads + +- **Test File**: `tests/robot/ui/anime_settings.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/anime_settings.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/templates/anime_settings.html` (or equivalent) +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Navigating to `/anime/settings?key=attack-on-titan` loads the settings form with `regenerate-nfo-btn` and `save-anime-settings-btn` visible. + +--- + +### Task UI-ANIME-2: Regenerate NFO + +- **Test File**: `tests/robot/ui/anime_settings.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/anime_settings.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/anime_settings.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/NFO_GUIDE.md` +- **Expected Behavior**: + - Clicking `#regenerate-nfo-btn` triggers an API call and displays a toast containing "NFO". + +--- + +### Task UI-ANIME-3: Update Series Settings + +- **Test File**: `tests/robot/ui/anime_settings.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/anime_settings.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/anime_settings.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Changing `preferred-language-select` and `custom-folder-input`, then clicking `#save-anime-settings-btn`, saves settings and shows a toast containing "saved". + +--- + +## UI Tests — `Robot.Ui.Dashboard` (11 tests, 0 passed, 11 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task UI-DASH-1: Dashboard Loads + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/templates/index.html` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Dashboard page title contains "AniWorld" and shows `search-input`, `search-btn`, `rescan-btn`, `theme-toggle`, `config-btn`. + +--- + +### Task UI-DASH-2: Search For Anime + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/dashboard.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Typing "attack" in `search-input` and submitting shows `search-results-list`. + +--- + +### Task UI-DASH-3: Clear Search + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/dashboard.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking clear search hides `search-results`. + +--- + +### Task UI-DASH-4: Theme Toggle To Dark + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/theme.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#theme-toggle` switches the theme to `dark`. + +--- + +### Task UI-DASH-5: Theme Toggle To Light + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/theme.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#theme-toggle` twice returns the theme to `light`. + +--- + +### Task UI-DASH-6: Theme Persists After Reload + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/theme.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - After toggling to dark and reloading, the theme remains `dark` (persisted in localStorage or cookie). + +--- + +### Task UI-DASH-7: Rescan Button + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/dashboard.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#rescan-btn` triggers a rescan and shows `#rescan-status .status-dot.scanning`. + +--- + +### Task UI-DASH-8: Show Missing Episodes Only + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/dashboard.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#show-missing-only` sets `data-active="true"` on the button. + +--- + +### Task UI-DASH-9: Show All Series + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/dashboard.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#show-all-series` sets `data-active="true"` on the button. + +--- + +### Task UI-DASH-10: Select All Series + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/dashboard.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#select-all` checks all series checkboxes. + +--- + +### Task UI-DASH-11: Download Selected + +- **Test File**: `tests/robot/ui/dashboard.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/dashboard.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/dashboard.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Selecting a series and clicking download-selected triggers a download request. + +--- + +## UI Tests — `Robot.Ui.Login` (6 tests, 0 passed, 6 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task UI-LOGIN-1: Login Page Loads + +- **Test File**: `tests/robot/ui/login.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/login.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/templates/login.html` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `/login` page title contains "Login" and shows `password-input`, `login-submit-btn`, `password-toggle`. + +--- + +### Task UI-LOGIN-2: Login With Valid Password + +- **Test File**: `tests/robot/ui/login.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/login.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/login.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Submitting the correct password redirects to the dashboard (title contains "AniWorld", `search-input` visible). + +--- + +### Task UI-LOGIN-3: Login With Invalid Password + +- **Test File**: `tests/robot/ui/login.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/login.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/login.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Submitting a wrong password shows `#login-error` containing "invalid". + +--- + +### Task UI-LOGIN-4: Login Rate Limit UI + +- **Test File**: `tests/robot/ui/login.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/login.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/login.js` + - `src/server/middleware/rate_limiter.py` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - After 6 failed attempts, the UI shows `#login-error` containing "lockout". + +--- + +### Task UI-LOGIN-5: Password Visibility Toggle + +- **Test File**: `tests/robot/ui/login.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/login.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/login.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#password-toggle` changes `password-input` type from `password` to `text` and back. + +--- + +### Task UI-LOGIN-6: Logout + +- **Test File**: `tests/robot/ui/login.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/login.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/login.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Logging out redirects to `/login` (title contains "Login", `password-input` visible). + +--- + +## UI Tests — `Robot.Ui.Queue Page` (8 tests, 0 passed, 8 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task UI-QUEUE-1: Queue Page Loads + +- **Test File**: `tests/robot/ui/queue_page.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/queue_page.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/templates/queue.html` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `/queue` page title contains "Queue" and shows stat cards (`total-items`, `pending-items`, `completed-items`, `failed-items`) and queue sections (`pending-queue`, `active-downloads`, `completed-downloads`, `failed-downloads`). + +--- + +### Task UI-QUEUE-2: Queue Stats Cards Display Zero Initially + +- **Test File**: `tests/robot/ui/queue_page.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/queue_page.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/queue.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - When the queue is empty, all stat cards display `0`. + +--- + +### Task UI-QUEUE-3: Start Queue Button + +- **Test File**: `tests/robot/ui/queue_page.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/queue_page.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/queue.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#start-queue-btn` (when not disabled) changes the UI to show `#stop-queue-btn`. + +--- + +### Task UI-QUEUE-4: Stop Queue Button + +- **Test File**: `tests/robot/ui/queue_page.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/queue_page.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/queue.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#stop-queue-btn` (when not disabled) changes the UI to show `#start-queue-btn`. + +--- + +### Task UI-QUEUE-5: Clear Completed Confirmation + +- **Test File**: `tests/robot/ui/queue_page.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/queue_page.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/queue.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#clear-completed-btn` opens `#confirm-modal` containing "clear". Canceling hides the modal. + +--- + +### Task UI-QUEUE-6: Clear Failed Confirmation + +- **Test File**: `tests/robot/ui/queue_page.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/queue_page.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/queue.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#clear-failed-btn` opens `#confirm-modal` containing "clear". Canceling hides the modal. + +--- + +### Task UI-QUEUE-7: Retry All Failed + +- **Test File**: `tests/robot/ui/queue_page.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/queue_page.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/queue.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking `#retry-all-btn` (when not disabled) shows a toast containing "retry". + +--- + +### Task UI-QUEUE-8: Navigation Back To Main + +- **Test File**: `tests/robot/ui/queue_page.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/queue_page.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/templates/queue.html` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Clicking the back button navigates to the main dashboard. + +--- + +## UI Tests — `Robot.Ui.Responsive` (5 tests, 0 passed, 5 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task UI-RESP-1: Mobile Viewport Layout + +- **Test File**: `tests/robot/ui/responsive.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/responsive.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/css/responsive.css` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - At mobile viewport (`<= 480px`), layout adapts and `search-input`, `theme-toggle` remain visible. + +--- + +### Task UI-RESP-2: Mobile Menu Accessible + +- **Test File**: `tests/robot/ui/responsive.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/responsive.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/css/responsive.css` + - `src/server/web/static/js/responsive.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - On mobile, `#mobile-menu-btn` is visible and clicking it shows `#mobile-menu`. + +--- + +### Task UI-RESP-3: Tablet Viewport Layout + +- **Test File**: `tests/robot/ui/responsive.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/responsive.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/css/responsive.css` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - At tablet viewport (`>= 768px`), layout adapts and `search-input`, `rescan-btn` remain visible. + +--- + +### Task UI-RESP-4: Touch Buttons Clickable + +- **Test File**: `tests/robot/ui/responsive.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/responsive.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/css/responsive.css` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - On mobile viewport, `#theme-toggle` remains clickable and toggles the theme correctly. + +--- + +### Task UI-RESP-5: Desktop Viewport Reset + +- **Test File**: `tests/robot/ui/responsive.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/responsive.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/css/responsive.css` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - At desktop viewport (`>= 1280px`), `search-input`, `rescan-btn`, `config-btn` are all visible. + +--- + +## UI Tests — `Robot.Ui.Settings Modal` (15 tests, 0 passed, 15 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task UI-SETTINGS-1: Open Settings Modal + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Clicking `#config-btn` opens `#config-modal`. + +--- + +### Task UI-SETTINGS-2: Close Settings Modal Via Button + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Clicking the close button hides `#config-modal`. + +--- + +### Task UI-SETTINGS-3: Close Settings Modal Via Overlay + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Clicking `#config-modal .modal-overlay` hides `#config-modal`. + +--- + +### Task UI-SETTINGS-4: Close Settings Modal Via Escape + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Pressing `Escape` while `#config-modal` is focused hides the modal. + +--- + +### Task UI-SETTINGS-5: Edit General Settings + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Changing app name, data dir, and anime directory, then saving, shows a toast containing "saved". + +--- + +### Task UI-SETTINGS-6: Edit Scheduler Settings + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Enabling scheduler, setting time to `04:30`, selecting days, and saving shows a toast containing "saved". + +--- + +### Task UI-SETTINGS-7: Disable Scheduler + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Unchecking `#scheduled-rescan-enabled` and saving shows a toast containing "saved". + +--- + +### Task UI-SETTINGS-8: Edit Logging Settings + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` + - `Docs/InstructionsLogging.md` +- **Expected Behavior**: + - Changing log level to DEBUG, file path, max bytes, backup count, and saving shows a toast containing "saved". + +--- + +### Task UI-SETTINGS-9: Edit Backup Settings + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Enabling backup, setting path and retention days, and saving shows a toast containing "saved". + +--- + +### Task UI-SETTINGS-10: Edit NFO Settings + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` + - `Docs/NFO_GUIDE.md` +- **Expected Behavior**: + - Entering TMDB key, enabling auto-create, poster/logo/fanart downloads, and saving shows a toast containing "saved". + +--- + +### Task UI-SETTINGS-11: Create Config Backup + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Clicking `#create-backup-btn` shows a toast containing "backup". + +--- + +### Task UI-SETTINGS-12: Restore Config Backup + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Selecting a `.backup-item` and clicking `#restore-backup-btn` shows a toast containing "restore". + +--- + +### Task UI-SETTINGS-13: Delete Config Backup + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Selecting a `.backup-item` and clicking `#delete-backup-btn` shows a toast containing "delete". + +--- + +### Task UI-SETTINGS-14: Export Config + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Clicking `#export-config-btn` triggers a file download event. + +--- + +### Task UI-SETTINGS-15: Import Config + +- **Test File**: `tests/robot/ui/settings_modal.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/settings_modal.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/settings_modal.js` + - `tests/robot/fixtures/sample_config.json` +- **Reference Docs**: + - `Docs/API.md` + - `Docs/CONFIGURATION.md` +- **Expected Behavior**: + - Uploading a config file via `#import-config-input` and clicking `#import-config-btn` shows a toast containing "import". + +--- + +## UI Tests — `Robot.Ui.Setup Flow` (8 tests, 0 passed, 8 failed) + +> **Parent Suite Setup Failed**: `Server did not become healthy within 30 seconds` + +### Task UI-SETUP-1: Setup Page Loads + +- **Test File**: `tests/robot/ui/setup_flow.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/setup_flow.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/templates/setup.html` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - `/setup` page title contains "Setup" and shows `setup-form`, `general-section`, `security-section`, `scheduler-section`, `logging-section`, `backup-section`, `nfo-section`. + +--- + +### Task UI-SETUP-2: Password Strength Weak + +- **Test File**: `tests/robot/ui/setup_flow.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/setup_flow.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/setup.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Typing "weak" in `#master-password-input` shows `#password-strength` containing "weak". + +--- + +### Task UI-SETUP-3: Password Strength Medium + +- **Test File**: `tests/robot/ui/setup_flow.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/setup_flow.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/setup.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Typing "Medium1!" in `#master-password-input` shows `#password-strength` containing "medium". + +--- + +### Task UI-SETUP-4: Password Strength Strong + +- **Test File**: `tests/robot/ui/setup_flow.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/setup_flow.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/setup.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Typing a strong password in `#master-password-input` shows `#password-strength` containing "strong". + +--- + +### Task UI-SETUP-5: Setup Form Validation Empty Password + +- **Test File**: `tests/robot/ui/setup_flow.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/setup_flow.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/setup.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Submitting setup with empty password shows `#password-error` containing "required". + +--- + +### Task UI-SETUP-6: Setup Form Validation Mismatched Passwords + +- **Test File**: `tests/robot/ui/setup_flow.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/setup_flow.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/setup.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Submitting with mismatched password and confirmation shows `#confirm-password-error` containing "match". + +--- + +### Task UI-SETUP-7: Complete Setup Flow + +- **Test File**: `tests/robot/ui/setup_flow.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/setup_flow.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/setup.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - Filling all fields correctly and submitting redirects to the main page (`search-input` visible, title contains "AniWorld"). + +--- + +### Task UI-SETUP-8: Setup Redirects When Already Configured + +- **Test File**: `tests/robot/ui/setup_flow.robot` +- **Failing Step**: Parent suite setup (`Wait For Server`) +- **Files to Check**: + - `tests/robot/ui/setup_flow.robot` + - `tests/robot/resources/ui_keywords.resource` + - `src/server/web/static/js/setup.js` +- **Reference Docs**: + - `Docs/API.md` +- **Expected Behavior**: + - After setup is complete, visiting `/setup` redirects to `/` (URL does not contain `/setup`). + +--- + +## Summary + +| Category | Suite | Tests | Passed | Failed | +|---|---|---|---|---| +| Infrastructure | Global | — | 0 | 129 (all blocked by suite setup) | +| API | Anime | 14 | 0 | 14 | +| API | Auth | 12 | 0 | 12 | +| API | Config | 10 | 0 | 10 | +| API | Download | 12 | 0 | 12 | +| API | Health | 2 | 0 | 2 | +| API | Logging | 6 | 0 | 6 | +| API | Nfo | 4 | 0 | 4 | +| API | Scheduler | 6 | 0 | 6 | +| API | Setup | 3 | 0 | 3 | +| API | Websocket | 4 | 0 | 4 | +| UI | Anime Settings | 3 | 0 | 3 | +| UI | Dashboard | 11 | 0 | 11 | +| UI | Login | 6 | 0 | 6 | +| UI | Queue Page | 8 | 0 | 8 | +| UI | Responsive | 5 | 0 | 5 | +| UI | Settings Modal | 15 | 0 | 15 | +| UI | Setup Flow | 8 | 0 | 8 | +| **Total** | | **129** | **0** | **129** | + +### Recommended Priority Order + +1. **INFRA-1** — Fix the server startup environment issue. This is the blocker for all 129 tests. +2. **INFRA-2** — Fix the suite teardown `Close Browser` keyword argument mismatch. +3. Once the server starts correctly, re-run the full Robot Framework suite to identify any individual test logic failures. +4. Address any remaining per-test failures based on the new run results. diff --git a/Makefile b/Makefile index 53368aa..8fd61e7 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: up down clean browser-clean setup +.PHONY: up down clean browser-clean setup test-robot up: python run_server.py @@ -18,4 +18,7 @@ setup: curl -X POST http://127.0.0.1:8000/setup \ -H "Content-Type: application/json" \ -H "X-API-Key: 299ae8f630a31bda814263c551361448" \ - -d '{"path": "/home/lukas/Volume/serien/", "password": "Hallo123!"}' \ No newline at end of file + -d '{"path": "/home/lukas/Volume/serien/", "password": "Hallo123!"}' + +test-robot: + bash tests/robot/run.sh \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 00ec19b..f8294da 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,4 +25,10 @@ beautifulsoup4>=4.12.0 chardet>=5.2.0 fake-useragent>=1.4.0 yt-dlp>=2024.1.0 -urllib3>=2.0.0 \ No newline at end of file +urllib3>=2.0.0 + +# Robot Framework testing dependencies +robotframework>=7.0 +robotframework-browser>=18.0 +robotframework-requests>=0.9 +robotframework-jsonlibrary>=0.5 \ No newline at end of file