""" 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 "