"""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, 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)) 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(resubmit_position[1], rerun_position[1] + 1) self.assertEqual(remove_position[1], resubmit_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(), 9) 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_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_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()