"""样本信息管理:进度展示码与证/保险已办理判定。""" import unittest from datetime import datetime from types import SimpleNamespace from app.services.sample_info_progress import ( collection_progress, insurance_handled, qc_progress, reception_progress, storage_cert_handled, storage_progress, sync_handle_status_fields, ) class TestCollectionProgress(unittest.TestCase): def test_empty(self): self.assertEqual(collection_progress(""), ("uncollected", "未采集")) def test_collected_includes_mid_states(self): for st in ("ycj", "jcz", "yrk"): self.assertEqual(collection_progress(st)[0], "collected") self.assertEqual(collection_progress("ycj")[1], "已采集") def test_void(self): self.assertEqual(collection_progress("yzf"), ("voided", "已作废")) class TestReceptionProgress(unittest.TestCase): def test_missing_or_pending(self): self.assertEqual(reception_progress(None)[0], "none") self.assertEqual(reception_progress({"acceptConclusion": "dqr"})[0], "none") self.assertEqual(reception_progress({"acceptConclusion": ""})[0], "none") def test_accept_reject(self): self.assertEqual(reception_progress({"acceptConclusion": "js"}), ("js", "已接收")) self.assertEqual(reception_progress({"acceptConclusion": "bj"}), ("bj", "拒收")) class TestQcProgress(unittest.TestCase): def test_none(self): self.assertEqual(qc_progress(None)[0], "incomplete") def test_complete_pass_or_fail(self): self.assertEqual(qc_progress({"qcConclusion": "tg", "qcWorkOrderStatus": "ywc"})[0], "complete") self.assertEqual(qc_progress({"qcConclusion": "btg", "qcWorkOrderStatus": "ywc"})[0], "complete") def test_void(self): self.assertEqual(qc_progress({"qcWorkOrderStatus": "yzf"})[0], "voided") def test_in_progress(self): self.assertEqual(qc_progress({"qcWorkOrderStatus": "ypz", "qcConclusion": ""})[0], "incomplete") class TestStorageProgress(unittest.TestCase): def test_none_or_pending(self): self.assertEqual(storage_progress(None)[0], "none") self.assertEqual(storage_progress({"storageStatus": "drk"})[0], "none") def test_in_and_reject(self): self.assertEqual(storage_progress({"storageStatus": "yrk"})[0], "yrk") self.assertEqual( storage_progress({"storageStatus": "drk", "reviewConclusion": "btg"})[0], "rejected", ) class TestHandleFlags(unittest.TestCase): def test_cert_handle_time_wins(self): row = SimpleNamespace(handle_time=datetime(2026, 10, 1, 8, 0), make_status="0", make_date="") self.assertTrue(storage_cert_handled(row)) def test_cert_legacy_make_status(self): row = SimpleNamespace(handle_time=None, make_status="1", make_date="") self.assertTrue(storage_cert_handled(row)) def test_cert_legacy_make_date(self): row = SimpleNamespace(handle_time=None, make_status="0", make_date="20260101") self.assertTrue(storage_cert_handled(row)) def test_cert_empty(self): self.assertFalse(storage_cert_handled(None)) row = SimpleNamespace(handle_time=None, make_status="0", make_date="") self.assertFalse(storage_cert_handled(row)) def test_insurance_legacy_todo_or_date(self): self.assertTrue( insurance_handled(SimpleNamespace(handle_time=None, todo_status="1", handle_date="")) ) self.assertTrue( insurance_handled(SimpleNamespace(handle_time=None, todo_status="0", handle_date="20260131")) ) self.assertFalse( insurance_handled(SimpleNamespace(handle_time=None, todo_status="0", handle_date="")) ) class TestSyncHandleStatus(unittest.TestCase): def test_set_and_clear(self): ht = datetime(2026, 10, 5, 15, 0, 0) st, ymd = sync_handle_status_fields(ht) self.assertEqual(st, "1") self.assertEqual(ymd, "20261005") st2, ymd2 = sync_handle_status_fields(None) self.assertEqual(st2, "0") self.assertEqual(ymd2, "")