75 lines
2.0 KiB
Rust
75 lines
2.0 KiB
Rust
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)
|
|
);
|
|
}
|