Усилить безопасность и надёжность выполнения операций
CI / Rust Checks (push) Successful in 5m7s
CI / UI Checks (push) Successful in 4s
CI / Deployment Manifests (push) Successful in 3s
CI / Frontend E2E (push) Successful in 3m9s
CI / Deploy (push) Successful in 1m41s

This commit is contained in:
2026-07-11 14:08:07 +03:00
parent 626f2845e2
commit 8318e4b560
40 changed files with 1343 additions and 185 deletions
@@ -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;
}