feat: add daily manual price review workflow
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user