fix(accounts): keep first login launch in one window

This commit is contained in:
chengma
2026-07-14 17:22:52 +08:00
parent a4ac3f8ee5
commit 699625ea0e
10 changed files with 608 additions and 60 deletions
+89 -2
View File
@@ -7231,7 +7231,9 @@ class GuiTests(TempDirMixin, unittest.TestCase):
with mock.patch("app.gui.AccountDialog", FakeDialog), mock.patch(
"app.gui.QMessageBox.warning"
) as warning:
) as warning, mock.patch(
"app.gui.accounts.launch_for_login"
) as launch_for_login:
tab.add_account()
warning.assert_called_once()
@@ -7247,6 +7249,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
self.assertNotIn("plain-password", visible_values)
self.assertIn("账号已新增", statuses[-1])
self.assertNotIn("plain-password", statuses[-1])
launch_for_login.assert_not_called()
self.assert_removed(temp_dir)
@@ -9045,6 +9048,10 @@ class GuiTests(TempDirMixin, unittest.TestCase):
"pid": 1234,
"target_id": "target-new",
"url": "https://seller.shopee.tw/portal/",
"created_tab": False,
"startup_target_reused": True,
"startup_page_navigated": False,
"page_target_count": 1,
},
) as launch_for_login:
tab.launch_login()
@@ -9061,6 +9068,10 @@ class GuiTests(TempDirMixin, unittest.TestCase):
self.assertIn("step=launch_chrome result=launched", messages)
self.assertIn("pid=1234", messages)
self.assertIn("target_id=target-new", messages)
self.assertIn("created_tab=0", messages)
self.assertIn("startup_target_reused=1", messages)
self.assertTrue(tab.table.isEnabled())
self.assertTrue(tab.add_button.isEnabled())
self.assert_removed(temp_dir)
@@ -9083,10 +9094,12 @@ class GuiTests(TempDirMixin, unittest.TestCase):
},
) as launch_for_login:
tab.launch_login()
tab.table.selectRow(0)
tab.launch_login()
launch_for_login.assert_called_once_with(account, config=cfg)
self.assertEqual("已启动", tab.login_statuses["alias-a"])
self.assertIn("已复用现有窗口", statuses[-1])
self.assertTrue(any("已复用现有窗口" in message for message in statuses))
run_log = db.list_run_logs(limit=1, run_type="chrome_launch", path=cfg["db_path"])[0]
self.assertEqual("done", run_log.status)
self.assertEqual(1, run_log.success_count)
@@ -9096,7 +9109,81 @@ class GuiTests(TempDirMixin, unittest.TestCase):
self.assertIn("step=launch_chrome result=reused", messages)
self.assertIn("target_id=target-existing", messages)
self.assertIn("url=https://seller.shopee.tw/portal/", messages)
self.assertIn("result=ignored", messages)
self.assert_removed(temp_dir)
def test_accounts_tab_ignores_reentrant_launch_and_restores_controls(self):
with self.make_temp_dir() as temp_dir:
cfg = self.make_config(temp_dir)
account = accounts.create_account("主店", "alias-a", debug_port=9222, config=cfg)
statuses = []
tab = AccountsTab(config=cfg, status_callback=statuses.append)
self.addCleanup(tab.close)
tab.table.selectRow(0)
def launch_once(selected_account, config=None):
self.assertEqual(account, selected_account)
self.assertEqual(cfg, config)
self.assertFalse(tab.table.isEnabled())
self.assertFalse(tab.add_button.isEnabled())
self.assertFalse(tab.launch_button.isEnabled())
tab.launch_login()
return {
"action": "launched",
"pid": 1234,
"target_id": "target-initial",
"url": "https://seller.shopee.tw/portal/",
"created_tab": False,
"startup_target_reused": True,
"page_target_count": 1,
}
with mock.patch(
"app.gui.accounts.launch_for_login",
side_effect=launch_once,
) as launch_for_login:
tab.launch_login()
launch_for_login.assert_called_once_with(account, config=cfg)
self.assertTrue(tab.table.isEnabled())
self.assertTrue(tab.add_button.isEnabled())
run_logs = db.list_run_logs(
limit=10,
run_type="chrome_launch",
path=cfg["db_path"],
)
self.assertEqual(1, len(run_logs))
events = db.list_run_log_events(run_logs[0].id, path=cfg["db_path"])
messages = "\n".join(event.message for event in events)
self.assertIn("result=ignored", messages)
self.assertIn("reason=launch_in_progress", messages)
self.assertTrue(any("正在启动" in message for message in statuses))
self.assert_removed(temp_dir)
def test_accounts_tab_launch_failure_restores_controls(self):
with self.make_temp_dir() as temp_dir:
cfg = self.make_config(temp_dir)
accounts.create_account("主店", "alias-a", debug_port=9222, config=cfg)
tab = AccountsTab(config=cfg)
self.addCleanup(tab.close)
tab.table.selectRow(0)
with mock.patch(
"app.gui.accounts.launch_for_login",
side_effect=RuntimeError("启动失败"),
), mock.patch("app.gui.QMessageBox.warning"):
tab.launch_login()
self.assertTrue(tab.table.isEnabled())
self.assertTrue(tab.add_button.isEnabled())
self.assertTrue(tab.launch_button.isEnabled())
run_log = db.list_run_logs(
limit=1,
run_type="chrome_launch",
path=cfg["db_path"],
)[0]
self.assertEqual("failed", run_log.status)
if __name__ == "__main__":
unittest.main()