use crate::checks::draft::testkit::{META, client, findings_for, post, trace};
fn read(headers: &str, uri: &str) -> String {
trace(&[
post(0, headers),
client(
1,
&format!(
r#"{{"jsonrpc":"2.0","id":1,"method":"resources/read","params":{{"uri":{uri},{META}}}}}"#
),
),
])
}
#[test]
fn the_encoding_rules_reach_mcp_name_and_mcp_param_only() {
let check = "transport.header-value-encoding";
let document = read(
r#"{"mcp-method":"resources/read","mcp-name":"café"}"#,
r#""café""#,
);
assert_eq!(findings_for(check, &document).len(), 1);
let document = read(
r#"{"mcp-method":"resources/read","mcp-name":"a","mcp-param-region":" padded"}"#,
r#""a""#,
);
assert_eq!(findings_for(check, &document).len(), 1);
let document = read(
r#"{"mcp-method":"resources/read","mcp-name":"a","x-vendor":"café","accept":" padded"}"#,
r#""a""#,
);
assert!(findings_for(check, &document).is_empty());
}
#[test]
fn each_encoding_defect_is_claimed_by_exactly_one_check() {
let encoding = "transport.header-value-encoding";
let case = "transport.sentinel-marker-case";
let pattern = "transport.sentinel-pattern-encoded";
let document = read(
r#"{"mcp-method":"resources/read","mcp-name":"café"}"#,
r#""café""#,
);
assert_eq!(findings_for(encoding, &document).len(), 1);
assert!(findings_for(case, &document).is_empty());
assert!(findings_for(pattern, &document).is_empty());
let document = read(
r#"{"mcp-method":"resources/read","mcp-name":"=?BASE64?Y2Fmw6k=?="}"#,
r#""café""#,
);
assert!(findings_for(encoding, &document).is_empty());
assert_eq!(findings_for(case, &document).len(), 1);
assert!(findings_for(pattern, &document).is_empty());
let document = read(
r#"{"mcp-method":"resources/read","mcp-name":"=?base64?literal?="}"#,
r#""=?base64?literal?=""#,
);
assert!(findings_for(encoding, &document).is_empty());
assert!(findings_for(case, &document).is_empty());
assert_eq!(findings_for(pattern, &document).len(), 1);
let document = read(
r#"{"mcp-method":"resources/read","mcp-name":"=?base64?café?="}"#,
r#""café""#,
);
assert_eq!(findings_for(encoding, &document).len(), 1);
let document = read(
r#"{"mcp-method":"resources/read","mcp-name":"=?base64?Y2Fmw6k=?="}"#,
r#""café""#,
);
for check in [encoding, case, pattern] {
assert!(findings_for(check, &document).is_empty(), "{check}");
}
}
#[test]
fn notification_posts_are_outside_every_header_clause() {
let document = trace(&[
post(0, r#"{"mcp-name":"café"}"#),
client(
1,
r#"{"jsonrpc":"2.0","method":"notifications/cancelled","params":{}}"#,
),
]);
for check in [
"transport.protocol-version-header-present",
"transport.request-metadata-headers",
"transport.header-value-encoding",
"transport.sentinel-marker-case",
] {
assert!(findings_for(check, &document).is_empty(), "{check}");
}
}