### 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.