test(axum): harden page and media extraction

Prove explicit partial header values, full-page body and fingerprint delivery, and case-insensitive urlencoded media types through public Axum extractors and responses.

req: page_swap/001

req: abi/005

req: security/003
This commit is contained in:
slhx agent
2026-07-17 00:36:04 +02:00
parent 0fe2376874
commit 52a32cfb1f
2 changed files with 43 additions and 8 deletions
+42 -7
View File
@@ -91,7 +91,7 @@ async fn interaction_boundary_honors_media_type_and_host_body_limit() {
Request::post("/mutate")
.header(
header::CONTENT_TYPE,
"application/x-www-form-urlencoded; charset=utf-8",
"Application/X-Www-Form-Urlencoded; charset=UTF-8",
)
.body(Body::from("__h=1"))
.unwrap(),
@@ -235,12 +235,26 @@ impl hemx_core::FromForm for OpenProject {
}
#[test]
fn page_mode_detects_partial_header() {
let mut headers = HeaderMap::new();
assert_eq!(PageMode::from_headers(&headers), PageMode::Full);
headers.insert(HEMX_PARTIAL_HEADER, "true".parse().unwrap());
assert_eq!(PageMode::from_headers(&headers), PageMode::Partial);
fn page_mode_detects_only_explicit_partial_header_values() {
for value in [
None,
Some("false"),
Some("0"),
Some("TRUE"),
Some("invalid"),
] {
let mut headers = HeaderMap::new();
if let Some(value) = value {
headers.insert(HEMX_PARTIAL_HEADER, value.parse().unwrap());
}
assert_eq!(PageMode::from_headers(&headers), PageMode::Full);
}
for value in ["true", "1"] {
let mut headers = HeaderMap::new();
headers.insert(HEMX_PARTIAL_HEADER, value.parse().unwrap());
assert_eq!(PageMode::from_headers(&headers), PageMode::Partial);
}
// test req: page_swap/001
}
#[test]
@@ -365,6 +379,27 @@ fn page_response_constructors_preserve_mode_and_optional_fingerprint() {
// test req: page_swap/001 req: abi/005
}
#[tokio::test]
async fn full_page_response_preserves_html_and_fingerprint_without_partial_headers() {
let response = PageResponse::full("<html>Full</html>")
.fingerprint(BuildFingerprint(42))
.into_response();
assert_eq!(response.status(), StatusCode::OK);
assert_eq!(
response.headers()[header::CONTENT_TYPE],
"text/html; charset=utf-8"
);
assert_eq!(response.headers()[HEMX_FINGERPRINT_HEADER], "42");
assert!(!response.headers().contains_key(HEMX_PARTIAL_HEADER));
assert!(!response.headers().contains_key(HEMX_TITLE_HEADER));
assert_eq!(
to_bytes(response.into_body(), 1024).await.unwrap().as_ref(),
b"<html>Full</html>"
);
// test req: page_swap/001 req: abi/005
}
#[test]
fn partial_page_response_sets_partial_and_title_headers() {
let response = PageResponse::partial("<main>Docs</main>")