| from __future__ import annotations |
|
|
| import tempfile |
| import unittest |
| from pathlib import Path |
|
|
| from fastapi import status |
| from fastapi.testclient import TestClient |
|
|
| from app.api.dependencies import get_container |
| from app.main import create_app |
| from tests.integration.api.support import ( |
| FakeProcessRemoteImage, |
| FakeProcessUploadedImage, |
| FailingProcessRemoteImage, |
| InvalidProcessRemoteImage, |
| make_container, |
| ) |
|
|
| TEST_IMAGE_URL = "https://httpbin.org/image/jpeg" |
|
|
|
|
| class ApiProcessUrlIntegrationTests(unittest.TestCase): |
| def test_process_url_returns_job_id_on_success(self) -> None: |
| with tempfile.TemporaryDirectory() as temp_dir: |
| root = Path(temp_dir) |
| process_remote_image = FakeProcessRemoteImage() |
| app = create_app() |
| app.dependency_overrides[get_container] = lambda: make_container( |
| root, |
| process_remote_image=process_remote_image, |
| process_uploaded_image=FakeProcessUploadedImage(), |
| ) |
| client = TestClient(app) |
| try: |
| response = client.post("/process/url", json={"sourceUrl": TEST_IMAGE_URL}) |
|
|
| self.assertEqual(status.HTTP_200_OK, response.status_code) |
| self.assertEqual("test-remote-job", response.json()["jobId"]) |
| self.assertEqual(1, len(process_remote_image.calls)) |
| self.assertEqual(TEST_IMAGE_URL, process_remote_image.calls[0].source_url) |
| finally: |
| client.close() |
| app.dependency_overrides.clear() |
|
|
| def test_process_url_returns_500_for_runtime_errors(self) -> None: |
| with tempfile.TemporaryDirectory() as temp_dir: |
| root = Path(temp_dir) |
| app = create_app() |
| app.dependency_overrides[get_container] = lambda: make_container( |
| root, |
| process_remote_image=FailingProcessRemoteImage(), |
| process_uploaded_image=FakeProcessUploadedImage(), |
| ) |
| client = TestClient(app) |
| try: |
| response = client.post("/process/url", json={"sourceUrl": TEST_IMAGE_URL}) |
|
|
| self.assertEqual(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code) |
| self.assertEqual("Internal processing error.", response.json()["detail"]) |
| finally: |
| client.close() |
| app.dependency_overrides.clear() |
|
|
| def test_process_url_returns_400_for_value_errors(self) -> None: |
| with tempfile.TemporaryDirectory() as temp_dir: |
| root = Path(temp_dir) |
| app = create_app() |
| app.dependency_overrides[get_container] = lambda: make_container( |
| root, |
| process_remote_image=InvalidProcessRemoteImage(), |
| process_uploaded_image=FakeProcessUploadedImage(), |
| ) |
| client = TestClient(app) |
| try: |
| response = client.post("/process/url", json={"sourceUrl": TEST_IMAGE_URL}) |
|
|
| self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) |
| self.assertEqual("invalid source", response.json()["detail"]) |
| finally: |
| client.close() |
| app.dependency_overrides.clear() |
|
|
|
|
| if __name__ == "__main__": |
| unittest.main() |
|
|