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()