feat: 展示PDD商品和采购订单信息 (#164)
This commit is contained in:
@@ -8,7 +8,15 @@ 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
|
||||
from src.pdd_ui import (
|
||||
CHECK_COLUMN,
|
||||
GOODS_ID_COLUMN,
|
||||
ORDER_NO_COLUMN,
|
||||
TITLE_COLUMN,
|
||||
PDDTaskPage,
|
||||
TaskRow,
|
||||
TaskTableModel,
|
||||
)
|
||||
|
||||
|
||||
class TaskTableModelCheckTests(unittest.TestCase):
|
||||
@@ -166,7 +174,9 @@ class TaskTableModelCheckTests(unittest.TestCase):
|
||||
page.detailRequested.connect(received.append)
|
||||
|
||||
self.assertNotIn("操作", page.taskModel.HEADERS)
|
||||
self.assertEqual(page.taskModel.columnCount(), 11)
|
||||
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))
|
||||
|
||||
@@ -174,6 +184,35 @@ class TaskTableModelCheckTests(unittest.TestCase):
|
||||
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(
|
||||
|
||||
@@ -1086,6 +1086,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
quantity=2,
|
||||
status=TaskStatus.MANUAL_REVIEW,
|
||||
updated_at="2026-08-06T08:00:00Z",
|
||||
order_no="ORDER-001",
|
||||
)
|
||||
|
||||
row = summary_to_row(summary)
|
||||
@@ -1093,6 +1094,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
self.assertEqual(row.task_type, "采购")
|
||||
self.assertEqual(row.status, "需要人工处理")
|
||||
self.assertEqual(row.goods_id, "")
|
||||
self.assertEqual(row.order_no, "ORDER-001")
|
||||
self.assertFalse(hasattr(row, "pdd_data"))
|
||||
|
||||
def test_summary_to_row_uses_task_specific_running_text(self):
|
||||
|
||||
@@ -8,7 +8,7 @@ os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
||||
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtTest import QTest
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
from PyQt5.QtWidgets import QApplication, QWidget
|
||||
|
||||
from src.task_detail_view import (
|
||||
CopyableBodyLabel,
|
||||
@@ -145,6 +145,57 @@ class TaskDetailViewTest(unittest.TestCase):
|
||||
expected,
|
||||
)
|
||||
|
||||
def test_purchase_result_shows_order_and_prefers_raw_order_time(self):
|
||||
purchase_data = {
|
||||
"purchase": {
|
||||
"mode": "live",
|
||||
"confirmed": {
|
||||
"options": {"color": "黑色", "size": "L"},
|
||||
"quantity": 2,
|
||||
"unit_price_cent": 3990,
|
||||
"total_price_cent": 7980,
|
||||
},
|
||||
"order_no": "ORDER-20260811",
|
||||
"ordered_at": "2026-08-11T08:00:00+08:00",
|
||||
"ordered_at_raw": "2026-08-11 08:00:00",
|
||||
"match_status": "matched",
|
||||
"payment_status": "unpaid",
|
||||
}
|
||||
}
|
||||
detail = replace(
|
||||
make_detail(purchase_data),
|
||||
remote_task_id="PUR-001",
|
||||
task_type=TaskType.PURCHASE,
|
||||
)
|
||||
|
||||
data = build_task_detail_view_data(detail)
|
||||
|
||||
self.assertEqual(data.purchase.mode, "真实采购")
|
||||
self.assertEqual(data.purchase.confirmed_spec, "黑色 / L")
|
||||
self.assertEqual(data.purchase.order_no, "ORDER-20260811")
|
||||
self.assertEqual(data.purchase.ordered_at, "2026-08-11 08:00:00")
|
||||
self.assertEqual(data.purchase.match_status, "已匹配")
|
||||
self.assertEqual(data.purchase.payment_status, "待付款")
|
||||
|
||||
window = TaskDetailWindow(detail)
|
||||
self.assertIsNotNone(window.findChild(QWidget, "purchaseResultCard"))
|
||||
self.assertTrue(
|
||||
any(
|
||||
label.text() == "ORDER-20260811"
|
||||
for label in window.findChildren(CopyableBodyLabel)
|
||||
)
|
||||
)
|
||||
window.close()
|
||||
self.app.processEvents()
|
||||
|
||||
def test_collect_detail_does_not_show_purchase_result_card(self):
|
||||
window = TaskDetailWindow(make_detail(collected_data()))
|
||||
|
||||
self.assertIsNone(window.findChild(QWidget, "purchaseResultCard"))
|
||||
|
||||
window.close()
|
||||
self.app.processEvents()
|
||||
|
||||
def test_window_builds_color_section_before_size_section(self):
|
||||
window = TaskDetailWindow(make_detail(collected_data()))
|
||||
|
||||
|
||||
@@ -228,6 +228,44 @@ class TaskRepositoryTests(unittest.TestCase):
|
||||
self.assertEqual([task.remote_task_id for task in tasks], ["COLLECT-BLACK"])
|
||||
self.assertEqual(self.repository.count_tasks(filters), 1)
|
||||
|
||||
def test_list_and_keyword_search_extract_purchase_order_no_safely(self) -> None:
|
||||
self.repository.add_claimed_task(
|
||||
self._task("PURCHASE-ORDER", TaskType.PURCHASE)
|
||||
)
|
||||
self.repository.add_claimed_task(self._task("COLLECT-BROKEN"))
|
||||
connection = open_database(self.db_path)
|
||||
try:
|
||||
with connection:
|
||||
connection.execute(
|
||||
"UPDATE pdd_tasks SET pdd_data = ? WHERE remote_task_id = ?",
|
||||
(
|
||||
'{"purchase":{"order_no":"ORDER-20260811"}}',
|
||||
"PURCHASE-ORDER",
|
||||
),
|
||||
)
|
||||
connection.execute(
|
||||
"UPDATE pdd_tasks SET pdd_data = ? WHERE remote_task_id = ?",
|
||||
("不是有效JSON", "COLLECT-BROKEN"),
|
||||
)
|
||||
finally:
|
||||
connection.close()
|
||||
|
||||
tasks = self.repository.list_tasks()
|
||||
by_id = {task.remote_task_id: task for task in tasks}
|
||||
searched = self.repository.list_tasks(
|
||||
TaskFilters(keyword="20260811")
|
||||
)
|
||||
|
||||
self.assertEqual(by_id["PURCHASE-ORDER"].order_no, "ORDER-20260811")
|
||||
self.assertIsNone(by_id["COLLECT-BROKEN"].order_no)
|
||||
self.assertEqual(
|
||||
[task.remote_task_id for task in searched], ["PURCHASE-ORDER"]
|
||||
)
|
||||
self.assertEqual(
|
||||
self.repository.count_tasks(TaskFilters(keyword="ORDER-20260811")),
|
||||
1,
|
||||
)
|
||||
|
||||
def test_keyword_treats_percent_as_normal_text(self) -> None:
|
||||
self.repository.add_claimed_task(self._task("TASK-100%", title="百分号"))
|
||||
self.repository.add_claimed_task(self._task("TASK-OTHER", title="普通商品"))
|
||||
|
||||
Reference in New Issue
Block a user