import os import sys import types import unittest from unittest.mock import patch from models.ai_client import AIClient class _LegacySchemaError(Exception): pass class _Result: def __init__(self, data): self.data = data class _LegacyQuery: def __init__(self, rows): self.rows = rows self.selects = [] def select(self, columns): self.selects.append(columns) if "default_model" in columns: raise _LegacySchemaError("column ai_providers.default_model does not exist") return self def eq(self, *_args, **_kwargs): return self def order(self, *_args, **_kwargs): return self def execute(self): return _Result(self.rows) class _LegacySupabase: def __init__(self, rows): self.query = _LegacyQuery(rows) def table(self, name): assert name == "ai_providers" return self.query class LegacySchemaCompatibilityTests(unittest.TestCase): def test_detects_only_known_legacy_missing_columns(self): self.assertTrue( AIClient._is_legacy_schema_error( _LegacySchemaError("column ai_providers.default_model does not exist") ) ) self.assertFalse( AIClient._is_legacy_schema_error( _LegacySchemaError("column ai_providers.api_key does not exist") ) ) def test_legacy_schema_returns_empty_so_current_environment_fallback_stays_authoritative(self): legacy_supabase = _LegacySupabase([]) fake_supabase = types.SimpleNamespace( create_client=lambda _url, _key: legacy_supabase, ) client = AIClient.__new__(AIClient) with patch.dict( os.environ, {"SUPABASE_URL": "https://example.supabase.co", "SUPABASE_SERVICE_ROLE_KEY": "test"}, clear=True, ), patch.dict(sys.modules, {"supabase": fake_supabase}): providers = client._try_load_from_supabase() self.assertEqual(legacy_supabase.query.selects, [ "id,name,api_key,base_url,default_model,tier,purpose", ]) self.assertEqual(providers, []) if __name__ == "__main__": unittest.main()