import unittest import os import sys os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") sys.path.insert(0, os.path.dirname(__file__)) from _helpers import TempDirMixin from app import gui from app import accounts if gui.QT_IMPORT_ERROR is not None: raise unittest.SkipTest("PySide6 未安装") from PySide6.QtWidgets import QApplication, QLineEdit from app.gui import AccountDialog, AccountsTab, MainWindow, TAB_STYLE, TAB_TITLES class GuiTests(TempDirMixin, unittest.TestCase): @classmethod def setUpClass(cls): cls.app = QApplication.instance() or QApplication([]) def make_config(self, temp_dir): return { "chrome_path": "chrome.exe", "user_data_root": os.path.join(temp_dir, "chrome_user_data_dir"), "db_path": os.path.join(temp_dir, "cmshopee.db"), "debug_port_range": [9222, 9260], } def test_main_window_has_five_tabs_in_workflow_order(self): with self.make_temp_dir() as temp_dir: window = MainWindow(config=self.make_config(temp_dir)) self.addCleanup(window.close) self.assertEqual(5, window.tabs.count()) self.assertEqual( TAB_TITLES, [window.tabs.tabText(index) for index in range(window.tabs.count())], ) self.assertEqual("就绪", window.statusBar().currentMessage()) self.assertEqual(TAB_STYLE, window.tabs.styleSheet()) self.assertIn("min-width: 128px", window.tabs.styleSheet()) self.assertIn("padding: 8px 18px", window.tabs.styleSheet()) self.assertIn("margin-right: 8px", window.tabs.styleSheet()) self.assert_removed(temp_dir) def test_tab_switch_updates_status_bar(self): with self.make_temp_dir() as temp_dir: window = MainWindow(config=self.make_config(temp_dir)) self.addCleanup(window.close) window.tabs.setCurrentIndex(2) self.assertEqual("③ 更新shopee", window.tabs.tabText(window.tabs.currentIndex())) self.assertEqual("当前:③ 更新shopee", window.statusBar().currentMessage()) self.assert_removed(temp_dir) def test_accounts_tab_lists_accounts_without_showing_password(self): with self.make_temp_dir() as temp_dir: cfg = self.make_config(temp_dir) accounts.create_account( "主店", "alias", "seller.shopee.tw", 9222, password="secret", config=cfg, ) window = MainWindow(config=cfg) self.addCleanup(window.close) tab = window.tabs.widget(TAB_TITLES.index("④ 账号管理")) self.assertIsInstance(tab, AccountsTab) self.assertEqual(1, tab.table.rowCount()) self.assertEqual("主店", tab.table.item(0, 0).text()) self.assertEqual("alias", tab.table.item(0, 1).text()) self.assertEqual("未知", tab.table.item(0, 4).text()) visible_values = [ tab.table.item(0, column).text() for column in range(tab.table.columnCount()) if tab.table.item(0, column) is not None ] self.assertNotIn("secret", visible_values) self.assert_removed(temp_dir) def test_account_dialog_masks_password_field(self): with self.make_temp_dir() as temp_dir: cfg = self.make_config(temp_dir) account = accounts.create_account( "主店", "alias", debug_port=9222, password="secret", config=cfg, ) dialog = AccountDialog(account=account, config=cfg) self.addCleanup(dialog.close) self.assertEqual(QLineEdit.Password, dialog.password_edit.echoMode()) self.assertEqual("secret", dialog.password_edit.text()) self.assertIn(account.slug, dialog.user_data_dir_edit.text()) self.assert_removed(temp_dir) def test_accounts_tab_updates_login_status_cell(self): with self.make_temp_dir() as temp_dir: cfg = self.make_config(temp_dir) accounts.create_account("主店", "alias", debug_port=9222, config=cfg) tab = AccountsTab(config=cfg) self.addCleanup(tab.close) tab._on_login_check_finished( {"alias": "alias", "status": {"logged_in": True, "reason": None}} ) self.assertEqual("已登录", tab.table.item(0, 4).text()) self.assert_removed(temp_dir) if __name__ == "__main__": unittest.main()