use axum::http::{HeaderMap, HeaderValue}; use crank_observability::RequestId; use uuid::Version; #[test] fn preserves_valid_opaque_request_id() { let request_id = RequestId::resolve(Some("req_test-123/abc")); assert_eq!(request_id.as_str(), "req_test-123/abc"); } #[test] fn replaces_missing_and_invalid_values_with_uuid_v7() { for candidate in [ None, Some(""), Some("bad value"), Some(" leading"), Some("trailing "), Some("bad,value"), Some("bad;value"), Some("я"), ] { let request_id = RequestId::resolve(candidate); let parsed = uuid::Uuid::parse_str(request_id.as_str()).expect("generated UUID"); assert_eq!(parsed.get_version(), Some(Version::SortRand)); } } #[test] fn rejects_values_over_the_shared_limit() { let oversized = "x".repeat(RequestId::MAX_LEN + 1); let request_id = RequestId::resolve(Some(&oversized)); assert_ne!(request_id.as_str(), oversized); assert_eq!( uuid::Uuid::parse_str(request_id.as_str()) .expect("generated UUID") .get_version(), Some(Version::SortRand) ); } #[test] fn resolves_exactly_one_header_value_and_rejects_ambiguous_values() { let mut single = HeaderMap::new(); single.insert( "x-request-id", HeaderValue::from_static("opaque-request-id"), ); assert_eq!( RequestId::resolve_from_headers(&single).as_str(), "opaque-request-id" ); let mut ambiguous = HeaderMap::new(); ambiguous.append("x-request-id", HeaderValue::from_static("first-request-id")); ambiguous.append( "x-request-id", HeaderValue::from_static("second-request-id"), ); let generated = RequestId::resolve_from_headers(&ambiguous); assert_ne!(generated.as_str(), "first-request-id"); assert_ne!(generated.as_str(), "second-request-id"); assert_eq!( uuid::Uuid::parse_str(generated.as_str()) .expect("generated UUID") .get_version(), Some(Version::SortRand) ); }