Files
crank/apps/admin-api/tests/unit/error.rs
T

82 lines
3.0 KiB
Rust

use admin_api::error::{
execution_test_failure, execution_test_failure_localized, runtime_test_failure,
};
use crank_core::{CorrelationContext, ExecutionErrorCode, ExecutionFailure, ExecutionLocale};
use crank_runtime::RuntimeError;
#[test]
fn runtime_test_failure_includes_structured_context() {
let payload = runtime_test_failure(&RuntimeError::InvalidPreparedRequest {
field: "request.headers".to_owned(),
reason: "must be an object".to_owned(),
});
assert_eq!(payload["code"], "prepared_request_invalid");
assert_eq!(payload["stage"], "request_preparation");
assert_eq!(payload["retryability"], "never");
assert_eq!(payload["outcome_certainty"], "certain");
assert!(payload.get("context").is_none());
}
#[test]
fn runtime_error_context_does_not_expose_secret_crypto_details() {
let canary = "story18-secret-crypto-canary";
let payload = runtime_test_failure(&RuntimeError::SecretCrypto {
operation: "decode secret envelope",
details: canary.to_owned(),
});
assert_eq!(payload["code"], "secret_invalid");
assert!(!payload.to_string().contains(canary));
}
#[test]
fn runtime_test_failure_includes_runtime_overload_context() {
let payload = runtime_test_failure(&RuntimeError::ConcurrencyLimitExceeded {
kind: "window",
limit: 16,
});
assert_eq!(payload["code"], "execution_overloaded");
assert_eq!(payload["stage"], "admission");
assert_eq!(payload["retryability"], "after_delay");
assert!(payload.get("context").is_none());
}
#[test]
fn every_execution_code_projects_the_canonical_semantics_without_raw_context() {
let canary = "story18-admin-projection-canary";
for code in ExecutionErrorCode::ALL {
let failure = ExecutionFailure::new(code, CorrelationContext::generate());
let payload = execution_test_failure(&failure);
assert_eq!(payload["code"], code.as_str());
assert_eq!(payload["stage"], code.stage().as_str());
assert_eq!(payload["retryability"], code.retryability().as_str());
assert_eq!(
payload["outcome_certainty"],
code.outcome_certainty().as_str()
);
assert!(!payload["message"].as_str().unwrap_or_default().is_empty());
assert!(!payload.to_string().contains(canary));
}
}
#[test]
fn confirmation_challenge_is_bounded_and_localized_at_the_admin_boundary() {
let failure = ExecutionFailure::new(
ExecutionErrorCode::ConfirmationRequired,
CorrelationContext::generate(),
)
.try_with_confirmation("confirmation-capability", 30_000)
.unwrap();
let payload = execution_test_failure_localized(&failure, ExecutionLocale::Ru);
assert_eq!(payload["message"], "Операция требует подтверждения.");
assert_eq!(
payload["context"]["confirmation_token"],
"confirmation-capability"
);
assert_eq!(payload["context"]["expires_in_ms"], 30_000);
assert!(!format!("{failure:?}").contains("confirmation-capability"));
}