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