Allow updating app name and data directory via config endpoint. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
14 KiB
Task 2: Fix Update Config API Test
Test Result: FAIL — Expected status: 200, got 422
File: tests/robot/api/config.robot
Instructions:
The test sends a PUT to /api/config with a payload that includes other={'anime_directory': '/tmp/aniworld_test_anime'}. The server returns 422 (Unprocessable Entity). Open src/server/models/config.py and inspect the ConfigUpdate Pydantic model. The other field may be missing, incorrectly typed, or the nested dict validation is failing. Ensure ConfigUpdate accepts the other field with an anime_directory string inside. Update the model or the test payload so they agree.
Task 3: Fix Validate Valid Config API Test
Test Result: FAIL — Expected status: 200, got 422
File: tests/robot/api/config.robot
Instructions:
The test POSTs to /api/config/validate with logging={'level': 'INFO', 'file': None, 'max_bytes': None, 'backup_count': 3}. The server returns 422. Open src/server/models/config.py and inspect the LoggingConfig Pydantic model. The file and max_bytes fields likely do not accept None (or the model requires strings/ints). Update the model so file: Optional[str] = None and max_bytes: Optional[int] = None, or adjust the test payload to omit None values. Ensure the validation endpoint returns 200 for well-formed configs.
Task 4: Fix Config Backup Create API Test
Test Result: FAIL — Expected status: 201, got 200
File: tests/robot/api/config.robot and src/server/api/config.py
Instructions:
The test expects HTTP 201 Created for POST /api/config/backups, but the endpoint returns 200. Open src/server/api/config.py, find the create_backup function, and change the response status code to 201. Use status_code=status.HTTP_201_CREATED on the route decorator or return a JSONResponse with status 201.
Task 5: Fix Config Backup List API Test
Test Result: FAIL — Expected status: 200, got 201 (caused by preceding POST returning 200 instead of 201)
File: tests/robot/api/config.robot and src/server/api/config.py
Instructions:
Same root cause as Task 4. The test first calls POST /api/config/backups expecting 201, but gets 200. Fix create_backup in src/server/api/config.py to return status 201. Once that is fixed, this test will pass.
Task 6: Fix Config Backup Restore API Test
Test Result: FAIL — Expected status: 200, got 201 (caused by preceding POST returning 200 instead of 201)
File: tests/robot/api/config.robot and src/server/api/config.py
Instructions:
Same root cause as Task 4. The test first calls POST /api/config/backups expecting 201, but gets 200. Fix create_backup in src/server/api/config.py to return status 201. Once that is fixed, this test will pass.
Task 7: Fix Config Backup Delete API Test
Test Result: FAIL — Expected status: 200, got 201 (caused by preceding POST returning 200 instead of 201)
File: tests/robot/api/config.robot and src/server/api/config.py
Instructions:
Same root cause as Task 4. The test first calls POST /api/config/backups expecting 201, but gets 200. Fix create_backup in src/server/api/config.py to return status 201. Once that is fixed, this test will pass.
Task 8: Fix Get Empty Queue Status API Test
Test Result: FAIL — List '${values}' has no item in index 0.
File: tests/robot/api/download.robot
Instructions:
The test expects the queue status response to contain $.statistics.pending, but the JSON path extraction fails. Open src/server/api/download.py and inspect the get_queue_status endpoint. Check the QueueStatusResponse model in src/server/models/download.py. The response structure may use statistics.pending_count instead of statistics.pending, or the statistics object may be missing. Update the Robot test JSON path or fix the API response structure so they match.
Task 9: Fix Add Episodes To Queue API Test
Test Result: FAIL — Expected status: 201, got 422
File: tests/robot/api/download.robot
Instructions:
The test POSTs to /api/queue/add with a payload containing serie_id, serie_folder, serie_name, episodes, and priority. The server returns 422. Open src/server/models/download.py and inspect the DownloadRequest Pydantic model. Compare the model fields with the Robot test payload. The field names or types may mismatch (e.g., episodes list structure, priority enum values). Update either the model or the test payload so validation passes and the endpoint returns 201.
Task 10: Fix Start Queue API Test
Test Result: FAIL — Expected status: 200, got 400 (No pending downloads in queue)
File: tests/robot/api/download.robot
Instructions:
The test calls POST /api/queue/start without first adding items to the queue. The endpoint returns 400 because the queue is empty. Update the test to first add episodes to the queue (using Add To Queue) before calling Start Queue. Alternatively, modify the endpoint in src/server/api/download.py to return 200 with a message when the queue is empty instead of 400. The test expectation should be aligned with the API behavior.
Task 11: Fix Resume Queue API Test
Test Result: FAIL — Expected status: 200, got 405 (Method Not Allowed)
File: tests/robot/api/download.robot and src/server/api/download.py
Instructions:
The test calls POST /api/queue/resume, but this endpoint does not exist. Open src/server/api/download.py. There is /queue/start, /queue/stop, and /queue/pause, but no /queue/resume. Either add a POST /queue/resume endpoint that aliases to start_queue, or update the Robot test to call /queue/start instead of /queue/resume. Ensure the test and API agree.
Task 12: Fix Remove Item From Queue API Test
Test Result: FAIL — Expected status: 201, got 422 (caused by Add To Queue failing)
File: tests/robot/api/download.robot
Instructions:
This test depends on Add To Queue working first. Fix Task 9 (Add Episodes To Queue) so items can be added. Then verify that the DELETE /api/queue/item/{item_id} endpoint in src/server/api/download.py works correctly and returns 200.
Task 13: Fix Retry Failed Item API Test
Test Result: FAIL — Expected status: 200, got 400
File: tests/robot/api/download.robot
Instructions:
The test adds an item and then immediately retries it, but there are no failed items to retry. The POST /api/queue/retry endpoint returns 400 when no failed items exist. Update the test to first add an item, simulate a failure (or mock it), and then retry. Alternatively, modify the endpoint to return 200 with retried_count: 0 when there are no failed items instead of 400.
Task 14: Fix Queue Statistics Accuracy API Test
Test Result: FAIL — Expected status: 200, got 400 (No pending downloads in queue)
File: tests/robot/api/download.robot
Instructions:
The test calls Clear Pending and then Add To Queue, but Add To Queue fails with 422 (see Task 9). Fix Task 9 first. Then verify that after adding 2 items, Get Queue Status returns statistics.pending (or statistics.pending_count) equal to 2. Update the JSON path in the test if the response field name differs.
Task 15: Fix Connect To WebSocket API Test
Test Result: FAIL — Evaluate keyword syntax error / requires custom keyword library
File: tests/robot/api/websocket.robot
Instructions:
The test tries to evaluate __import__('asyncio').run(__import__('websockets').connect(...)) inline, which is unreliable in Robot Framework. Create a small Python keyword library (e.g., tests/robot/resources/websocket_keywords.py) that wraps WebSocket connection logic using the websockets library. Import this library in websocket.robot and replace the inline Evaluate with a proper keyword like Connect To WebSocket. Ensure the library handles token-based authentication.
UI Tests
Task 16: Fix Login Page Loads UI Test
Test Result: FAIL — TimeoutError: locator.waitFor: Timeout 5000ms exceeded. Call log: waiting for locator('id=password-input') to be visible
File: tests/robot/ui/login.robot and src/server/web/templates/login.html
Instructions:
The Robot test looks for id=password-input, but the HTML template uses id=password. Open src/server/web/templates/login.html and change the password input element's id from password to password-input. Also check id=login-submit-btn — the template uses id=login-button. Change it to id=login-submit-btn. Ensure all referenced element IDs in the Robot tests match the actual HTML.
Task 17: Fix Login With Valid Password UI Test
Test Result: FAIL — Same as Task 16 (id=password-input not found)
File: tests/robot/ui/login.robot and src/server/web/templates/login.html
Instructions:
Fix the element ID mismatches in login.html as described in Task 16. The Perform Login keyword in tests/robot/resources/ui_keywords.resource fills id=password-input and clicks id=login-submit-btn. Update the HTML template IDs to match.
Task 18: Fix Login With Invalid Password UI Test
Test Result: FAIL — Same as Task 16
File: tests/robot/ui/login.robot and src/server/web/templates/login.html
Instructions:
Fix the element ID mismatches in login.html as described in Task 16. Also verify that the error message element id=login-error exists in the template and is shown when login fails.
Task 19: Fix Login Rate Limit UI UI Test
Test Result: FAIL — Same as Task 16
File: tests/robot/ui/login.robot and src/server/web/templates/login.html
Instructions:
Fix the element ID mismatches in login.html as described in Task 16. Also verify that after 5 failed attempts, the login form shows a lockout message containing the word "lockout" and the id=login-error element displays it.
Task 20: Fix Password Visibility Toggle UI Test
Test Result: FAIL — Same as Task 16
File: tests/robot/ui/login.robot and src/server/web/templates/login.html
Instructions:
Fix the element ID mismatches in login.html as described in Task 16. The test clicks id=password-toggle — verify this ID exists in the template (it may be id=password-toggle already, but confirm). Ensure the toggle button changes the input type attribute between password and text.
Task 21: Fix Logout UI Test
Test Result: FAIL — Same as Task 16
File: tests/robot/ui/login.robot and src/server/web/templates/login.html
Instructions:
Fix the element ID mismatches in login.html as described in Task 16. The Perform Logout keyword clicks id=logout-btn. Verify this button exists in the dashboard/index template and redirects to /login after logout.
Task 22: Fix All Dashboard UI Tests
Test Result: FAIL — All 11 tests fail with TimeoutError: locator.fill: Timeout 10000ms exceeded. Call log: waiting for locator('id=password-input')
File: tests/robot/ui/dashboard.robot and src/server/web/templates/login.html
Instructions:
All dashboard tests depend on logging in first. The login step fails because of the id=password-input mismatch. Fix Task 16 first. Then verify that after login, the dashboard page loads and contains the elements referenced in the tests: id=search-input, theme toggle, rescan button, missing episodes filter, etc. Update element IDs in the dashboard HTML or Robot tests as needed.
Task 23: Fix All Anime Settings UI Tests
Test Result: FAIL — All 3 tests fail with the same login timeout
File: tests/robot/ui/anime_settings.robot
Instructions:
Fix Task 16 first. Then verify that the anime settings page loads after login and contains the elements expected by the Robot tests. Update IDs in the HTML or tests as needed.
Task 24: Fix All Queue Page UI Tests
Test Result: FAIL — All 6 tests fail with the same login timeout
File: tests/robot/ui/queue_page.robot
Instructions:
Fix Task 16 first. Then verify that the queue page loads after login and contains the elements expected by the Robot tests. Update IDs in the HTML or tests as needed.
Task 25: Fix All Settings Modal UI Tests
Test Result: FAIL — All tests fail with the same login timeout
File: tests/robot/ui/settings_modal.robot
Instructions:
Fix Task 16 first. Then verify that the settings modal opens from the dashboard and contains the expected form elements. Update IDs in the HTML or tests as needed.
Task 26: Fix All Setup Flow UI Tests
Test Result: FAIL — All tests fail with the same login timeout
File: tests/robot/ui/setup_flow.robot
Instructions:
Fix Task 16 first. The setup flow tests may need to run before the app is configured. Verify that tests/robot/start_server.sh correctly removes data/config.json so the app starts unconfigured. Ensure the setup page elements match the Robot test selectors.
Task 27: Fix All Responsive UI Tests
Test Result: FAIL — All tests fail with the same login timeout
File: tests/robot/ui/responsive.robot
Instructions:
Fix Task 16 first. Then verify that responsive layout tests check for viewport-specific elements that actually exist in the HTML.
Summary of Root Causes
- Config API —
POST /api/config/backupsreturns 200 instead of 201.ConfigUpdatemodel may rejectotherfield.LoggingConfigmay rejectNoneforfile/max_bytes. - Download Queue API —
DownloadRequestmodel validation fails on the test payload.GET /queue/statusresponse field names may differ from test expectations.POST /queue/resumeendpoint is missing.Start Queuereturns 400 on empty queue. - WebSocket API — Inline
Evaluatewith asyncio is unreliable; needs a proper Python keyword library. - UI Login Page — HTML element IDs (
password,login-button) do not match Robot test selectors (password-input,login-submit-btn). - All Other UI Tests — Fail because they cannot log in due to the ID mismatch above.