Align frontend API contracts

This commit is contained in:
2026-03-22 13:21:02 +01:00
parent 0da5b4abe2
commit e639b3c792
35 changed files with 1362 additions and 205 deletions

View File

@@ -332,7 +332,12 @@ class BackgroundJobsViewTest(APITestCase):
url = reverse("api_v1:jobs:job-status", kwargs={"task_id": job.task_id})
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
set(response.data.keys()),
{"task_id", "status", "progress", "message", "result", "error"},
)
self.assertEqual(response.data["task_id"], job.task_id)
self.assertEqual(response.data["status"], "success")
def test_job_status_forbidden_for_other_user(self):
job = self._create_job(
@@ -361,12 +366,17 @@ class BackgroundJobsViewTest(APITestCase):
def test_job_list_filters_status(self):
self._create_job(task_id="job-1", user_id=self.user.id, status="success")
self._create_job(task_id="job-2", user_id=self.user.id, status="pending")
self._create_job(task_id="job-2", user_id=self.user.id, status="started")
self.client.force_authenticate(self.user)
url = reverse("api_v1:jobs:job-list")
response = self.client.get(url, {"status": "success", "limit": 10})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)
self.assertEqual(len(response.data["results"]), 1)
self.assertEqual(
set(response.data["results"][0].keys()),
{"task_id", "status", "progress", "name"},
)
self.assertEqual(response.data["results"][0]["name"], "task")
def test_job_list_limit(self):
for idx in range(5):
@@ -379,7 +389,7 @@ class BackgroundJobsViewTest(APITestCase):
url = reverse("api_v1:jobs:job-list")
response = self.client.get(url, {"limit": 2})
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertLessEqual(len(response.data), 2)
self.assertLessEqual(len(response.data["results"]), 2)
def test_job_list_invalid_limit_returns_400(self):
self._create_job(
@@ -389,3 +399,46 @@ class BackgroundJobsViewTest(APITestCase):
url = reverse("api_v1:jobs:job-list")
response = self.client.get(url, {"limit": "abc"})
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_job_status_maps_started_to_running(self):
job = self._create_job(
task_id="job-running",
user_id=self.user.id,
status="started",
)
self.client.force_authenticate(self.user)
url = reverse("api_v1:jobs:job-status", kwargs={"task_id": job.task_id})
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["status"], "running")
def test_job_stream_returns_completed_sse_event(self):
job = self._create_job(
task_id="job-stream-complete",
user_id=self.user.id,
status="success",
)
self.client.force_authenticate(self.user)
url = reverse("api_v1:jobs:job-stream", kwargs={"task_id": job.task_id})
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
chunks = b"".join(response.streaming_content).decode("utf-8")
self.assertIn("event: completed", chunks)
self.assertIn('"task_id": "job-stream-complete"', chunks)
def test_job_stream_forbidden_for_other_user(self):
job = self._create_job(
task_id="job-stream-forbidden",
user_id=self.user.id,
status="success",
)
self.client.force_authenticate(self.other)
url = reverse("api_v1:jobs:job-stream", kwargs={"task_id": job.task_id})
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)