"""Synthetic OCR identity and malformed-result regressions; no desktop access.""" import unittest from unittest import mock import numpy as np from session_name import NameReader, session_id_for class VisualIdentityAuditTest(unittest.TestCase): def test_different_customer_names_one_character_apart_stay_separate(self): for first, second in (("客户甲@微信", "客户乙@微信"), ("小王@微信", "小李@微信"), ("会员0001", "会员0002"), ("王晓明", "王小明"), ("门店客服甲", "门店客服乙")): with self.subTest(first=first, second=second): reader = NameReader() reader.remember(first) normalized = reader.canonical(second) self.assertEqual(normalized, second) self.assertNotEqual(session_id_for(normalized), session_id_for(first)) def test_high_confidence_ocr_does_not_reuse_other_customers_history_key(self): reader = NameReader() with mock.patch.object(reader, "read_raw", side_effect=[("客户甲@微信", .99), ("客户乙@微信", .99)]): first = reader.read(np.zeros((20, 80, 3), dtype=np.uint8), b"first-frame") second = reader.read(np.zeros((20, 80, 3), dtype=np.uint8), b"second-frame") self.assertNotEqual(session_id_for(first), session_id_for(second)) self.assertEqual(reader.known_names(), ["客户乙@微信", "客户甲@微信"]) def test_frequency_does_not_change_a_new_customers_identity(self): reader = NameReader() reader._known = {"客户甲@微信": 10000, "客户乙@微信": 2} self.assertEqual(reader.canonical("客户丙@微信"), "客户丙@微信") def test_non_finite_confidence_cannot_be_used_as_identity(self): for score in (float("nan"), float("inf"), -float("inf"), 1.5): with self.subTest(score=score): reader = NameReader() with mock.patch.object(reader, "read_raw", return_value=("客户甲", score)): self.assertEqual(reader.read(np.zeros((20, 80, 3), dtype=np.uint8)), "") def test_malformed_layout_item_does_not_drop_valid_following_item(self): valid = [[[2, 2], [40, 2], [40, 18], [2, 18]], "消息", .99] invalid = [ [[[float("inf"), 2], [40, 2], [40, 18], [2, 18]], "broken box", .99], [[[2, 2], [40, 2], [40, 18], [2, 18]], "bad score", float("nan")], [[[2, 2], [40, 2], [40, 18], [2, 18]], "impossible score", 1.5], ] reader = NameReader() reader._engine = mock.Mock(return_value=(invalid + [valid], None)) self.assertEqual([item["text"] for item in reader.read_layout(np.zeros((30, 60, 3), dtype=np.uint8))], ["消息"]) if __name__ == "__main__": unittest.main()