feat(saas): correlate mutation diagnostics
req: operations/001 req: operations/003 req: security/008
This commit is contained in:
@@ -83,6 +83,16 @@ fn create_at_version(
|
||||
)
|
||||
}
|
||||
|
||||
fn response_header<'a>(response: &'a str, name: &str) -> &'a str {
|
||||
response
|
||||
.lines()
|
||||
.find_map(|line| {
|
||||
let (header_name, value) = line.split_once(':')?;
|
||||
header_name.eq_ignore_ascii_case(name).then(|| value.trim())
|
||||
})
|
||||
.unwrap_or_else(|| panic!("missing {name} response header"))
|
||||
}
|
||||
|
||||
fn ready_fingerprint(response: &str) -> &str {
|
||||
let marker = "\"fingerprint\":\"";
|
||||
let start = response.find(marker).expect("readiness fingerprint") + marker.len();
|
||||
@@ -92,7 +102,7 @@ fn ready_fingerprint(response: &str) -> &str {
|
||||
|
||||
#[test]
|
||||
fn authenticated_project_mutation_is_atomic_and_survives_restart() {
|
||||
// test req: auth/001 req: auth/002 req: auth/004 req: security/004 req: v1_release/003
|
||||
// test req: auth/001 req: auth/002 req: auth/004 req: security/004 req: operations/001 req: v1_release/003
|
||||
let address = available_address();
|
||||
let origin = format!("http://{address}");
|
||||
let store = test_path("durable");
|
||||
@@ -131,6 +141,7 @@ fn authenticated_project_mutation_is_atomic_and_survives_restart() {
|
||||
];
|
||||
for denied in &denied_responses {
|
||||
assert!(denied.starts_with("HTTP/1.1 403"), "{denied}");
|
||||
assert!(response_header(denied, "x-request-id").starts_with("req-"));
|
||||
assert!(denied.contains("{\"code\":\"authorization-denied\"}"));
|
||||
assert!(!denied.contains("Denied"));
|
||||
assert!(!denied.contains("demo-csrf"));
|
||||
@@ -192,6 +203,7 @@ fn authenticated_project_mutation_is_atomic_and_survives_restart() {
|
||||
Some("0"),
|
||||
);
|
||||
assert!(stale.starts_with("HTTP/1.1 409"), "{stale}");
|
||||
assert!(response_header(&stale, "x-request-id").starts_with("req-"));
|
||||
assert!(stale.contains("{\"code\":\"deployment-mismatch\"}"));
|
||||
assert!(stale
|
||||
.to_ascii_lowercase()
|
||||
@@ -208,6 +220,9 @@ fn authenticated_project_mutation_is_atomic_and_survives_restart() {
|
||||
Some(fingerprint),
|
||||
);
|
||||
assert!(allowed.starts_with("HTTP/1.1 303"), "{allowed}");
|
||||
let allowed_request_id = response_header(&allowed, "x-request-id");
|
||||
assert!(allowed_request_id.starts_with("req-"));
|
||||
assert_ne!(allowed_request_id, response_header(&stale, "x-request-id"));
|
||||
assert!(request(&address, "GET", "/", &[], "").contains("Durable Project"));
|
||||
let metrics = request(&address, "GET", "/metrics", &[], "");
|
||||
assert!(metrics.contains("\"attempts\":5"), "{metrics}");
|
||||
@@ -246,6 +261,7 @@ fn failed_durable_commit_rolls_back_visible_state() {
|
||||
&origin,
|
||||
);
|
||||
assert!(rejected.starts_with("HTTP/1.1 503"), "{rejected}");
|
||||
assert!(response_header(&rejected, "x-request-id").starts_with("req-"));
|
||||
assert!(rejected.contains("{\"code\":\"storage-unavailable\"}"));
|
||||
assert!(!rejected.contains("Must Rollback"));
|
||||
assert!(!rejected.contains("demo-csrf"));
|
||||
|
||||
Reference in New Issue
Block a user