Files
yoi/crates/server-api/tests/subject_delete_contract.rs

50 lines
1.7 KiB
Rust

use serde_json::json;
use server_api::{
SubjektivSubjectDeleteRequest, SubjektivSubjectDeleteResponse, SubjektivSubjectState,
};
#[test]
fn subject_delete_api_replaces_retire_and_requires_operation_identity() {
let document: serde_json::Value = serde_json::from_str(
&server_api::canonical_openapi_document()
.unwrap()
.to_json()
.unwrap(),
)
.unwrap();
let paths = &document["paths"];
assert!(
paths
.get("/api/w/{workspace_id}/subjektiv/subjects/{subject_id}/retire")
.is_none()
);
let operation = &paths["/api/w/{workspace_id}/subjektiv/subjects/{subject_id}"]["delete"];
assert_eq!(operation["operationId"], "subjektiv_subject_delete");
assert_eq!(operation["requestBody"]["required"], true);
assert!(serde_json::from_value::<SubjektivSubjectDeleteRequest>(json!({})).is_err());
assert!(
serde_json::from_value::<SubjektivSubjectDeleteRequest>(
json!({"operation_id":"op", "force":true})
)
.is_err()
);
for completed in [false, true] {
let response = SubjektivSubjectDeleteResponse {
subject_id: "subject".into(),
operation_id: "op".into(),
completed,
};
assert_eq!(
serde_json::to_value(response).unwrap(),
json!({"subject_id":"subject", "operation_id":"op", "completed":completed})
);
}
}
#[test]
fn old_subject_state_is_explicit_saved_compatibility_not_a_new_operation() {
let state: SubjektivSubjectState = serde_json::from_value(json!("retired")).unwrap();
assert_eq!(state, SubjektivSubjectState::LegacyRetired);
assert_eq!(serde_json::to_value(state).unwrap(), json!("retired"));
}