use super::{ClientError, ErrorDetail};
fn assert_send_sync_static<T: Send + Sync + 'static>() {}
#[test]
fn client_error_is_send_sync_static() {
assert_send_sync_static::<ClientError>();
}
fn all_variants() -> Vec<ClientError> {
vec![
ClientError::not_found("d"),
ClientError::already_exists("d"),
ClientError::query_failed("d"),
ClientError::query_timeout("d"),
ClientError::unknown_query("d"),
ClientError::not_running("d"),
ClientError::cancelled("d"),
ClientError::unavailable("d"),
ClientError::unauthenticated("d"),
ClientError::namespace_denied("d"),
ClientError::invalid_argument("d"),
ClientError::invalid_state("d"),
ClientError::not_owner("d"),
ClientError::server("d"),
]
}
#[test]
fn display_is_class_colon_detail_for_every_variant() {
let mut classes = Vec::new();
for error in all_variants() {
assert_eq!(
error.to_string(),
format!("{}: d", error.class()),
"{error:?} Display must be `<class>: <detail>`",
);
assert_eq!(error.detail().message, "d");
classes.push(error.class());
}
let expected = [
"not_found",
"already_exists",
"query_failed",
"query_timeout",
"unknown_query",
"not_running",
"cancelled",
"unavailable",
"unauthenticated",
"namespace_denied",
"invalid_input",
"invalid_state",
"not_owner",
"backend",
];
assert_eq!(classes, expected, "class strings are a pinned contract");
}
#[test]
fn detail_display_appends_the_typed_discriminator() {
assert_eq!(ErrorDetail::new("plain").to_string(), "plain");
assert_eq!(
ErrorDetail::with_type("store unavailable", "Durability").to_string(),
"store unavailable [Durability]"
);
assert_eq!(
ClientError::not_found(ErrorDetail::with_type(
"workflow was not found",
"WorkflowNotFound"
))
.to_string(),
"not_found: workflow was not found [WorkflowNotFound]"
);
}
#[test]
fn not_owner_is_its_own_class_and_never_collapses_into_unavailable() {
let fenced = ClientError::from_wire_error(aion_proto::WireError::not_owner(
"workflow shard 1 is owned by another cluster node",
));
assert_eq!(fenced.class(), "not_owner");
assert!(matches!(fenced, ClientError::NotOwner { .. }));
let lagged = ClientError::from_wire_error(aion_proto::WireError::lagged("subscriber lagged"));
assert_eq!(lagged.class(), "unavailable");
}