import subprocess import sys import unittest from pathlib import Path class TestDatabasePackageImports(unittest.TestCase): def test_builder_works_after_direct_backend_module_import(self): from server.database.backend.SqliteGameplayBackend import SqliteGameplayBackend from server.database.backend import GameplayBackendBuilder backend = GameplayBackendBuilder.build(db_path=":memory:") self.assertIsInstance(backend, SqliteGameplayBackend) def test_builder_import_defers_backend_modules(self): project_root = Path(__file__).resolve().parents[1] script = """ import sys from server.database.backend import GameplayBackendBuilder assert 'server.database.backend.SqliteGameplayBackend' not in sys.modules assert 'server.database.backend.PostgresqlGameplayBackend' not in sys.modules backend = GameplayBackendBuilder.build(db_path=':memory:') assert backend.__class__.__name__ == 'SqliteGameplayBackend' assert 'server.database.backend.PostgresqlGameplayBackend' not in sys.modules """ result = subprocess.run( [sys.executable, "-c", script], cwd=project_root, text=True, capture_output=True, ) self.assertEqual(result.returncode, 0, result.stderr) def test_sqlite_backend_import_does_not_require_aiofiles(self): project_root = Path(__file__).resolve().parents[1] script = """ import builtins original_import = builtins.__import__ def reject_aiofiles(name, *args, **kwargs): if name == 'aiofiles' or name.startswith('aiofiles.'): raise ModuleNotFoundError("aiofiles intentionally unavailable") return original_import(name, *args, **kwargs) builtins.__import__ = reject_aiofiles from server.database.backend.SqliteGameplayBackend import SqliteGameplayBackend assert SqliteGameplayBackend.__name__ == 'SqliteGameplayBackend' """ result = subprocess.run( [sys.executable, "-c", script], cwd=project_root, text=True, capture_output=True, ) self.assertEqual(result.returncode, 0, result.stderr) if __name__ == "__main__": unittest.main()