test suite
This commit is contained in:
93
tests/test_prgs.py
Normal file
93
tests/test_prgs.py
Normal file
@@ -0,0 +1,93 @@
|
||||
import requests
|
||||
import pytest
|
||||
import time
|
||||
|
||||
# Use a known, short track for quick tests
|
||||
TRACK_ID = "1Cts4YV9aOXVAP3bm3Ro6r"
|
||||
# Use a long playlist to ensure there's time to cancel it
|
||||
LONG_PLAYLIST_ID = "6WsyUEITURbQXZsqtEewb1" # Today's Top Hits on Spotify
|
||||
|
||||
@pytest.fixture
|
||||
def reset_config(base_url):
|
||||
"""Fixture to reset the main config after a test."""
|
||||
response = requests.get(f"{base_url}/config")
|
||||
original_config = response.json()
|
||||
yield
|
||||
requests.post(f"{base_url}/config", json=original_config)
|
||||
|
||||
def test_list_tasks(base_url, reset_config):
|
||||
"""Tests listing all active tasks."""
|
||||
config_payload = {"service": "spotify", "fallback": False, "realTime": True}
|
||||
requests.post(f"{base_url}/config", json=config_payload)
|
||||
|
||||
# Start a task
|
||||
response = requests.get(f"{base_url}/track/download/{TRACK_ID}")
|
||||
assert response.status_code == 202
|
||||
task_id = response.json()["task_id"]
|
||||
|
||||
# Check the list to see if our task appears
|
||||
response = requests.get(f"{base_url}/prgs/list")
|
||||
assert response.status_code == 200
|
||||
tasks = response.json()
|
||||
assert isinstance(tasks, list)
|
||||
assert any(t['task_id'] == task_id for t in tasks)
|
||||
|
||||
# Clean up by cancelling the task
|
||||
requests.post(f"{base_url}/prgs/cancel/{task_id}")
|
||||
|
||||
def test_get_task_progress_and_log(base_url, task_waiter, reset_config):
|
||||
"""Tests getting progress for a running task and retrieving its log after completion."""
|
||||
config_payload = {"service": "spotify", "fallback": False, "realTime": True}
|
||||
requests.post(f"{base_url}/config", json=config_payload)
|
||||
|
||||
response = requests.get(f"{base_url}/track/download/{TRACK_ID}")
|
||||
assert response.status_code == 202
|
||||
task_id = response.json()["task_id"]
|
||||
|
||||
# Poll progress a few times while it's running to check the endpoint
|
||||
for _ in range(3):
|
||||
time.sleep(1)
|
||||
res = requests.get(f"{base_url}/prgs/{task_id}")
|
||||
if res.status_code == 200 and res.json():
|
||||
statuses = res.json()
|
||||
assert isinstance(statuses, list)
|
||||
assert "status" in statuses[-1]
|
||||
break
|
||||
else:
|
||||
pytest.fail("Could not get a valid task status in time.")
|
||||
|
||||
# Wait for completion
|
||||
final_status = task_waiter(task_id)
|
||||
assert final_status["status"] == "complete"
|
||||
|
||||
# After completion, check the task log endpoint
|
||||
res = requests.get(f"{base_url}/prgs/{task_id}?log=true")
|
||||
assert res.status_code == 200
|
||||
log_data = res.json()
|
||||
assert "task_log" in log_data
|
||||
assert len(log_data["task_log"]) > 0
|
||||
assert "status" in log_data["task_log"][0]
|
||||
|
||||
def test_cancel_task(base_url, reset_config):
|
||||
"""Tests cancelling a task shortly after it has started."""
|
||||
config_payload = {"service": "spotify", "fallback": False, "realTime": True}
|
||||
requests.post(f"{base_url}/config", json=config_payload)
|
||||
|
||||
response = requests.get(f"{base_url}/playlist/download/{LONG_PLAYLIST_ID}")
|
||||
assert response.status_code == 202
|
||||
task_id = response.json()["task_id"]
|
||||
|
||||
# Give it a moment to ensure it has started processing
|
||||
time.sleep(3)
|
||||
|
||||
# Cancel the task
|
||||
response = requests.post(f"{base_url}/prgs/cancel/{task_id}")
|
||||
assert response.status_code == 200
|
||||
assert response.json()["status"] == "cancelled"
|
||||
|
||||
# Check the final status to confirm it's marked as cancelled
|
||||
time.sleep(2) # Allow time for the final status to propagate
|
||||
res = requests.get(f"{base_url}/prgs/{task_id}")
|
||||
assert res.status_code == 200
|
||||
last_status = res.json()[-1]
|
||||
assert last_status["status"] == "cancelled"
|
||||
Reference in New Issue
Block a user