use magnetar_admin::AdminClient;
use wiremock::{Mock, MockServer, ResponseTemplate};
const RAW: &str = "n|a[m]e^x";
const ENC: &str = "n%7Ca%5Bm%5De%5Ex";
fn client(mock: &MockServer) -> AdminClient {
AdminClient::builder()
.service_url(mock.uri().parse().unwrap())
.build()
.unwrap()
}
async fn captured_path<F, Fut>(body: serde_json::Value, f: F) -> String
where
F: FnOnce(AdminClient) -> Fut,
Fut: std::future::Future<Output = ()>,
{
let mock = MockServer::start().await;
Mock::given(wiremock::matchers::any())
.respond_with(ResponseTemplate::new(200).set_body_json(body))
.mount(&mock)
.await;
let admin = client(&mock);
f(admin).await;
let requests = mock.received_requests().await.expect("recording enabled");
requests[0].url.path().to_owned()
}
#[tokio::test]
async fn tenant_segment_is_percent_encoded() {
let path = captured_path(serde_json::json!([]), |admin| async move {
let _ = admin.namespaces_list(RAW).await;
})
.await;
assert_eq!(path, format!("/admin/v2/namespaces/{ENC}"));
}
#[tokio::test]
async fn namespace_segment_is_percent_encoded() {
let path = captured_path(serde_json::json!({}), |admin| async move {
let _ = admin.namespace_get_retention(&format!("acme/{RAW}")).await;
})
.await;
assert_eq!(path, format!("/admin/v2/namespaces/acme/{ENC}/retention"));
}
#[tokio::test]
async fn topic_segment_is_percent_encoded() {
let path = captured_path(serde_json::json!([]), |admin| async move {
let _ = admin.subscriptions_list(&format!("acme/svc/{RAW}")).await;
})
.await;
assert_eq!(
path,
format!("/admin/v2/persistent/acme/svc/{ENC}/subscriptions"),
);
}
#[tokio::test]
async fn subscription_segment_is_percent_encoded() {
let path = captured_path(serde_json::json!({}), |admin| async move {
let _ = admin
.subscription_delete("acme/svc/orders", RAW, false)
.await;
})
.await;
assert_eq!(
path,
format!("/admin/v2/persistent/acme/svc/orders/subscription/{ENC}"),
);
}
#[tokio::test]
async fn v3_function_segment_is_percent_encoded() {
let path = captured_path(serde_json::json!({}), |admin| async move {
let _ = admin.function_get("acme", "svc", RAW).await;
})
.await;
assert_eq!(path, format!("/admin/v3/functions/acme/svc/{ENC}"));
}
#[tokio::test]
async fn every_segment_of_a_path_is_encoded_independently() {
let path = captured_path(serde_json::json!([]), |admin| async move {
let _ = admin.subscriptions_list("t|1/n|2/topic|3").await;
})
.await;
assert_eq!(
path,
"/admin/v2/persistent/t%7C1/n%7C2/topic%7C3/subscriptions",
);
}
#[tokio::test]
async fn ordinary_names_are_unchanged() {
let path = captured_path(serde_json::json!([]), |admin| async move {
let _ = admin
.subscriptions_list("public/default/persistent-orders_v2.retry")
.await;
})
.await;
assert_eq!(
path,
"/admin/v2/persistent/public/default/persistent-orders_v2.retry/subscriptions",
);
}