Task 4.3: Verify queue API endpoints use key identifier

- Verified queue API endpoints already use 'serie_id' (key) as primary identifier
- Updated test fixtures to use explicit key values (e.g., 'test-series-key')
- Added test to verify queue items include serie_id (key) and serie_folder (metadata)
- Fixed test_queue_items_have_required_fields to find correct item by ID
- Added test_queue_item_uses_key_as_identifier for explicit key verification
- Updated instructions.md to mark Task 4.3 as complete

All 870 tests pass.
This commit is contained in:
Lukas 2025-11-27 19:46:49 +01:00
parent f4dad969bc
commit f4d14cf17e
2 changed files with 84 additions and 61 deletions

View File

@ -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

View File

@ -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"