from __future__ import annotations import importlib import os import sys import tempfile import unittest from pathlib import Path from fastapi.testclient import TestClient BACKEND_DIR = Path(__file__).resolve().parents[1] if str(BACKEND_DIR) not in sys.path: sys.path.insert(0, str(BACKEND_DIR)) class CapabilitiesApiTests(unittest.TestCase): def _load_client( self, runtime_mode: str, enabled_features: str | None = None, ) -> TestClient: self.temp_dir = tempfile.TemporaryDirectory() os.environ["OMNIVOICE_RUNTIME_MODE"] = runtime_mode os.environ["OMNIVOICE_DATA_ROOT"] = self.temp_dir.name if enabled_features is None: os.environ.pop("OMNIVOICE_ENABLED_FEATURES", None) else: os.environ["OMNIVOICE_ENABLED_FEATURES"] = enabled_features sys.modules.pop("main", None) main = importlib.import_module("main") main = importlib.reload(main) self.addCleanup(self.temp_dir.cleanup) return TestClient(main.app) def tearDown(self) -> None: os.environ.pop("OMNIVOICE_RUNTIME_MODE", None) os.environ.pop("OMNIVOICE_DATA_ROOT", None) os.environ.pop("OMNIVOICE_ENABLED_FEATURES", None) def test_self_hosted_mode_enables_all_local_features(self) -> None: client = self._load_client(runtime_mode="self_hosted") response = client.get("/api/capabilities") self.assertEqual(response.status_code, 200) payload = response.json() self.assertEqual(payload["runtime_mode"], "self_hosted") self.assertEqual(payload["license"]["state"], "dev_override") self.assertFalse(payload["ui"]["show_runtime_help"]) self.assertTrue(payload["features"]["playground"]) self.assertTrue(payload["features"]["audio_studio"]) self.assertTrue(payload["features"]["video_studio"]) self.assertTrue(payload["features"]["post_production"]) self.assertTrue(payload["features"]["audio_export"]) self.assertTrue(payload["features"]["video_export"]) def test_production_mode_defaults_to_playground_only(self) -> None: client = self._load_client(runtime_mode="production") response = client.get("/api/capabilities") self.assertEqual(response.status_code, 200) payload = response.json() self.assertEqual(payload["runtime_mode"], "production") self.assertTrue(payload["features"]["playground"]) self.assertFalse(payload["features"]["audio_studio"]) self.assertFalse(payload["features"]["video_studio"]) self.assertFalse(payload["features"]["post_production"]) self.assertTrue(payload["ui"]["show_runtime_help"])