| """
|
| Unit Tests for Main Application Module.
|
|
|
| Tests FastAPI application configuration and utility functions.
|
| """
|
|
|
| import pytest
|
| from fastapi.testclient import TestClient
|
| from unittest.mock import patch, MagicMock
|
|
|
| from app.main import app, get_uptime_seconds
|
|
|
|
|
| @pytest.fixture
|
| def client():
|
| """Provide test client for the FastAPI app."""
|
| return TestClient(app)
|
|
|
|
|
| class TestAppConfiguration:
|
| """Tests for app configuration."""
|
|
|
| def test_app_exists(self):
|
| """Test app is created."""
|
| assert app is not None
|
|
|
| def test_app_title(self):
|
| """Test app has correct title."""
|
| assert app.title == "ScamShield AI"
|
|
|
| def test_app_version(self):
|
| """Test app has version."""
|
| assert app.version == "1.0.0"
|
|
|
| def test_app_description(self):
|
| """Test app has description."""
|
| assert app.description is not None
|
| assert len(app.description) > 0
|
|
|
|
|
| class TestRootEndpoint:
|
| """Tests for root endpoint."""
|
|
|
| def test_root_returns_200(self, client):
|
| """Test root endpoint returns 200."""
|
| response = client.get("/")
|
|
|
| assert response.status_code == 200
|
|
|
| def test_root_returns_api_info(self, client):
|
| """Test root endpoint returns API info."""
|
| response = client.get("/")
|
| data = response.json()
|
|
|
| assert "name" in data
|
| assert data["name"] == "ScamShield AI"
|
| assert "version" in data
|
| assert "description" in data
|
| assert "health" in data
|
|
|
| def test_root_includes_health_endpoint(self, client):
|
| """Test root includes health endpoint path."""
|
| response = client.get("/")
|
| data = response.json()
|
|
|
| assert data["health"] == "/api/v1/health"
|
|
|
|
|
| class TestGetUptimeSeconds:
|
| """Tests for get_uptime_seconds function."""
|
|
|
| def test_returns_integer(self):
|
| """Test function returns an integer."""
|
| result = get_uptime_seconds()
|
|
|
| assert isinstance(result, int)
|
|
|
| def test_returns_non_negative(self):
|
| """Test uptime is non-negative."""
|
| result = get_uptime_seconds()
|
|
|
| assert result >= 0
|
|
|
|
|
| class TestExceptionHandler:
|
| """Tests for global exception handler."""
|
|
|
| def test_handles_internal_error(self, client):
|
| """Test internal errors are handled gracefully."""
|
|
|
|
|
|
|
|
|
| assert app.exception_handlers is not None
|
|
|
|
|
| class TestCORSMiddleware:
|
| """Tests for CORS middleware configuration."""
|
|
|
| def test_cors_headers_on_options(self, client):
|
| """Test CORS headers are present on OPTIONS request."""
|
| response = client.options(
|
| "/api/v1/health",
|
| headers={"Origin": "http://example.com"}
|
| )
|
|
|
|
|
| assert response.status_code in [200, 405]
|
|
|
| def test_cors_allows_origin(self, client):
|
| """Test CORS allows cross-origin requests."""
|
| response = client.get(
|
| "/api/v1/health",
|
| headers={"Origin": "http://example.com"}
|
| )
|
|
|
|
|
| assert response.status_code == 200
|
|
|
|
|
| class TestAPIRoutes:
|
| """Tests for API route registration."""
|
|
|
| def test_health_route_registered(self, client):
|
| """Test health route is registered."""
|
| response = client.get("/api/v1/health")
|
|
|
| assert response.status_code == 200
|
|
|
| def test_engage_route_registered(self, client):
|
| """Test engage route is registered."""
|
| response = client.post(
|
| "/api/v1/honeypot/engage",
|
| json={"message": "Test message"}
|
| )
|
|
|
|
|
| assert response.status_code in [200, 400, 422]
|
|
|
| def test_session_route_registered(self, client):
|
| """Test session route is registered."""
|
| response = client.get("/api/v1/honeypot/session/test-session-id")
|
|
|
|
|
| assert response.status_code in [200, 400, 404, 422]
|
|
|
| def test_batch_route_registered(self, client):
|
| """Test batch route is registered."""
|
| response = client.post(
|
| "/api/v1/honeypot/batch",
|
| json={"messages": [{"id": "1", "message": "Test"}]}
|
| )
|
|
|
|
|
| assert response.status_code in [200, 400, 422]
|
|
|
|
|
| class TestAppLifespan:
|
| """Tests for app lifespan events."""
|
|
|
| def test_app_starts_successfully(self, client):
|
| """Test app starts and serves requests."""
|
| response = client.get("/")
|
|
|
| assert response.status_code == 200
|
|
|
| def test_app_handles_multiple_requests(self, client):
|
| """Test app handles multiple requests."""
|
| for _ in range(5):
|
| response = client.get("/api/v1/health")
|
| assert response.status_code == 200
|
|
|