Download api/tests/functional/test_job_status_endpoint.py from Text-to-Document-Generation/Docgenie-API: direct link, hf CLI and curl.
- Browser
- Download file 3.31 kB
-
https://huggingface.co/spaces/Text-to-Document-Generation/Docgenie-API/resolve/main/api/tests/functional/test_job_status_endpoint.py
- Command line
-
hf download hf://spaces/Text-to-Document-Generation/Docgenie-API/api/tests/functional/test_job_status_endpoint.py
-
curl -L -o test_job_status_endpoint.py https://huggingface.co/spaces/Text-to-Document-Generation/Docgenie-API/resolve/main/api/tests/functional/test_job_status_endpoint.py
3.31 kB
| """ | |
| Functional tests — GET /jobs/{request_id}/status | |
| ================================================== | |
| Tests for the job-status polling endpoint. | |
| Key behaviours: | |
| • 404 for a request_id that is not in Supabase | |
| • 500/404 for a malformed (non-UUID) request_id | |
| • Response contract when a real job exists (structural) | |
| • Status field is constrained to known values | |
| """ | |
| import pytest | |
| import requests | |
| from tests.conftest import BASE_URL, TIMEOUT, NONEXISTENT_REQUEST_ID | |
| ENDPOINT_TPL = f"{BASE_URL}/jobs/{{request_id}}/status" | |
| VALID_STATUSES = { | |
| "pending", "processing", "downloading", "generating", | |
| "zipping", "uploading", "completed", "completed_no_gdrive", | |
| "completed_gdrive_failed", "failed", "error", | |
| } | |
| class TestJobStatusEndpoint: | |
| """GET /jobs/{request_id}/status""" | |
| def test_unknown_uuid_returns_non_200(self, http): | |
| url = ENDPOINT_TPL.format(request_id=NONEXISTENT_REQUEST_ID) | |
| r = http.get(url, timeout=TIMEOUT) | |
| # Supabase lookup fails → 404 expected; some deployments may raise 500 | |
| assert r.status_code in (404, 500), ( | |
| f"Expected 404/500 for unknown request_id, got {r.status_code}" | |
| ) | |
| def test_unknown_uuid_response_is_json(self, http): | |
| url = ENDPOINT_TPL.format(request_id=NONEXISTENT_REQUEST_ID) | |
| r = http.get(url, timeout=TIMEOUT) | |
| assert "application/json" in r.headers.get("Content-Type", "") | |
| def test_unknown_uuid_has_detail(self, http): | |
| url = ENDPOINT_TPL.format(request_id=NONEXISTENT_REQUEST_ID) | |
| r = http.get(url, timeout=TIMEOUT) | |
| body = r.json() | |
| assert "detail" in body, f"Error response must contain 'detail'. Got: {body}" | |
| def test_garbage_request_id_returns_error(self, http): | |
| """A completely non-UUID string should still return a meaningful error.""" | |
| url = ENDPOINT_TPL.format(request_id="not-a-real-id") | |
| r = http.get(url, timeout=TIMEOUT) | |
| assert r.status_code in (404, 500) | |
| def test_endpoint_is_get_only(self, http): | |
| url = ENDPOINT_TPL.format(request_id=NONEXISTENT_REQUEST_ID) | |
| r = http.post(url, json={}, timeout=TIMEOUT) | |
| assert r.status_code == 405, ( | |
| f"POST to a GET-only endpoint should be 405, got {r.status_code}" | |
| ) | |
| def test_status_field_in_known_values_if_200(self, http): | |
| """ | |
| If we ever get a 200 (e.g., a real job in the DB), the status must | |
| be one of the known values documented in the API. | |
| """ | |
| url = ENDPOINT_TPL.format(request_id=NONEXISTENT_REQUEST_ID) | |
| r = http.get(url, timeout=TIMEOUT) | |
| if r.status_code == 200: | |
| body = r.json() | |
| assert body.get("status") in VALID_STATUSES, ( | |
| f"Unexpected status value: {body.get('status')}" | |
| ) | |
| def test_200_response_contract_if_present(self, http): | |
| """ | |
| If a 200 is returned, the body must contain the required fields. | |
| """ | |
| url = ENDPOINT_TPL.format(request_id=NONEXISTENT_REQUEST_ID) | |
| r = http.get(url, timeout=TIMEOUT) | |
| if r.status_code == 200: | |
| body = r.json() | |
| for field in ("request_id", "status", "created_at", "updated_at"): | |
| assert field in body, f"Missing required field '{field}' in {body}" | |