"""PDD 任务表勾选模型的离屏测试。""" import os import unittest os.environ.setdefault("QT_QPA_PLATFORM", "offscreen") from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication from src.pdd_ui import ( CHECK_COLUMN, GOODS_ID_COLUMN, ORDER_NO_COLUMN, TITLE_COLUMN, PDDTaskPage, TaskRow, TaskTableModel, ) class TaskTableModelCheckTests(unittest.TestCase): @classmethod def setUpClass(cls): cls.app = QApplication.instance() or QApplication([]) def test_check_uses_stable_task_id_and_survives_reorder(self): model = TaskTableModel() model.set_tasks( [TaskRow("TASK-1", "采集"), TaskRow("TASK-2", "采集")] ) self.assertTrue( model.setData( model.index(1, CHECK_COLUMN), Qt.Checked, Qt.CheckStateRole ) ) model.set_tasks( [TaskRow("TASK-2", "采集"), TaskRow("TASK-1", "采集")] ) self.assertEqual(model.checked_task_ids(), ("TASK-2",)) self.assertEqual( model.data(model.index(0, CHECK_COLUMN), Qt.CheckStateRole), Qt.Checked, ) def test_placeholder_is_not_checkable_and_removed_task_is_pruned(self): model = TaskTableModel() self.assertEqual(model.flags(model.index(0, CHECK_COLUMN)), Qt.NoItemFlags) model.set_tasks([TaskRow("TASK-1", "采集")]) model.setData( model.index(0, CHECK_COLUMN), Qt.Checked, Qt.CheckStateRole ) model.set_tasks([]) self.assertEqual(model.checked_task_ids(), ()) def test_check_all_and_invert_only_loaded_real_tasks(self): model = TaskTableModel() changes = [] model.checkedTaskIdsChanged.connect(changes.append) model.append_tasks( [TaskRow("TASK-1", "采集"), TaskRow("TASK-2", "采集")], has_more=True, ) model.check_all_loaded_tasks() self.assertEqual(model.checked_task_ids(), ("TASK-1", "TASK-2")) self.assertEqual(len(changes), 1) model.invert_loaded_task_checks() self.assertEqual(model.checked_task_ids(), ()) self.assertEqual(len(changes), 2) def test_new_page_is_not_checked_after_select_all(self): model = TaskTableModel() model.append_tasks([TaskRow("TASK-1", "采集")], has_more=True) model.check_all_loaded_tasks() model.append_tasks([TaskRow("TASK-2", "采集")], has_more=False) self.assertEqual(model.checked_task_ids(), ("TASK-1",)) self.assertEqual( model.data(model.index(1, CHECK_COLUMN), Qt.CheckStateRole), Qt.Unchecked, ) def test_search_clears_checks_and_refresh_is_next_to_search(self): page = PDDTaskPage() page.set_tasks([TaskRow("TASK-1", "采集")]) page.taskModel.setData( page.taskModel.index(0, CHECK_COLUMN), Qt.Checked, Qt.CheckStateRole ) page._update_command_layout(compact=False) layout = page.commandCard.layout() search_position = layout.getItemPosition(layout.indexOf(page.searchButton)) refresh_position = layout.getItemPosition(layout.indexOf(page.refreshButton)) rerun_position = layout.getItemPosition(layout.indexOf(page.rerunButton)) resubmit_position = layout.getItemPosition(layout.indexOf(page.resubmitButton)) purchase_position = layout.getItemPosition( layout.indexOf(page.purchaseRerunButton) ) remove_position = layout.getItemPosition(layout.indexOf(page.removeButton)) select_all_position = layout.getItemPosition( layout.indexOf(page.selectAllButton) ) invert_position = layout.getItemPosition( layout.indexOf(page.invertSelectionButton) ) self.assertEqual(refresh_position[1], search_position[1] + 1) self.assertEqual(search_position[0], 0) self.assertEqual(select_all_position[0], 0) self.assertEqual(rerun_position[1], resubmit_position[1] + 1) self.assertEqual(purchase_position[1], rerun_position[1] + 1) self.assertEqual(remove_position[1], purchase_position[1] + 1) self.assertEqual(invert_position[1], select_all_position[1] + 1) self.assertEqual(page.checkedCountLabel.text(), "已选 1 条") self.assertTrue(page.removeButton.isEnabled()) self.assertTrue(page.selectAllButton.isEnabled()) self.assertTrue(page.invertSelectionButton.isEnabled()) page._update_command_layout(compact=True) compact_search = layout.getItemPosition(layout.indexOf(page.searchButton)) compact_refresh = layout.getItemPosition(layout.indexOf(page.refreshButton)) compact_select_all = layout.getItemPosition( layout.indexOf(page.selectAllButton) ) self.assertEqual(compact_search[0], 1) self.assertEqual(compact_refresh[1], compact_search[1] + 1) self.assertEqual(compact_select_all[0], 2) page.searchButton.click() self.assertEqual(page.taskModel.checked_task_ids(), ()) self.assertEqual(page.checkedCountLabel.text(), "已选 0 条") self.assertFalse(page.removeButton.isEnabled()) page.deleteLater() def test_selection_buttons_are_disabled_during_batch_work(self): page = PDDTaskPage() page.set_tasks([TaskRow("TASK-1", "采集")]) page.set_resubmit_running(True) self.assertFalse(page.selectAllButton.isEnabled()) self.assertFalse(page.invertSelectionButton.isEnabled()) page.set_resubmit_running(False) self.assertTrue(page.selectAllButton.isEnabled()) self.assertTrue(page.invertSelectionButton.isEnabled()) page.deleteLater() def test_selection_buttons_ignore_empty_placeholder_rows(self): page = PDDTaskPage() self.assertFalse(page.selectAllButton.isEnabled()) self.assertFalse(page.invertSelectionButton.isEnabled()) page.selectAllButton.click() page.invertSelectionButton.click() self.assertEqual(page.taskModel.checked_task_ids(), ()) page.deleteLater() def test_detail_has_no_column_and_checkbox_activation_does_not_open(self): page = PDDTaskPage() page.set_tasks([TaskRow("TASK-1", "采集")]) received = [] page.detailRequested.connect(received.append) self.assertNotIn("操作", page.taskModel.HEADERS) self.assertEqual(page.taskModel.columnCount(), 13) self.assertEqual(page.taskModel.HEADERS[GOODS_ID_COLUMN], "PDD商品ID") self.assertEqual(page.taskModel.HEADERS[ORDER_NO_COLUMN], "订单号") page._on_table_activated(page.taskModel.index(0, CHECK_COLUMN)) page._on_table_activated(page.taskModel.index(0, 2)) self.assertEqual(received, ["TASK-1"]) self.assertIn("Enter", page.taskTable.accessibleDescription()) page.deleteLater() def test_goods_id_order_no_and_full_value_tooltips_are_visible(self): model = TaskTableModel() model.set_tasks( [ TaskRow( "PUR-1", "采购", goods_id="897186799891", title="很长的商品标题", order_no="ORDER-20260811", ) ] ) self.assertEqual( model.data(model.index(0, GOODS_ID_COLUMN)), "897186799891" ) self.assertEqual( model.data(model.index(0, ORDER_NO_COLUMN)), "ORDER-20260811" ) self.assertEqual( model.data(model.index(0, TITLE_COLUMN), Qt.ToolTipRole), "很长的商品标题", ) self.assertEqual( model.data(model.index(0, ORDER_NO_COLUMN), Qt.ToolTipRole), "ORDER-20260811", ) def test_remove_emits_stable_checked_task_ids(self): page = PDDTaskPage() page.set_tasks( [TaskRow("TASK-1", "采集"), TaskRow("TASK-2", "采集")] ) received = [] page.removeRequested.connect(received.append) for row in (0, 1): page.taskModel.setData( page.taskModel.index(row, CHECK_COLUMN), Qt.Checked, Qt.CheckStateRole, ) page.removeButton.click() self.assertEqual(received, [("TASK-1", "TASK-2")]) page.deleteLater() def test_rerun_uses_current_row_when_no_task_is_checked(self): page = PDDTaskPage() page.set_tasks( [TaskRow("COL-1", "采集"), TaskRow("PUR-1", "采购")] ) collect_requests = [] purchase_requests = [] page.rerunRequested.connect(collect_requests.append) page.purchaseRerunRequested.connect(purchase_requests.append) page.taskTable.setCurrentIndex(page.taskModel.index(0, TITLE_COLUMN)) page.rerunButton.click() page.taskTable.setCurrentIndex(page.taskModel.index(1, TITLE_COLUMN)) page.purchaseRerunButton.click() self.assertEqual(collect_requests, [("COL-1",)]) self.assertEqual(purchase_requests, [("PUR-1",)]) self.assertEqual(page.taskModel.checked_task_ids(), ()) page.deleteLater() def test_rerun_checked_tasks_take_priority_over_current_row(self): page = PDDTaskPage() page.set_tasks( [TaskRow("COL-1", "采集"), TaskRow("COL-2", "采集")] ) received = [] page.rerunRequested.connect(received.append) page.taskTable.setCurrentIndex(page.taskModel.index(0, TITLE_COLUMN)) page.taskModel.setData( page.taskModel.index(1, CHECK_COLUMN), Qt.Checked, Qt.CheckStateRole, ) page.rerunButton.click() self.assertEqual(received, [("COL-2",)]) page.deleteLater() def test_rerun_without_checked_or_current_task_shows_guidance(self): page = PDDTaskPage() page.set_tasks([TaskRow("COL-1", "采集")]) page.taskTable.clearSelection() page.taskTable.setCurrentIndex(page.taskModel.index(-1, -1)) page.rerunButton.click() self.assertEqual( page.statusLabel.text(), "请勾选任务或单击选择一行" ) page.deleteLater() def test_resubmit_and_remove_still_require_checked_tasks(self): page = PDDTaskPage() page.set_tasks([TaskRow("TASK-1", "采集")]) page.taskTable.setCurrentIndex(page.taskModel.index(0, TITLE_COLUMN)) self.assertTrue(page.rerunButton.isEnabled()) self.assertTrue(page.purchaseRerunButton.isEnabled()) self.assertFalse(page.resubmitButton.isEnabled()) self.assertFalse(page.removeButton.isEnabled()) page.deleteLater() def test_auto_fetch_text_and_keyword_width(self): page = PDDTaskPage() self.assertEqual(page.autoFetchButton.text(), "自动获取") self.assertEqual( page.autoFetchButton.accessibleName(), "自动获取 PDD 任务" ) self.assertEqual(page.keywordInput.minimumWidth(), 150) self.assertEqual(page.keywordInput.maximumWidth(), 240) page.set_auto_fetch_state("running") self.assertEqual(page.autoFetchButton.text(), "停止自动获取") self.assertEqual( page.autoFetchButton.accessibleName(), "停止自动获取 PDD 任务" ) page.set_auto_fetch_state("stopped") self.assertEqual(page.autoFetchButton.text(), "自动获取") page.deleteLater() if __name__ == "__main__": unittest.main()