diff --git a/rustfs/src/admin/handlers/table_catalog.rs b/rustfs/src/admin/handlers/table_catalog.rs index 3ffb1576c..c019dc9af 100644 --- a/rustfs/src/admin/handlers/table_catalog.rs +++ b/rustfs/src/admin/handlers/table_catalog.rs @@ -1808,6 +1808,60 @@ mod tests { assert!(request.delete); } + #[test] + fn table_catalog_ingress_requests_reject_unknown_fields() { + assert_rejects_unknown_field::( + "CreateNamespaceRequest", + serde_json::json!({ + "namespace": ["analytics"], + "unexpected": true + }), + ); + assert_rejects_unknown_field::( + "RegisterTableRequest", + serde_json::json!({ + "name": "events", + "metadata-location": ".rustfs-table/warehouses/default/namespaces/analytics/tables/events/metadata/00001.metadata.json", + "unexpected": true + }), + ); + assert_rejects_unknown_field::( + "CreateTableRequest", + serde_json::json!({ + "name": "events", + "schema": {}, + "unexpected": true + }), + ); + assert_rejects_unknown_field::( + "RestCommitTableRequest", + serde_json::json!({ + "unexpected": true + }), + ); + assert_rejects_unknown_field::( + "TableMetadataMaintenanceRequest", + serde_json::json!({ + "delete": true, + "unexpected": true + }), + ); + } + + fn assert_rejects_unknown_field(target: &str, value: serde_json::Value) + where + T: serde::de::DeserializeOwned, + { + let err = match serde_json::from_value::(value) { + Ok(_) => panic!("{target} should reject unknown fields"), + Err(err) => err, + }; + assert!( + err.to_string().contains("unknown field"), + "{target} should reject unknown fields, got: {err}" + ); + } + #[test] fn create_namespace_request_uses_rest_namespace_segments_and_properties() { let request: CreateNamespaceRequest = serde_json::from_value(serde_json::json!({