feat: add daily manual price review workflow

This commit is contained in:
Wyndham ARR
2026-08-06 22:40:18 +08:00
parent aae3d8e1db
commit ca3e8e18fa
77 changed files with 7750 additions and 602 deletions

View File

@@ -27,8 +27,8 @@ class JobTraceTests(unittest.TestCase):
"filename": "source.xml",
"byte_size": 2048,
"source_sha256": "a" * 64,
"requested_processor_version": "3.0.0",
"delivered_processor_version": "3.0.0",
"requested_processor_version": "4.0.0",
"delivered_processor_version": "4.0.0",
"object_key": "must/not/escape",
},
attempts=[
@@ -47,7 +47,7 @@ class JobTraceTests(unittest.TestCase):
"attempt_no": 1,
"delivery_status": "committed",
"result_status": "success",
"processor_version": "3.0.0",
"processor_version": "4.0.0",
"business_date": "2026-07-29",
"daily_version_id": 41,
"received_at": self.started + timedelta(seconds=5),
@@ -87,7 +87,7 @@ class JobTraceTests(unittest.TestCase):
refreshed_at=finished + timedelta(seconds=1),
)
self.assertEqual(trace["trace_version"], "arr-job-trace-3")
self.assertEqual(trace["trace_version"], "arr-job-trace-4")
self.assertEqual(trace["job"]["status"], "succeeded")
self.assertEqual(trace["job"]["current_stage"], "downstream")
self.assertFalse(trace["job"]["active"])
@@ -231,6 +231,94 @@ class JobTraceTests(unittest.TestCase):
self.assertEqual(trace["job"]["current_stage"], "processor")
self.assertEqual(trace["logs"][-1]["code"], "CURRENT_RUNNING")
def test_open_price_review_is_active_and_has_no_terminal_failure(self) -> None:
updated = self.started + timedelta(seconds=12)
trace = build_job_trace(
{
"job_id": "arrjob-review-001",
"run_status": "awaiting_review",
"public_status": "needs_review",
"delivery_mode": "artifact_callback",
"business_date": "2026-07-29",
"created_at": self.started,
"updated_at": updated,
"filename": "source.xml",
"byte_size": 512,
"source_sha256": "e" * 64,
},
attempts=[
{
"attempt_no": 1,
"attempt_status": "review_required",
"remote_run_id": None,
"created_at": self.started + timedelta(seconds=1),
"started_at": self.started + timedelta(seconds=2),
"finished_at": self.started + timedelta(seconds=7),
}
],
deliveries=[
{
"delivery_key": "local-arrjob-review-001-a1",
"attempt_no": 1,
"delivery_status": "recorded_review",
"result_status": "review_required",
"processor_version": "4.0.0",
"business_date": "2026-07-29",
"daily_version_id": None,
"received_at": self.started + timedelta(seconds=3),
"validated_at": self.started + timedelta(seconds=5),
"committed_at": self.started + timedelta(seconds=7),
}
],
review_case={
"case_id": "dailyreview-0123456789abcdef0123456789abcdef",
"case_status": "open",
"revision": 2,
"completed_items": 1,
"total_items": 2,
"manual_override_sha256": None,
"created_at": self.started + timedelta(seconds=7),
"updated_at": updated,
"frozen_at": None,
"completed_at": None,
"cancelled_at": None,
},
review_events=[
{
"event_type": "PRICE_REVIEW_REQUIRED",
"actor_username": "operator@example.test",
"revision": 1,
"created_at": self.started + timedelta(seconds=7),
},
{
"event_type": "PRICE_REVIEW_UPDATED",
"actor_username": "operator@example.test",
"revision": 2,
"created_at": updated,
},
],
refreshed_at=updated,
)
self.assertEqual(trace["trace_version"], "arr-job-trace-4")
self.assertEqual(trace["job"]["status"], "needs_review")
self.assertTrue(trace["job"]["active"])
self.assertEqual(trace["job"]["current_stage"], "review")
self.assertIsNone(trace["job"]["failure"])
self.assertEqual(trace["job"]["review"]["revision"], 2)
self.assertEqual(trace["job"]["review"]["completed_items"], 1)
self.assertEqual(trace["job"]["review"]["total_items"], 2)
codes = [item["code"] for item in trace["logs"]]
self.assertIn("ARTIFACT_RESULT_RECORDED_FOR_REVIEW", codes)
self.assertIn("PRICE_REVIEW_REQUIRED", codes)
self.assertIn("PRICE_REVIEW_UPDATED", codes)
self.assertIn("CURRENT_AWAITING_REVIEW", codes)
self.assertNotIn("DOWNSTREAM_EVENT_QUEUED", codes)
self.assertNotIn("PRICE_REVIEW_FAILED", codes)
rendered = json.dumps(trace, ensure_ascii=False)
for private_value in ("SYNTHETIC GUEST", "RES_COMMENT", "TRACE_TEXT"):
self.assertNotIn(private_value, rendered)
if __name__ == "__main__":
unittest.main(verbosity=2)