use super::test_helpers;
use serde_json::{Value, json};
#[tokio::test]
async fn test_patch_capability_advertisement() {
let server = test_helpers::create_test_server_with_patch_support();
let _context = test_helpers::create_test_context();
let config = server.get_service_provider_config().unwrap();
assert!(config.patch_supported);
}
#[tokio::test]
async fn test_patch_not_supported_behavior() {
let server = test_helpers::create_test_server_without_patch_support();
let context = test_helpers::create_test_context();
let config = server.get_service_provider_config().unwrap();
assert!(
!config.patch_supported,
"Patch should be disabled in service config"
);
let user = test_helpers::create_test_user(&server, &context)
.await
.unwrap();
let user_id = user.get_id().unwrap();
let patch_request = json!({
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [{
"op": "replace",
"path": "displayName",
"value": "New Name"
}]
});
let result = server
.patch_resource("User", user_id, &patch_request, &context)
.await;
assert!(result.is_err(), "PATCH should fail when not supported");
}
#[tokio::test]
async fn test_patch_capability_matrix() {
let server_with_patch = test_helpers::create_test_server_with_patch_support();
let context = test_helpers::create_test_context();
let user = test_helpers::create_test_user(&server_with_patch, &context)
.await
.unwrap();
let user_id = user.get_id().unwrap();
let patch_request = json!({
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [{
"op": "replace",
"path": "displayName",
"value": "Updated Name"
}]
});
let result = server_with_patch
.patch_resource("User", user_id, &patch_request, &context)
.await;
assert!(result.is_ok(), "PATCH should succeed when supported");
let server_without_patch = test_helpers::create_test_server_without_patch_support();
let result = server_without_patch
.patch_resource("User", user_id, &patch_request, &context)
.await;
assert!(result.is_err(), "PATCH should fail when not supported");
}
#[tokio::test]
async fn test_tenant_specific_patch_capabilities() {
let context_a = test_helpers::create_test_context_with_tenant("tenant-a", "client-a");
let context_b = test_helpers::create_test_context_with_tenant("tenant-b", "client-b");
let server = test_helpers::create_test_server_with_patch_support();
let user_a = test_helpers::create_test_user(&server, &context_a)
.await
.unwrap();
let user_b = test_helpers::create_test_user(&server, &context_b)
.await
.unwrap();
let user_a_id = user_a.get_id().unwrap();
let user_b_id = user_b.get_id().unwrap();
let patch_request = json!({
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [{
"op": "replace",
"path": "displayName",
"value": "Updated Name"
}]
});
let result_a = server
.patch_resource("User", user_a_id, &patch_request, &context_a)
.await;
let result_b = server
.patch_resource("User", user_b_id, &patch_request, &context_b)
.await;
assert!(result_a.is_ok(), "PATCH should succeed for tenant A");
assert!(result_b.is_ok(), "PATCH should succeed for tenant B");
}
#[tokio::test]
async fn test_dynamic_capability_changes() {
let server = test_helpers::create_test_server_with_patch_support();
let context = test_helpers::create_test_context();
let config = server.get_service_provider_config().unwrap();
assert!(config.patch_supported);
let user = test_helpers::create_test_user(&server, &context)
.await
.unwrap();
let user_id = user.get_id().unwrap();
let patch_request = create_simple_patch_request();
let result = server
.patch_resource("User", user_id, &patch_request, &context)
.await;
assert!(result.is_ok(), "PATCH should succeed when supported");
}
fn create_simple_patch_request() -> Value {
json!({
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [{
"op": "replace",
"path": "displayName",
"value": "Updated Display Name"
}]
})
}