57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
"""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()
|