import json import unittest from scripts.evaluate_parser_model import _compare_subset from training_coach.parser import parse_model_response from tests.fixtures.parser_acceptance import PARSER_ACCEPTANCE_FIXTURES class ParserFixturesTest(unittest.TestCase): def test_all_acceptance_fixtures_validate_against_parser_schema(self): for fixture in PARSER_ACCEPTANCE_FIXTURES: with self.subTest(fixture=fixture["name"]): parsed = parse_model_response(json.dumps(fixture["expected"])) self.assertEqual(parsed.check_in.raw_text, fixture["raw_text"]) def test_fixture_names_are_unique(self): names = [fixture["name"] for fixture in PARSER_ACCEPTANCE_FIXTURES] self.assertEqual(len(names), len(set(names))) def test_fixture_set_covers_required_cases(self): names = {fixture["name"] for fixture in PARSER_ACCEPTANCE_FIXTURES} self.assertIn("short_time_poor_sleep_low_energy", names) self.assertIn("high_energy_long_session", names) self.assertIn("specific_pain_issue", names) self.assertIn("ambiguous_pain_issue", names) self.assertIn("recent_10k_context_signal", names) def test_evaluator_allows_related_free_text_but_keeps_labels_strict(self): self.assertEqual( _compare_subset( {"follow_up_questions": ["How are your legs after yesterday's run?"]}, {"follow_up_questions": ["How are your legs and energy after the run?"]}, ), [], ) self.assertTrue( _compare_subset( {"context_signals": [{"label": "recent_endurance_run"}]}, {"context_signals": [{"label": "Recent Activity"}]}, ) ) if __name__ == "__main__": unittest.main()