"""
GovBridge India — Backend Test Suite
Comprehensive pytest tests for CI/CD pipeline.
Tests pure business logic without external dependencies.
"""
import pytest
from unittest.mock import patch, MagicMock, AsyncMock
from datetime import date, timedelta
# ============================================================
# 1. CONFIG MODULE TESTS
# ============================================================
class TestConfig:
"""Test pydantic-settings configuration module."""
def test_settings_loads_with_defaults(self):
"""Settings should initialize with empty defaults when no env vars set."""
with patch.dict("os.environ", {}, clear=True):
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field
class TestSettings(BaseSettings):
SUPABASE_URL: str = Field(default="")
SUPABASE_KEY: str = Field(default="")
model_config = SettingsConfigDict(extra="ignore")
s = TestSettings()
assert s.SUPABASE_URL == ""
assert s.SUPABASE_KEY == ""
def test_settings_reads_env_vars(self):
"""Settings should read from environment variables."""
with patch.dict("os.environ", {
"SUPABASE_URL": "https://test.supabase.co",
"SUPABASE_KEY": "test-key-123"
}):
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field
class TestSettings(BaseSettings):
SUPABASE_URL: str = Field(default="")
SUPABASE_KEY: str = Field(default="")
model_config = SettingsConfigDict(extra="ignore")
s = TestSettings()
assert s.SUPABASE_URL == "https://test.supabase.co"
assert s.SUPABASE_KEY == "test-key-123"
# ============================================================
# 2. PYDANTIC MODEL VALIDATION TESTS
# ============================================================
class TestSearchQueryValidation:
"""Test SearchQuery Pydantic model from api.py."""
def test_valid_query(self):
"""Valid search query should pass validation."""
from pydantic import BaseModel, Field, field_validator
import re
class SearchQuery(BaseModel):
question: str = Field(..., min_length=3, max_length=500)
language: str = Field(default="english")
@field_validator('language')
@classmethod
def validate_language(cls, v):
valid = ["english", "hindi", "tamil", "bengali", "telugu",
"marathi", "gujarati", "kannada", "malayalam", "punjabi"]
if v.lower() not in valid:
return "english"
return v.lower()
@field_validator('question')
@classmethod
def clean_input(cls, v):
v = re.sub(r'<[^>]+>', '', v)
v = re.sub(r'\s+', ' ', v).strip()
if not v:
raise ValueError('Question is empty after cleaning')
return v
q = SearchQuery(question="What is PM Kisan?", language="hindi")
assert q.question == "What is PM Kisan?"
assert q.language == "hindi"
def test_html_stripped_from_question(self):
"""HTML tags should be stripped from question input."""
from pydantic import BaseModel, Field, field_validator
import re
class SearchQuery(BaseModel):
question: str = Field(..., min_length=3, max_length=500)
language: str = Field(default="english")
@field_validator('question')
@classmethod
def clean_input(cls, v):
v = re.sub(r'<[^>]+>', '', v)
v = re.sub(r'\s+', ' ', v).strip()
if not v:
raise ValueError('Question is empty after cleaning')
return v
q = SearchQuery(question="What is PM Kisan?")
assert "