use plexus_auth_core::{
AuthMechanism, BackendAuthCapabilities, ClientId, CookieName, HeaderName, IssuerUrl,
MethodPath,
};
use plexus_core::plexus::DynamicHub;
use serde_json::{json, Value};
fn expected_info_payload(
namespace: &str,
caps: Option<&BackendAuthCapabilities>,
) -> Value {
let advertised = match caps {
Some(c) => c.clone(),
None => BackendAuthCapabilities::anonymous_default(),
};
json!({
"backend": namespace,
"auth_capabilities": advertised,
})
}
#[test]
fn default_hub_has_no_auth_capabilities_set() {
let hub = DynamicHub::new("substrate");
assert!(
hub.auth_capabilities().is_none(),
"newly-constructed hub should not have caps set"
);
}
#[test]
fn default_hub_info_emits_anonymous_default() {
let hub = DynamicHub::new("substrate");
let info = expected_info_payload("substrate", hub.auth_capabilities());
assert_eq!(
info,
json!({
"backend": "substrate",
"auth_capabilities": {
"mechanisms": [{ "kind": "anonymous" }]
}
}),
"default _info payload should be backwards-compatible additive shape \
with an anonymous-only auth_capabilities"
);
assert_eq!(info["backend"], json!("substrate"));
}
#[test]
fn with_auth_capabilities_stores_value_verbatim() {
let caps = BackendAuthCapabilities::new(
vec![AuthMechanism::Cookie {
cookie: CookieName::try_new("plexus_session").unwrap(),
login: MethodPath::try_new("auth.login").unwrap(),
refresh: None,
logout: None,
}],
Some(0),
)
.unwrap();
let hub = DynamicHub::new("substrate").with_auth_capabilities(caps.clone());
let stored = hub.auth_capabilities().expect("caps were set");
assert_eq!(stored, &caps);
}
#[test]
fn with_cookie_mechanism_info_emits_advertisement() {
let caps = BackendAuthCapabilities::new(
vec![AuthMechanism::Cookie {
cookie: CookieName::try_new("plexus_session").unwrap(),
login: MethodPath::try_new("auth.login").unwrap(),
refresh: Some(MethodPath::try_new("auth.refresh").unwrap()),
logout: Some(MethodPath::try_new("auth.logout").unwrap()),
}],
Some(0),
)
.unwrap();
let hub = DynamicHub::new("substrate").with_auth_capabilities(caps);
let info = expected_info_payload("substrate", hub.auth_capabilities());
assert_eq!(
info,
json!({
"backend": "substrate",
"auth_capabilities": {
"mechanisms": [{
"kind": "cookie",
"cookie": "plexus_session",
"login": "auth.login",
"refresh": "auth.refresh",
"logout": "auth.logout"
}],
"default": 0
}
})
);
}
#[test]
fn with_full_capabilities_info_matches_spec_example() {
let caps = BackendAuthCapabilities::new(
vec![
AuthMechanism::Bearer {
header: HeaderName::try_new("authorization").unwrap(),
},
AuthMechanism::Cookie {
cookie: CookieName::try_new("plexus_session").unwrap(),
login: MethodPath::try_new("auth.login").unwrap(),
refresh: Some(MethodPath::try_new("auth.refresh").unwrap()),
logout: Some(MethodPath::try_new("auth.logout").unwrap()),
},
AuthMechanism::Oidc {
issuer: IssuerUrl::try_new(
"https://accounts.example.com/".parse().unwrap(),
)
.unwrap(),
client_id: ClientId::try_new("plexus-substrate").unwrap(),
exchange: Some(MethodPath::try_new("auth.exchange").unwrap()),
request_scopes: vec!["openid".into(), "profile".into(), "email".into()],
},
],
Some(1),
)
.unwrap();
let hub = DynamicHub::new("substrate").with_auth_capabilities(caps);
let info = expected_info_payload("substrate", hub.auth_capabilities());
assert_eq!(
info,
json!({
"backend": "substrate",
"auth_capabilities": {
"mechanisms": [
{ "kind": "bearer", "header": "authorization" },
{
"kind": "cookie",
"cookie": "plexus_session",
"login": "auth.login",
"refresh": "auth.refresh",
"logout": "auth.logout"
},
{
"kind": "oidc",
"issuer": "https://accounts.example.com/",
"client_id": "plexus-substrate",
"exchange": "auth.exchange",
"request_scopes": ["openid", "profile", "email"]
}
],
"default": 1
}
})
);
}
#[test]
fn info_is_round_trippable_through_backend_auth_capabilities() {
let caps_in = BackendAuthCapabilities::new(
vec![AuthMechanism::Anonymous],
None,
)
.unwrap();
let hub = DynamicHub::new("substrate").with_auth_capabilities(caps_in.clone());
let info = expected_info_payload("substrate", hub.auth_capabilities());
let caps_out: BackendAuthCapabilities =
serde_json::from_value(info["auth_capabilities"].clone())
.expect("auth_capabilities should round-trip via serde");
assert_eq!(caps_out, caps_in);
}