#![cfg(feature = "valkey-default")]
use ff_sdk::admin::{IssueReclaimGrantRequest, IssueReclaimGrantResponse};
#[test]
fn issue_reclaim_grant_request_serializes_all_fields() {
let req = IssueReclaimGrantRequest {
worker_id: "w1".into(),
worker_instance_id: "w1-i1".into(),
lane_id: "main".into(),
capability_hash: Some("cap-hash-abc".into()),
grant_ttl_ms: 30_000,
route_snapshot_json: Some(r#"{"route":"x"}"#.into()),
admission_summary: Some("admitted".into()),
worker_capabilities: vec!["cpu".into(), "gpu".into()],
};
let json = serde_json::to_value(&req).expect("serialize");
assert_eq!(json["worker_id"], "w1");
assert_eq!(json["worker_instance_id"], "w1-i1");
assert_eq!(json["lane_id"], "main");
assert_eq!(json["capability_hash"], "cap-hash-abc");
assert_eq!(json["grant_ttl_ms"], 30_000);
assert_eq!(json["worker_capabilities"][0], "cpu");
}
#[test]
fn issue_reclaim_grant_request_skips_none_optional_fields() {
let req = IssueReclaimGrantRequest {
worker_id: "w1".into(),
worker_instance_id: "w1-i1".into(),
lane_id: "main".into(),
capability_hash: None,
grant_ttl_ms: 30_000,
route_snapshot_json: None,
admission_summary: None,
worker_capabilities: vec![],
};
let json = serde_json::to_value(&req).expect("serialize");
assert!(json.get("capability_hash").is_none());
assert!(json.get("route_snapshot_json").is_none());
assert!(json.get("admission_summary").is_none());
}
#[test]
fn issue_reclaim_grant_response_granted_deserializes() {
let wire = serde_json::json!({
"status": "granted",
"execution_id": "{fp:7}:11111111-1111-4111-8111-111111111111",
"partition_key": "{fp:7}",
"grant_key": "reclaim:grant:abc",
"expires_at_ms": 1_700_000_000_000u64,
"lane_id": "main",
});
let resp: IssueReclaimGrantResponse =
serde_json::from_value(wire).expect("deserialize granted");
match resp {
IssueReclaimGrantResponse::Granted {
grant_key, lane_id, ..
} => {
assert_eq!(grant_key, "reclaim:grant:abc");
assert_eq!(lane_id, "main");
}
other => panic!("expected Granted, got {other:?}"),
}
}
#[test]
fn issue_reclaim_grant_response_not_reclaimable_deserializes() {
let wire = serde_json::json!({
"status": "not_reclaimable",
"execution_id": "{fp:7}:11111111-1111-4111-8111-111111111111",
"detail": "capability_mismatch",
});
let resp: IssueReclaimGrantResponse = serde_json::from_value(wire).expect("deserialize");
match resp {
IssueReclaimGrantResponse::NotReclaimable { detail, .. } => {
assert_eq!(detail, "capability_mismatch");
}
other => panic!("expected NotReclaimable, got {other:?}"),
}
}
#[test]
fn issue_reclaim_grant_response_reclaim_cap_exceeded_deserializes() {
let wire = serde_json::json!({
"status": "reclaim_cap_exceeded",
"execution_id": "{fp:7}:11111111-1111-4111-8111-111111111111",
"reclaim_count": 1000,
});
let resp: IssueReclaimGrantResponse = serde_json::from_value(wire).expect("deserialize");
match resp {
IssueReclaimGrantResponse::ReclaimCapExceeded { reclaim_count, .. } => {
assert_eq!(reclaim_count, 1000);
}
other => panic!("expected ReclaimCapExceeded, got {other:?}"),
}
}
#[test]
fn issue_reclaim_grant_response_into_grant_rejects_non_granted_variants() {
let not_reclaimable = IssueReclaimGrantResponse::NotReclaimable {
execution_id: "{fp:7}:11111111-1111-4111-8111-111111111111"
.into(),
detail: "capability_mismatch".into(),
};
assert!(not_reclaimable.into_grant().is_err());
let cap_exceeded = IssueReclaimGrantResponse::ReclaimCapExceeded {
execution_id: "{fp:7}:11111111-1111-4111-8111-111111111111"
.into(),
reclaim_count: 1000,
};
assert!(cap_exceeded.into_grant().is_err());
}
#[test]
fn worker_claim_from_reclaim_grant_is_backend_agnostic_at_type_level() {
use ff_core::contracts::{ReclaimExecutionArgs, ReclaimExecutionOutcome, ReclaimGrant};
use ff_sdk::{FlowFabricWorker, SdkError};
async fn _call(
w: &FlowFabricWorker,
g: ReclaimGrant,
a: ReclaimExecutionArgs,
) -> Result<ReclaimExecutionOutcome, SdkError> {
w.claim_from_reclaim_grant(g, a).await
}
let _ = _call;
}