import unittest from app.crud.production_task_set import ( collect_missing_route_ids, normalize_item_payload, skip_empty_named_tasks, ) class TestNormalizeItemPayload(unittest.TestCase): def test_requires_task_name(self): self.assertIsNone(normalize_item_payload({"taskName": " ", "routeId": "r1"})) def test_keeps_optional_fields(self): item = normalize_item_payload( { "taskName": "分离", "routeId": " r1 ", "description": " d ", "remark": " m ", } ) self.assertEqual( item, { "task_name": "分离", "route_id": "r1", "description": "d", "remark": "m", }, ) def test_empty_route_becomes_none(self): item = normalize_item_payload({"taskName": "培养", "routeId": ""}) self.assertEqual(item["route_id"], None) self.assertEqual(item["description"], None) self.assertEqual(item["remark"], None) class TestSkipEmptyNamedTasks(unittest.TestCase): def test_skips_blank_names_and_counts(self): kept, skipped = skip_empty_named_tasks( [ {"task_name": "A", "route_id": "r1", "description": None, "remark": "x"}, {"task_name": " ", "route_id": "r2"}, {"task_name": None, "route_id": None}, ] ) self.assertEqual(skipped, 2) self.assertEqual(len(kept), 1) self.assertEqual(kept[0]["task_name"], "A") self.assertEqual(kept[0]["remark"], "x") class TestCollectMissingRouteIds(unittest.TestCase): def test_empty_route_not_missing(self): self.assertEqual( collect_missing_route_ids( [{"route_id": None}, {"route_id": ""}], {"alive"}, ), [], ) def test_lists_missing_preserving_order_unique(self): self.assertEqual( collect_missing_route_ids( [{"route_id": "gone"}, {"route_id": "alive"}, {"route_id": "gone"}], {"alive"}, ), ["gone"], ) if __name__ == "__main__": unittest.main()