import unittest from unittest.mock import patch from training_coach.parser_runtime import ( DEFAULT_TRANSFORMERS_MODEL, PARSER_MODEL, MODEL_CACHE_ENV_VAR, ParserRuntimeUnavailableError, _load_transformers, generate_parser_response, load_parser_model, parse_check_in_with_model, ) class ParserRuntimeTest(unittest.TestCase): def tearDown(self): load_parser_model.cache_clear() def test_runtime_exports_model_name(self): self.assertEqual(PARSER_MODEL, "Qwen/Qwen2.5-1.5B-Instruct") self.assertEqual(DEFAULT_TRANSFORMERS_MODEL, "Qwen/Qwen3-1.7B") def test_runtime_uses_default_huggingface_cache_by_default(self): self.assertEqual(MODEL_CACHE_ENV_VAR, "PARSER_MODEL_CACHE_DIR") def test_load_parser_model_uses_default_hf_cache_without_override(self): class FakeTokenizer: @classmethod def from_pretrained(cls, model_name, cache_dir=None): return {"model_name": model_name, "cache_dir": cache_dir} class FakeModel: @classmethod def from_pretrained(cls, model_name, **kwargs): return {"model_name": model_name, **kwargs} load_parser_model.cache_clear() with patch.dict("os.environ", {}, clear=True), patch( "training_coach.parser_runtime._load_transformers", return_value=(FakeModel, FakeTokenizer), ): tokenizer, model = load_parser_model("test/model") self.assertIsNone(tokenizer["cache_dir"]) self.assertIsNone(model["cache_dir"]) def test_load_parser_model_allows_explicit_cache_override(self): class FakeTokenizer: @classmethod def from_pretrained(cls, model_name, cache_dir=None): return {"model_name": model_name, "cache_dir": cache_dir} class FakeModel: @classmethod def from_pretrained(cls, model_name, **kwargs): return {"model_name": model_name, **kwargs} load_parser_model.cache_clear() with patch.dict( "os.environ", {MODEL_CACHE_ENV_VAR: "/tmp/parser-cache"}, clear=True, ), patch( "training_coach.parser_runtime._load_transformers", return_value=(FakeModel, FakeTokenizer), ): tokenizer, model = load_parser_model("test/model") self.assertEqual(tokenizer["cache_dir"], "/tmp/parser-cache") self.assertEqual(model["cache_dir"], "/tmp/parser-cache") def test_runtime_can_import_transformers_or_reports_clear_error(self): try: loaded = _load_transformers() except ParserRuntimeUnavailableError as error: self.assertIn("Install transformers", str(error)) else: self.assertEqual(len(loaded), 2) def test_runtime_functions_are_callable(self): self.assertTrue(callable(generate_parser_response)) self.assertTrue(callable(parse_check_in_with_model)) if __name__ == "__main__": unittest.main()