diff --git a/instructions.md b/instructions.md index 8ed505f..5e430d3 100644 --- a/instructions.md +++ b/instructions.md @@ -102,6 +102,7 @@ For each task completed: - [ ] Task marked as complete in instructions.md - [ ] Infrastructure.md updated - [ ] Changes committed to git +- [ ] Take the next task --- @@ -157,64 +158,13 @@ For each task completed: ## Task Series: Identifier Standardization -### Phase 1: Core Models and Data Layer - -✅ **All Phase 1 tasks completed and committed to git** - ---- - -### Phase 2: Core Application Layer - -✅ **Task 2.1 completed and committed to git** - ---- - -### Phase 3: Service Layer - -✅ **All Phase 3 tasks completed and committed to git (November 2025)** - -- Task 3.1: Update DownloadService ✅ -- Task 3.2: Update AnimeService ✅ -- Task 3.3: Update ProgressService ✅ -- Task 3.4: Update ScanService ✅ (November 27, 2025) - ---- - ### Phase 4: API Layer #### Task 4.1: Update Anime API Endpoints to Use Key ✅ (November 27, 2025) #### Task 4.2: Update Download API Endpoints to Use Key ✅ (November 27, 2025) ---- - -#### Task 4.3: Update Queue API Endpoints to Use Key - -**File:** [`src/server/api/queue.py`](src/server/api/queue.py) - -**Objective:** Ensure queue API endpoints use `key` for series identification. - -**Steps:** - -1. Open [`src/server/api/queue.py`](src/server/api/queue.py) -2. Review all queue-related endpoints -3. Update request/response models to use `key` as identifier -4. Ensure queue status includes `key` in item data -5. Update queue manipulation endpoints to accept `key` -6. Update docstrings and OpenAPI documentation - -**Success Criteria:** - -- [ ] All queue endpoints use `key` -- [ ] Queue status responses include `key` -- [ ] Request models use `key` for identification -- [ ] All queue API tests pass - -**Test Command:** - -```bash -conda run -n AniWorld python -m pytest tests/api/ -k "queue" -v -``` +#### Task 4.3: Update Queue API Endpoints to Use Key ✅ (November 27, 2025) --- @@ -877,7 +827,7 @@ conda run -n AniWorld python -m pytest tests/integration/test_identifier_consist - [ ] Phase 4: API Layer - [x] Task 4.1: Update Anime API Endpoints ✅ **Completed November 27, 2025** - [x] Task 4.2: Update Download API Endpoints ✅ **Completed November 27, 2025** - - [ ] Task 4.3: Update Queue API Endpoints + - [x] Task 4.3: Update Queue API Endpoints ✅ **Completed November 27, 2025** - [ ] Task 4.4: Update WebSocket API Endpoints - [ ] Task 4.5: Update Pydantic Models - [ ] Task 4.6: Update Validators diff --git a/tests/api/test_queue_features.py b/tests/api/test_queue_features.py index 0f7639c..b05c984 100644 --- a/tests/api/test_queue_features.py +++ b/tests/api/test_queue_features.py @@ -45,10 +45,14 @@ async def auth_headers(client: AsyncClient): @pytest.fixture def sample_download_request(): - """Sample download request for testing.""" + """Sample download request for testing. + + Note: serie_id is the primary identifier (key) used for all lookups. + serie_folder is metadata only used for filesystem operations. + """ return { - "serie_id": "test-series", - "serie_folder": "Test Series (2024)", + "serie_id": "test-series-key", # Provider key (primary identifier) + "serie_folder": "Test Series (2024)", # Filesystem folder (metadata) "serie_name": "Test Series", "episodes": [ {"season": 1, "episode": 1}, @@ -101,6 +105,11 @@ class TestQueueDisplay: ) assert add_response.status_code == 201 + # Get the added item IDs from response + add_data = add_response.json() + added_ids = add_data.get("added_items", []) + assert len(added_ids) > 0, "No items were added" + # Get queue status response = await client.get( "/api/queue/status", @@ -113,20 +122,83 @@ class TestQueueDisplay: pending = data["status"]["pending_queue"] assert len(pending) > 0 - item = pending[0] + + # Find the item we just added by ID + item = next((i for i in pending if i["id"] in added_ids), None) + assert item is not None, f"Could not find added item in queue. Added IDs: {added_ids}" # Verify required fields for display assert "id" in item + assert "serie_id" in item # Key - primary identifier + assert "serie_folder" in item # Metadata for filesystem ops assert "serie_name" in item assert "episode" in item assert "priority" in item assert "added_at" in item + # Verify serie_id (key) matches what we sent + assert item["serie_id"] == sample_download_request["serie_id"] + # Verify episode structure episode = item["episode"] assert "season" in episode assert "episode" in episode + @pytest.mark.asyncio + async def test_queue_item_uses_key_as_identifier( + self, client: AsyncClient, auth_headers: dict + ): + """Test that queue items use serie_id (key) as primary identifier. + + Verifies that: + - serie_id is the provider-assigned key (URL-safe identifier) + - serie_folder is metadata only (not used for identification) + - Both fields are present in queue item responses + """ + # Add an item with explicit key and folder + request = { + "serie_id": "my-test-anime-key", # Provider key (primary ID) + "serie_folder": "My Test Anime (2024)", # Display name/folder + "serie_name": "My Test Anime", + "episodes": [{"season": 1, "episode": 1}], + "priority": "normal" + } + + add_response = await client.post( + "/api/queue/add", + json=request, + headers=auth_headers + ) + assert add_response.status_code == 201 + + # Get queue status + response = await client.get( + "/api/queue/status", + headers=auth_headers + ) + assert response.status_code == 200 + + data = response.json() + pending = data["status"]["pending_queue"] + + # Find our item by key + matching_items = [ + item for item in pending + if item["serie_id"] == "my-test-anime-key" + ] + assert len(matching_items) >= 1, "Item should be findable by key" + + item = matching_items[0] + + # Verify key is used as identifier + assert item["serie_id"] == "my-test-anime-key" + + # Verify folder is preserved as metadata + assert item["serie_folder"] == "My Test Anime (2024)" + + # Verify serie_name is also present + assert item["serie_name"] == "My Test Anime" + class TestQueueReordering: """Test queue reordering functionality.""" @@ -159,9 +231,9 @@ class TestQueueReordering: response = await client.post( "/api/queue/add", json={ - "serie_id": f"test-{i}", - "serie_folder": f"Test Series {i} (2024)", - "serie_name": f"Test Series {i}", + "serie_id": f"reorder-test-key-{i}", # Key (primary ID) + "serie_folder": f"Reorder Test {i} (2024)", # Metadata + "serie_name": f"Reorder Test {i}", "episodes": [{"season": 1, "episode": i+1}], "priority": "normal" }, @@ -414,7 +486,8 @@ class TestBulkOperations: add_response = await client.post( "/api/queue/add", json={ - "serie_id": f"bulk-test-{i}", + "serie_id": f"bulk-test-key-{i}", # Key (primary ID) + "serie_folder": f"Bulk Test {i} (2024)", # Metadata "serie_name": f"Bulk Test {i}", "episodes": [{"season": 1, "episode": i+1}], "priority": "normal"