"""Upgraded OCR must not identify a customer solely by their avatar.""" import unittest from unittest import mock import numpy as np from wechat_bot import WeChatBot class VisualNameCacheAuditTest(unittest.TestCase): def bot(self): bot = WeChatBot.__new__(WeChatBot) bot._strict_visual_actions = True bot.identity_by_name = True bot._row_display_name = mock.Mock(return_value='') bot._raw_session_fingerprint = mock.Mock(return_value=b'a' * 8) bot._canonical_fp = mock.Mock(side_effect=lambda raw: raw) bot._row_name_panel = mock.Mock(side_effect=lambda image, *args, **kwargs: image) reader = mock.Mock() reader.canonical.side_effect = lambda name: name reader.read_deep.side_effect = [('客户甲@微信', .99), ('客户乙@微信', .99)] bot._name_reader_instance = reader return bot def panels(self): first = np.full((20, 120, 3), 245, dtype=np.uint8) first[4:16, 10:16] = 30 second = first.copy() second[4:16, 30:36] = 30 return first, second def test_same_avatar_different_names_run_separate_ocr(self): bot = self.bot() first, second = self.panels() self.assertEqual(bot._row_display_name_deep(first, 30), '客户甲@微信') self.assertEqual(bot._row_display_name_deep(second, 30), '客户乙@微信') self.assertEqual(bot._name_reader_instance.read_deep.call_count, 2) self.assertEqual(bot._row_name_deep_cached(first, 30), '客户甲@微信') self.assertEqual(bot._row_name_deep_cached(second, 30), '客户乙@微信') def test_same_visible_name_reuses_cached_result_across_row_reorder(self): bot = self.bot() first, _ = self.panels() self.assertEqual(bot._row_display_name_deep(first, 30), '客户甲@微信') self.assertEqual(bot._row_display_name_deep(first.copy(), 90), '客户甲@微信') self.assertEqual(bot._name_reader_instance.read_deep.call_count, 1) def test_unreadable_crop_does_not_reuse_an_avatar_only_name(self): bot = self.bot() first, second = self.panels() self.assertEqual(bot._row_display_name_deep(first, 30), '客户甲@微信') bot._row_name_panel.return_value = None bot._row_name_panel.side_effect = None self.assertEqual(bot._row_name_deep_cached(second, 30), '') if __name__ == '__main__': unittest.main()