feat: polish Shopee update checks
This commit is contained in:
@@ -100,6 +100,14 @@ class DbTests(TempDirMixin, unittest.TestCase):
|
||||
self.assertEqual("generated", generated.stage)
|
||||
self.assertEqual("新标题", generated.new_title)
|
||||
|
||||
db.mark_failed(task.id, "generate", "标题需调整", path=db_path)
|
||||
db.update_generated_title(task.id, "人工标题", path=db_path)
|
||||
edited = db.list_tasks(path=db_path)[0]
|
||||
self.assertEqual("generated", edited.stage)
|
||||
self.assertEqual("pending", edited.status)
|
||||
self.assertEqual("人工标题", edited.new_title)
|
||||
self.assertIsNone(edited.last_error)
|
||||
|
||||
db.set_applied(task.id, False, "按钮禁用", path=db_path)
|
||||
apply_failed = db.list_tasks(path=db_path)[0]
|
||||
self.assertEqual("generated", apply_failed.stage)
|
||||
@@ -112,6 +120,8 @@ class DbTests(TempDirMixin, unittest.TestCase):
|
||||
self.assertEqual("success", applied.status)
|
||||
self.assertEqual(1, applied.committed)
|
||||
self.assertEqual(2, applied.apply_attempts)
|
||||
with self.assertRaises(db.DbError):
|
||||
db.update_generated_title(task.id, "线上后改标题", path=db_path)
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
|
||||
|
||||
+75
-7
@@ -634,6 +634,46 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
||||
self.assert_removed(temp_dir)
|
||||
|
||||
|
||||
def test_generate_tab_allows_editing_generated_title_locally(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)
|
||||
batch_id = db.create_batch(["input.xlsx"], path=cfg["db_path"])
|
||||
db.insert_tasks(
|
||||
batch_id,
|
||||
[
|
||||
{
|
||||
"source_file_abs": os.path.join(temp_dir, "input.xlsx"),
|
||||
"source_sheet": "商品",
|
||||
"source_row": 2,
|
||||
"account_name": "Excel主店",
|
||||
"alias": "alias-a",
|
||||
"item_id": "51100639510",
|
||||
}
|
||||
],
|
||||
path=cfg["db_path"],
|
||||
)
|
||||
task = db.list_tasks(batch_id=batch_id, path=cfg["db_path"])[0]
|
||||
db.set_collected(task.id, "旧标题", "old.jpg", path=cfg["db_path"])
|
||||
db.set_generated(task.id, "AI标题", "new.jpg", path=cfg["db_path"])
|
||||
db.mark_failed(task.id, "generate", "标题需微调", path=cfg["db_path"])
|
||||
statuses = []
|
||||
tab = GenerateTab(config=cfg, status_callback=statuses.append)
|
||||
self.addCleanup(tab.close)
|
||||
index = tab.model.index(0, 3)
|
||||
|
||||
self.assertTrue(bool(tab.model.flags(index) & gui.Qt.ItemIsEditable))
|
||||
self.assertTrue(tab.model.setData(index, "人工微调标题", gui.Qt.EditRole))
|
||||
|
||||
updated = db.get_task(task.id, path=cfg["db_path"])
|
||||
self.assertEqual("generated", updated.stage)
|
||||
self.assertEqual("pending", updated.status)
|
||||
self.assertEqual("人工微调标题", updated.new_title)
|
||||
self.assertIsNone(updated.last_error)
|
||||
self.assertEqual("人工微调标题", tab.model.index(0, 3).data())
|
||||
self.assertIn("已修改新标题", statuses[-1])
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
def test_generate_tab_resets_selected_generated_result_and_writes_reset_log(self):
|
||||
with self.make_temp_dir() as temp_dir:
|
||||
cfg = self.make_config(temp_dir)
|
||||
@@ -934,11 +974,14 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
||||
|
||||
self.assertIsInstance(tab.task_table, QTableView)
|
||||
self.assertEqual(["店铺", "商品ID", "新标题", "新封面", "阶段", "结果"], tab.model.HEADERS)
|
||||
self.assertEqual("预览本轮更新", tab.preview_update_button.text())
|
||||
self.assertEqual("检查本轮更新", tab.preview_update_button.text())
|
||||
self.assertEqual("开始更新", tab.start_update_button.text())
|
||||
self.assertEqual("applyItemFilter", tab.item_filter.objectName())
|
||||
self.assertEqual("停止", tab.stop_update_button.text())
|
||||
self.assertEqual("重置更新状态", tab.reset_update_button.text())
|
||||
self.assertTrue(tab.reset_update_button.isHidden())
|
||||
self.assertEqual(gui.Qt.CustomContextMenu, tab.task_table.contextMenuPolicy())
|
||||
self.assertEqual("startUpdateButton", tab.start_update_button.objectName())
|
||||
self.assertFalse(tab.stop_update_button.isEnabled())
|
||||
self.assertEqual(2, tab.model.rowCount())
|
||||
self.assertEqual("主店", tab.model.index(0, 0).data())
|
||||
@@ -1212,7 +1255,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
||||
self.assertTrue(tab.apply_worker.dry_run)
|
||||
self.assertTrue(tab.apply_worker.parallel_accounts)
|
||||
self.assertEqual(2, tab.apply_worker.max_parallel_accounts)
|
||||
self.assertEqual("开始预览本轮更新:1 条", statuses[-1])
|
||||
self.assertEqual("开始检查本轮更新:1 条", statuses[-1])
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
|
||||
@@ -1243,13 +1286,14 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
||||
self.addCleanup(tab.close)
|
||||
tab.item_filter.setText("51100639510")
|
||||
|
||||
with mock.patch("app.gui.QMessageBox.warning") as warning, \
|
||||
with mock.patch.object(tab, "_show_update_safety_error") as safety_error, \
|
||||
mock.patch("app.gui.QMessageBox.question") as question, \
|
||||
mock.patch("app.gui.run_worker") as run_worker:
|
||||
tab.start_update()
|
||||
|
||||
message = warning.call_args[0][2]
|
||||
message = safety_error.call_args[0][0]
|
||||
self.assertIn("允许真实提交线上商品", message)
|
||||
self.assertIn("⑤设置", message)
|
||||
question.assert_not_called()
|
||||
run_worker.assert_not_called()
|
||||
self.assertIn("已阻止本次更新", statuses[-1])
|
||||
@@ -1282,12 +1326,14 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
||||
tab = ApplyTab(config=cfg)
|
||||
self.addCleanup(tab.close)
|
||||
|
||||
with mock.patch("app.gui.QMessageBox.warning") as warning, \
|
||||
with mock.patch.object(tab, "_show_update_safety_error") as safety_error, \
|
||||
mock.patch("app.gui.QMessageBox.question") as question, \
|
||||
mock.patch("app.gui.run_worker") as run_worker:
|
||||
tab.start_update()
|
||||
|
||||
self.assertIn("允许更新封面", warning.call_args[0][2])
|
||||
message = safety_error.call_args[0][0]
|
||||
self.assertIn("允许更新封面", message)
|
||||
self.assertIn("⑤设置", message)
|
||||
question.assert_not_called()
|
||||
run_worker.assert_not_called()
|
||||
|
||||
@@ -1321,6 +1367,28 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
|
||||
def test_apply_tab_safety_error_popup_can_open_settings_tab(self):
|
||||
with self.make_temp_dir() as temp_dir:
|
||||
opened = []
|
||||
tab = ApplyTab(
|
||||
config=self.make_config(temp_dir),
|
||||
open_settings_callback=lambda: opened.append(True),
|
||||
)
|
||||
self.addCleanup(tab.close)
|
||||
settings_button = object()
|
||||
box = mock.Mock()
|
||||
box.addButton.side_effect = [settings_button, object()]
|
||||
box.clickedButton.return_value = settings_button
|
||||
|
||||
with mock.patch("app.gui.QMessageBox", return_value=box) as message_box:
|
||||
tab._show_update_safety_error("设置未开启")
|
||||
|
||||
message_box.assert_called_once_with(tab)
|
||||
box.setWindowTitle.assert_called_once_with("更新安全开关")
|
||||
box.setText.assert_called_once_with("设置未开启")
|
||||
self.assertEqual([True], opened)
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
def test_apply_worker_applies_success_failure_and_unmatched_serially(self):
|
||||
with self.make_temp_dir() as temp_dir:
|
||||
cfg = self.make_config(temp_dir)
|
||||
@@ -1493,7 +1561,7 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
||||
unchanged = db.list_tasks(batch_id=batch_id, path=cfg["db_path"])
|
||||
self.assertTrue(all(task.stage == "generated" for task in unchanged))
|
||||
self.assertTrue(all(task.status == "success" for task in unchanged))
|
||||
self.assertTrue(any("预览" in line for line in logs))
|
||||
self.assertTrue(any("检查" in line for line in logs))
|
||||
run_log = db.list_run_logs(run_type="apply", path=cfg["db_path"])[0]
|
||||
self.assertEqual(1, run_log.dry_run)
|
||||
self.assertEqual("done", run_log.status)
|
||||
|
||||
Reference in New Issue
Block a user