from pathlib import Path import json import sys from unittest import mock from PySide6.QtCore import Qt, QRect from PySide6.QtTest import QTest from PySide6.QtWidgets import QApplication import wechat_gui_qt as qt from test_review_assistant_picker_layout import ACCOUNT, NAMED, ANONYMOUS, DIRECTORY app = QApplication.instance() or QApplication([]) qt._register_bundled_fonts() app.setStyle('Fusion') app.setStyleSheet(qt.APP_QSS) app.setFont(qt._ui_font(9)) with mock.patch.object(qt.QTimer, 'singleShot'), mock.patch.object(qt.ReviewAssistantPicker, '_available_geometry', lambda _self: (QRect(0, 0, 640, 360) if len(sys.argv) > 3 else QRect(0, 0, 1280, 720))): dialog = qt.ReviewAssistantPicker(ACCOUNT, current_recipient_id=NAMED['id']) dialog._filter = 'all' for key, button in dialog.filter_buttons.items(): button.setChecked(key == 'all') dialog._serial = 1 long_directory = {**DIRECTORY, 'name': '李助理(夜班值守与客户回访专用私人微信)'} dialog._loaded({'ready': True, 'account_id': ACCOUNT, '_serial': 1, 'items': [NAMED, ANONYMOUS, long_directory], 'total': 3, 'all_total': 3, 'all_selectable_total': 2, 'all_contact_total': 1}) dialog.show(); app.processEvents() root = Path(sys.argv[1]); suffix = sys.argv[2] result = {'scale': suffix, 'dpr': dialog.devicePixelRatioF(), 'screens': {}} for index, scenario in ((0, 'named'), (1, 'anonymous'), (2, 'directory')): item = dialog.contacts.item(index) QTest.mouseClick(dialog.contacts.viewport(), Qt.MouseButton.LeftButton, pos=dialog.contacts.visualItemRect(item).center()) dialog.query.setFocus(); app.processEvents() assert item.isSelected() and not item.icon().isNull() assert dialog.choose.isEnabled() == (scenario != 'directory') assert dialog.contacts.horizontalScrollBar().maximum() == 0 assert dialog.grab().save(str(root / f'picker-{scenario}-{suffix}.png')) result['screens'][scenario] = {'logical_size': [dialog.width(), dialog.height()], 'horizontal_scroll_max': dialog.contacts.horizontalScrollBar().maximum(), 'details_height': dialog.details_reason.height(), 'confirm_enabled': dialog.choose.isEnabled()} (root / f'picker-layout-{suffix}.json').write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding='utf-8') print(json.dumps(result, ensure_ascii=False)) dialog.reject()