Усилить безопасность и надёжность выполнения операций
This commit is contained in:
@@ -515,12 +515,23 @@ async fn manages_approval_request_lifecycle() {
|
||||
})
|
||||
.await
|
||||
.unwrap();
|
||||
registry
|
||||
let created = registry
|
||||
.create_approval_request(CreateApprovalRequest {
|
||||
approval: &approval,
|
||||
})
|
||||
.await
|
||||
.unwrap();
|
||||
assert_eq!(created.approval.id, approval.id);
|
||||
let mut duplicate = approval.clone();
|
||||
duplicate.id = ApprovalRequestId::new("approval_02");
|
||||
duplicate.request_payload = json!({"amount": 100});
|
||||
let deduplicated = registry
|
||||
.create_approval_request(CreateApprovalRequest {
|
||||
approval: &duplicate,
|
||||
})
|
||||
.await
|
||||
.unwrap();
|
||||
assert_eq!(deduplicated.approval.id, approval.id);
|
||||
|
||||
let pending = registry
|
||||
.list_pending_approval_requests_for_agent(&workspace_id, &agent.id)
|
||||
@@ -572,6 +583,48 @@ async fn manages_approval_request_lifecycle() {
|
||||
Some(json!({"approve": "yes"}))
|
||||
);
|
||||
|
||||
let approval_inside_recovery_grace = registry
|
||||
.claim_next_recoverable_approval_request(
|
||||
timestamp("2026-03-25T12:02:01Z"),
|
||||
timestamp("2026-03-25T12:01:59Z"),
|
||||
timestamp("2026-03-25T11:55:00Z"),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
assert!(approval_inside_recovery_grace.is_none());
|
||||
|
||||
let claimed = registry
|
||||
.claim_approval_request(
|
||||
&workspace_id,
|
||||
&agent.id,
|
||||
&approval.id,
|
||||
timestamp("2026-03-25T12:02:01Z"),
|
||||
)
|
||||
.await
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
assert_eq!(claimed.approval.status, ApprovalRequestStatus::Executing);
|
||||
let fresh_claim = registry
|
||||
.claim_next_recoverable_approval_request(
|
||||
timestamp("2026-03-25T12:02:10Z"),
|
||||
timestamp("2026-03-25T12:02:09Z"),
|
||||
timestamp("2026-03-25T12:01:59Z"),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
assert!(fresh_claim.is_none());
|
||||
let recovered = registry
|
||||
.claim_next_recoverable_approval_request(
|
||||
timestamp("2026-03-25T12:03:00Z"),
|
||||
timestamp("2026-03-25T12:02:59Z"),
|
||||
timestamp("2026-03-25T12:02:30Z"),
|
||||
)
|
||||
.await
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
assert_eq!(recovered.approval.id, approval.id);
|
||||
assert_eq!(recovered.approval.status, ApprovalRequestStatus::Executing);
|
||||
|
||||
let completed = registry
|
||||
.finish_approval_request(FinishApprovalRequest {
|
||||
workspace_id: &workspace_id,
|
||||
@@ -626,5 +679,26 @@ async fn manages_approval_request_lifecycle() {
|
||||
.unwrap();
|
||||
assert!(repeated_decision.is_none());
|
||||
|
||||
let mut expired = approval.clone();
|
||||
expired.id = ApprovalRequestId::new("approval_expired_pending");
|
||||
expired.request_payload = json!({"amount": 200});
|
||||
expired.created_at = timestamp("2026-03-25T12:04:00Z");
|
||||
expired.expires_at = timestamp("2026-03-25T12:04:01Z");
|
||||
registry
|
||||
.create_approval_request(CreateApprovalRequest { approval: &expired })
|
||||
.await
|
||||
.unwrap();
|
||||
let mut replacement = expired.clone();
|
||||
replacement.id = ApprovalRequestId::new("approval_replacement_pending");
|
||||
replacement.created_at = timestamp("2026-03-25T12:05:00Z");
|
||||
replacement.expires_at = timestamp("2026-03-25T12:10:00Z");
|
||||
let replaced = registry
|
||||
.create_approval_request(CreateApprovalRequest {
|
||||
approval: &replacement,
|
||||
})
|
||||
.await
|
||||
.unwrap();
|
||||
assert_eq!(replaced.approval.id, replacement.id);
|
||||
|
||||
database.cleanup().await;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user