fix(product-suite): finalize sorting after drag

This commit is contained in:
chengma
2026-07-23 09:36:00 +08:00
parent 03b9bbab78
commit 8706151e23
5 changed files with 127 additions and 18 deletions
+71 -5
View File
@@ -2934,37 +2934,103 @@ class ProductSuiteGuiTests(TempDirMixin, unittest.TestCase):
changes = []
original_list.orderChanged.connect(changes.append)
original_list._dragged_item = original_list.item(1)
self.assertTrue(original_list._begin_internal_drag(original_list.item(1)))
first_rect = original_list.visualItemRect(original_list.item(0))
self.assertTrue(original_list._move_dragged_item_to(first_rect.center()))
self.assertEqual([12, 11, 13], original_list.asset_ids())
self.assertEqual([], changes)
self.assertTrue(original_list._finish_internal_drag())
self.assertEqual([[12, 11, 13]], changes)
self.assertEqual(3, len(set(original_list.asset_ids())))
original_list._dragged_item = original_list.item(0)
self.assertTrue(original_list._begin_internal_drag(original_list.item(0)))
append_position = original_list.viewport().rect().bottomRight() - QPoint(2, 2)
self.assertTrue(original_list._move_dragged_item_to(append_position))
self.assertEqual([11, 13, 12], original_list.asset_ids())
self.assertEqual([[12, 11, 13]], changes)
self.assertTrue(original_list._finish_internal_drag())
self.assertEqual([[12, 11, 13], [11, 13, 12]], changes)
original_list._dragged_item = original_list.item(1)
self.assertTrue(original_list._begin_internal_drag(original_list.item(1)))
same_rect = original_list.visualItemRect(original_list.item(1))
self.assertFalse(original_list._move_dragged_item_to(same_rect.center()))
self.assertFalse(original_list._finish_internal_drag())
self.assertEqual([11, 13, 12], original_list.asset_ids())
self.assertEqual([[12, 11, 13], [11, 13, 12]], changes)
original_list._dragged_item = None
self.assertFalse(original_list._move_dragged_item_to(first_rect.center()))
self.assertEqual([11, 13, 12], original_list.asset_ids())
duplicate = QListWidgetItem("重复原图")
duplicate.setData(Qt.UserRole, 12)
original_list.addItem(duplicate)
original_list._dragged_item = original_list.item(0)
self.assertFalse(original_list._begin_internal_drag(original_list.item(0)))
self.assertFalse(original_list._move_dragged_item_to(first_rect.center()))
self.assertEqual(4, original_list.count())
self.assertEqual([[12, 11, 13], [11, 13, 12]], changes)
original_list.takeItem(3)
original_list.set_reordering_enabled(False)
self.assertFalse(original_list._begin_internal_drag(original_list.item(0)))
def test_original_list_repeated_primary_moves_keep_every_asset_and_label(self):
with self.make_temp_dir() as temp_dir:
config = self._config(temp_dir)
project, assets = self._create_project_with_assets(temp_dir, config, 5)
tab = ProductSuiteTab(config=config, db_path=config["db_path"])
self.addCleanup(tab.close)
state = tab._displayed_state
state.account_alias = "alias-a"
state.item_id = "51100639510"
state.project_id = project.id
tab._load_state(state)
tab.resize(1180, 760)
tab.show()
self.app.processEvents()
original_ids = {asset.id for asset in assets}
expected_labels = ["主图", "参考1", "参考2", "参考3", "参考4"]
for asset in assets[1:]:
row = tab.original_list.asset_ids().index(asset.id)
self.assertTrue(
tab.original_list._begin_internal_drag(tab.original_list.item(row))
)
first_rect = tab.original_list.visualItemRect(tab.original_list.item(0))
self.assertTrue(
tab.original_list._move_dragged_item_to(first_rect.center())
)
database_ids_before_finish = [
stored.id
for stored in image_studio.list_assets(
project.id,
kind=image_studio.ASSET_KIND_ORIGINAL,
path=config["db_path"],
)
]
self.assertNotEqual(tab.original_list.asset_ids(), database_ids_before_finish)
self.assertTrue(tab.original_list._finish_internal_drag())
visible_ids = tab.original_list.asset_ids()
database_ids = [
stored.id
for stored in image_studio.list_assets(
project.id,
kind=image_studio.ASSET_KIND_ORIGINAL,
path=config["db_path"],
)
]
self.assertEqual(5, tab.original_list.count())
self.assertEqual(original_ids, set(visible_ids))
self.assertEqual(5, len(set(visible_ids)))
self.assertEqual(asset.id, visible_ids[0])
self.assertEqual(visible_ids, database_ids)
self.assertEqual(
expected_labels,
[tab.original_list.item(row).text() for row in range(5)],
)
self.assert_removed(temp_dir)
def test_temporary_draft_allows_local_work_but_blocks_shopee_pull_and_recovers(self):
with self.make_temp_dir() as temp_dir:
config = self._config(temp_dir)