from __future__ import annotations import unittest from pathlib import Path class EnvExampleContractTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.env_example = (Path(__file__).resolve().parent.parent / ".env.example").read_text( encoding="utf-8", ) def test_env_example_includes_required_runtime_keys(self) -> None: self.assertIn("ADMIN_TOKEN=replace-with-a-long-random-secret", self.env_example) self.assertIn("HOST=127.0.0.1", self.env_example) self.assertIn("PORT=8000", self.env_example) self.assertIn("AIFORECAST_START_WITH_WINDOWS=true", self.env_example) self.assertIn("DEFAULT_FORECAST_CONTEXT_LENGTH=384", self.env_example) self.assertIn("ALLOWED_FORECAST_CONTEXT_LENGTHS=128,256,384,512", self.env_example) self.assertIn("FORECAST_WORKER_IDLE_TTL_MS=120000", self.env_example) def test_env_example_includes_model_and_provider_placeholders(self) -> None: self.assertIn("PRELOAD_TIMESFM=false", self.env_example) self.assertIn("PRELOAD_KRONOS=false", self.env_example) self.assertIn("PRELOAD_CHRONOS=false", self.env_example) self.assertIn("TORCH_NUM_THREADS=2", self.env_example) self.assertIn("TORCH_NUM_INTEROP_THREADS=1", self.env_example) self.assertIn("OMP_NUM_THREADS=2", self.env_example) self.assertIn("MKL_NUM_THREADS=2", self.env_example) self.assertIn("TIMESFM_MODEL_HF_ID=google/timesfm-2.5-200m-pytorch", self.env_example) self.assertIn("KRONOS_MODEL_HF_ID=NeoQuasar/Kronos-base", self.env_example) self.assertIn("CHRONOS_MODEL_HF_ID=amazon/chronos-2", self.env_example) self.assertIn("TWELVEDATA_API_KEY=", self.env_example) self.assertIn("FINNHUB_API_KEY=", self.env_example) self.assertIn("BINANCE_API_KEY=", self.env_example) self.assertIn("BYBIT_API_KEY=", self.env_example) if __name__ == "__main__": unittest.main()