Files
gh-christianlouis-docuelevate/tests/test_endpoint_registration.py
T
2026-02-13 09:10:52 +00:00

109 lines
4.6 KiB
Python

"""
Tests to verify that all critical API endpoints are properly registered.
This test module serves as a regression prevention mechanism to ensure
that endpoints remain accessible after code refactoring or reorganization.
"""
from unittest.mock import Mock, patch
import pytest
# Test constants
TEST_URL = "https://example.com/test.pdf"
@pytest.mark.unit
class TestEndpointRegistration:
"""Verify that critical API endpoints are registered in the FastAPI app"""
@patch("app.api.url_upload.requests.get")
@patch("app.api.url_upload.process_document")
def test_process_url_endpoint_exists(self, mock_process_document, mock_requests_get, client):
"""Verify that /api/process-url endpoint is registered and accessible"""
# Mock successful download to prevent actual HTTP requests
mock_response = Mock()
mock_response.status_code = 200
mock_response.headers = {"Content-Type": "application/pdf", "Content-Length": "1024"}
mock_response.iter_content = Mock(return_value=[b"PDF content"])
mock_response.raise_for_status = Mock()
mock_requests_get.return_value = mock_response
# Mock Celery task
mock_task = Mock()
mock_task.id = "test-task-id"
mock_process_document.delay.return_value = mock_task
# Make a request to the endpoint - it should not return 404
response = client.post("/api/process-url", json={"url": TEST_URL})
# The endpoint exists if we don't get a 404
# We may get other errors (401, 400, 500, etc.) due to validation or missing mocks,
# but 404 specifically means the endpoint is not registered
assert response.status_code != 404, (
"Endpoint /api/process-url returned 404 (not found). "
"This indicates the router is not properly registered in the application. "
"Verify that url_upload_router is included in app/api/__init__.py"
)
@patch("app.api.url_upload.requests.get")
@patch("app.api.url_upload.process_document")
def test_process_url_endpoint_accepts_post(self, mock_process_document, mock_requests_get, client):
"""Verify that /api/process-url accepts POST requests"""
# Mock successful download to prevent actual HTTP requests
mock_response = Mock()
mock_response.status_code = 200
mock_response.headers = {"Content-Type": "application/pdf", "Content-Length": "1024"}
mock_response.iter_content = Mock(return_value=[b"PDF content"])
mock_response.raise_for_status = Mock()
mock_requests_get.return_value = mock_response
# Mock Celery task
mock_task = Mock()
mock_task.id = "test-task-id"
mock_process_document.delay.return_value = mock_task
# Try POST request
response = client.post("/api/process-url", json={"url": TEST_URL})
# Should not return 405 (Method Not Allowed)
assert response.status_code != 405, (
"Endpoint /api/process-url returned 405 (Method Not Allowed) for POST. "
"Verify the endpoint is decorated with @router.post()"
)
@patch("app.api.url_upload.requests.get")
@patch("app.api.url_upload.process_document")
def test_api_router_included_in_app(self, mock_process_document, mock_requests_get, client):
"""Verify that the main API router is included in the FastAPI app"""
# Mock successful download for /api/process-url test
mock_response = Mock()
mock_response.status_code = 200
mock_response.headers = {"Content-Type": "application/pdf", "Content-Length": "1024"}
mock_response.iter_content = Mock(return_value=[b"PDF content"])
mock_response.raise_for_status = Mock()
mock_requests_get.return_value = mock_response
# Mock Celery task
mock_task = Mock()
mock_task.id = "test-task-id"
mock_process_document.delay.return_value = mock_task
# Test a few known API endpoints to ensure the /api prefix works
endpoints_to_check = [
("/api/process-url", "post"),
("/api/diagnostic/settings", "get"),
]
for endpoint, method in endpoints_to_check:
if method == "get":
response = client.get(endpoint)
else:
response = client.post(endpoint, json={"url": TEST_URL})
# None of these should return 404
assert response.status_code != 404, (
f"Endpoint {endpoint} returned 404. "
f"Verify that api_router is included in app/main.py with prefix='/api'"
)