feat: 完成T-204b采集自动回写
采集完成且本轮有成功采集任务时,Tab① 自动启动 WriteBackWorker 回写旧标题和旧封面路径到当前批次 Excel。 保留手动回写旧数据到 Excel 作为自动回写失败后的重试入口;原 Excel 被占用时提示关闭文件后手动重试,SQLite 采集结果不回滚。 新增 GUI 测试覆盖自动触发、无成功采集不触发、锁文件提示手动重试;同步 T-204b 任务状态、current-state、api、architecture 与 progress。
This commit is contained in:
@@ -387,6 +387,72 @@ class GuiTests(TempDirMixin, unittest.TestCase):
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
|
||||
def test_collect_tab_auto_starts_write_back_after_collect_success(self):
|
||||
with self.make_temp_dir() as temp_dir:
|
||||
cfg = self.make_config(temp_dir)
|
||||
db.init_db(cfg["db_path"])
|
||||
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"],
|
||||
)
|
||||
statuses = []
|
||||
tab = CollectTab(config=cfg, status_callback=statuses.append)
|
||||
self.addCleanup(tab.close)
|
||||
|
||||
with mock.patch.object(tab, "_start_write_back", return_value=True) as start_write_back:
|
||||
tab._on_collect_finished({"collected": 1, "skipped": 0, "failed": 0})
|
||||
|
||||
start_write_back.assert_called_once_with(batch_id, auto=True)
|
||||
self.assertIn("正在自动回写 Excel", statuses[-1])
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
|
||||
def test_collect_tab_does_not_auto_write_back_when_nothing_collected(self):
|
||||
with self.make_temp_dir() as temp_dir:
|
||||
cfg = self.make_config(temp_dir)
|
||||
statuses = []
|
||||
tab = CollectTab(config=cfg, status_callback=statuses.append)
|
||||
self.addCleanup(tab.close)
|
||||
|
||||
with mock.patch.object(tab, "_start_write_back") as start_write_back:
|
||||
tab._on_collect_finished({"collected": 0, "skipped": 1, "failed": 0})
|
||||
|
||||
start_write_back.assert_not_called()
|
||||
self.assertEqual("采集完成:成功0,略过1,失败0", statuses[-1])
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
|
||||
def test_auto_write_back_locked_file_message_points_to_manual_retry(self):
|
||||
with self.make_temp_dir() as temp_dir:
|
||||
statuses = []
|
||||
tab = CollectTab(config=self.make_config(temp_dir), status_callback=statuses.append)
|
||||
self.addCleanup(tab.close)
|
||||
|
||||
with mock.patch("app.gui.QMessageBox.warning") as warning:
|
||||
tab._on_write_back_failed(
|
||||
-1,
|
||||
"Excel 文件被占用,请关闭后重试: input.xlsx",
|
||||
auto=True,
|
||||
)
|
||||
|
||||
message = warning.call_args[0][2]
|
||||
self.assertIn("Excel 自动回写失败", message)
|
||||
self.assertIn("点击「回写旧数据到 Excel」手动重试", message)
|
||||
self.assertIn("手动重试", statuses[-1])
|
||||
|
||||
self.assert_removed(temp_dir)
|
||||
|
||||
def test_write_back_worker_calls_excel_write_back(self):
|
||||
with mock.patch(
|
||||
"app.gui.excel.write_back",
|
||||
|
||||
Reference in New Issue
Block a user