mod client;
mod console;
mod streaming;
mod wire;
pub use client::{AuthServerUnreachable, MantaClient, OpenApiResultExt};
pub(super) use wire::ws_base_url;
#[cfg(test)]
mod tests {
use super::wire::{redact_json_secrets, ws_base_url};
#[test]
fn ws_base_url_promotes_https_to_wss() {
assert_eq!(
ws_base_url("https://manta.example:8443"),
"wss://manta.example:8443"
);
}
#[test]
fn ws_base_url_promotes_http_to_ws() {
assert_eq!(ws_base_url("http://localhost:8080"), "ws://localhost:8080");
}
#[test]
fn ws_base_url_passes_through_unknown_scheme() {
assert_eq!(ws_base_url("ftp://example"), "ftp://example");
assert_eq!(ws_base_url(""), "");
}
#[test]
fn ws_base_url_preserves_path_and_query() {
assert_eq!(
ws_base_url("https://h.example/api/v1?x=1"),
"wss://h.example/api/v1?x=1"
);
}
#[test]
fn redact_replaces_password_and_token_at_top_level() {
let body = r#"{"username":"alice","password":"hunter2"}"#;
let out = redact_json_secrets(body);
assert!(out.contains("\"username\":\"alice\""));
assert!(out.contains("\"password\":\"<REDACTED>\""));
assert!(!out.contains("hunter2"));
}
#[test]
fn redact_replaces_token_field() {
let body = r#"{"token":"eyJhbGciOi..."}"#;
let out = redact_json_secrets(body);
assert!(out.contains("\"token\":\"<REDACTED>\""));
assert!(!out.contains("eyJ"));
}
#[test]
fn redact_walks_into_nested_objects() {
let body = r#"{"outer":{"password":"x"},"inner":{"deep":{"token":"y"}}}"#;
let out = redact_json_secrets(body);
assert!(!out.contains("\"x\""));
assert!(!out.contains("\"y\""));
assert_eq!(out.matches("<REDACTED>").count(), 2);
}
#[test]
fn redact_walks_through_arrays() {
let body = r#"{"creds":[{"password":"a"},{"password":"b"}]}"#;
let out = redact_json_secrets(body);
assert!(!out.contains("\"a\""));
assert!(!out.contains("\"b\""));
assert_eq!(out.matches("<REDACTED>").count(), 2);
}
#[test]
fn redact_leaves_unrelated_fields_alone() {
let body = r#"{"a":1,"b":"x","c":{"d":[1,2,3]}}"#;
let out = redact_json_secrets(body);
assert!(!out.contains("<REDACTED>"));
}
#[test]
fn redact_passes_through_non_json_unchanged() {
let body = "plain text body";
assert_eq!(redact_json_secrets(body), "plain text body");
}
use super::MantaClient;
#[test]
fn new_with_timeout_none_pins_url_and_site() {
let c =
MantaClient::new_with_timeout("http://stub.invalid", "alps", None, None)
.expect("construction with timeout=None must succeed");
assert_eq!(c.base_url(), "http://stub.invalid/api/v1");
assert_eq!(c.site_name(), "alps");
}
#[test]
fn new_with_timeout_some_pins_url_and_site() {
let c = MantaClient::new_with_timeout(
"http://stub.invalid",
"alps",
Some(5),
None,
)
.expect("construction with timeout=Some(5) must succeed");
assert_eq!(c.base_url(), "http://stub.invalid/api/v1");
assert_eq!(c.site_name(), "alps");
}
#[test]
fn new_with_timeout_prepends_http_scheme_when_missing() {
let c =
MantaClient::new_with_timeout("stub.invalid:8080", "alps", None, None)
.expect("scheme-less host must succeed");
assert_eq!(c.base_url(), "http://stub.invalid:8080/api/v1");
}
}