218 lines
8.0 KiB
Python
218 lines
8.0 KiB
Python
"""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))
|
|
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(), 11)
|
|
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()
|