"""协议/捐赠列表 sampleItems 接收与质检摘要字段。""" import unittest from unittest.mock import MagicMock class TestSampleItemReceptionQcFields(unittest.TestCase): """纯函数:把接收/质检结论摘要合并进列表样本行字段。""" def test_empty_when_no_reception_or_qc(self): from app.services.protocol_sample_list_summary import ( build_sample_item_reception_qc_fields, ) out = build_sample_item_reception_qc_fields(None, None) self.assertEqual(out["receptionAcceptConclusion"], "") self.assertEqual(out["receptionAcceptConclusionLabel"], "") self.assertEqual(out["receptionRemark"], "") self.assertEqual(out["qcConclusion"], "") self.assertEqual(out["qcConclusionLabel"], "") def test_accept_with_remark_and_qc_conclusion(self): from app.services.protocol_sample_list_summary import ( build_sample_item_reception_qc_fields, ) out = build_sample_item_reception_qc_fields( {"acceptConclusion": "js", "remark": "外观正常"}, {"qcConclusion": "tg", "qcConclusionLabel": "合格"}, ) self.assertEqual(out["receptionAcceptConclusion"], "js") self.assertEqual(out["receptionAcceptConclusionLabel"], "接收") self.assertEqual(out["receptionRemark"], "外观正常") self.assertEqual(out["qcConclusion"], "tg") self.assertEqual(out["qcConclusionLabel"], "合格") def test_reject_without_qc(self): from app.services.protocol_sample_list_summary import ( build_sample_item_reception_qc_fields, ) out = build_sample_item_reception_qc_fields( {"acceptConclusion": "bj", "remark": "破损"}, None, ) self.assertEqual(out["receptionAcceptConclusion"], "bj") self.assertEqual(out["receptionAcceptConclusionLabel"], "拒收") self.assertEqual(out["receptionRemark"], "破损") self.assertEqual(out["qcConclusion"], "") self.assertEqual(out["qcConclusionLabel"], "") class TestListReceptionSummaryMap(unittest.TestCase): def test_picks_later_reception_time(self): from datetime import datetime from app.services.protocol_sample_list_summary import ( get_list_reception_summary_map_by_sample_codes, ) early = MagicMock() early.sample_code = "SC-001" early.accept_conclusion = "bj" early.remark = "old" early.reception_time = datetime(2026, 1, 1, 8, 0, 0) late = MagicMock() late.sample_code = "SC-001" late.accept_conclusion = "js" late.remark = "new" late.reception_time = datetime(2026, 2, 1, 8, 0, 0) db = MagicMock() q = MagicMock() db.query.return_value = q q.filter.return_value = q q.all.return_value = [early, late] out = get_list_reception_summary_map_by_sample_codes( db, "t1", ["SC-001"], reception_source="cell_storage" ) self.assertEqual(out["SC-001"]["acceptConclusion"], "js") self.assertEqual(out["SC-001"]["remark"], "new") def test_keyed_by_sample_code(self): from app.services.protocol_sample_list_summary import ( get_list_reception_summary_map_by_sample_codes, ) rec = MagicMock() rec.sample_code = "SC-001" rec.accept_conclusion = "js" rec.remark = "ok" rec.reception_time = None db = MagicMock() q = MagicMock() db.query.return_value = q q.filter.return_value = q q.all.return_value = [rec] out = get_list_reception_summary_map_by_sample_codes( db, "t1", ["SC-001"], reception_source="cell_storage" ) self.assertEqual(out["SC-001"]["acceptConclusion"], "js") self.assertEqual(out["SC-001"]["remark"], "ok") class TestListQcConclusionMap(unittest.TestCase): def test_uses_stored_conclusion(self): from app.services.protocol_sample_list_summary import ( get_list_qc_conclusion_map_by_sample_codes, ) wo = MagicMock() wo.id = "wo1" wo.sample_code = "SC-001" wo.conclusion = "tg" wo.work_order_no = "ZJ202609010001" wo.work_order_status = "ywc" db = MagicMock() q = MagicMock() db.query.return_value = q q.filter.return_value = q q.all.return_value = [wo] out = get_list_qc_conclusion_map_by_sample_codes( db, "t1", ["SC-001"], reception_source="cell_storage" ) self.assertEqual(out["SC-001"]["qcConclusion"], "tg") self.assertEqual(out["SC-001"]["qcConclusionLabel"], "合格") self.assertEqual(out["SC-001"]["qcWorkOrderNo"], "ZJ202609010001") self.assertEqual(out["SC-001"]["qcWorkOrderStatus"], "ywc") self.assertEqual(out["SC-001"]["qcWorkOrderStatusLabel"], "已完成") class TestListGateQcSummaryByReceptionIds(unittest.TestCase): def test_keyed_by_reception_id(self): from app.services.protocol_sample_list_summary import ( get_list_gate_qc_summary_map_by_reception_ids, ) wo = MagicMock() wo.id = "wo1" wo.reception_id = "rec1" wo.conclusion = "btg" wo.work_order_no = "ZJ202609010002" wo.work_order_status = "ypz" db = MagicMock() q = MagicMock() db.query.return_value = q q.filter.return_value = q q.all.return_value = [wo] out = get_list_gate_qc_summary_map_by_reception_ids(db, "t1", ["rec1"]) self.assertEqual(out["rec1"]["qcWorkOrderNo"], "ZJ202609010002") self.assertEqual(out["rec1"]["qcWorkOrderStatus"], "ypz") self.assertEqual(out["rec1"]["qcWorkOrderStatusLabel"], "已配置") self.assertEqual(out["rec1"]["qcConclusion"], "btg") self.assertEqual(out["rec1"]["qcConclusionLabel"], "不合格") if __name__ == "__main__": unittest.main()