mod support;
use axum::http::{Method, StatusCode};
use support::{ADMIN, Spec, fixture, fixture_without_admin, send};
#[pollster::test]
async fn the_admin_listing_opens_for_the_token_and_for_a_staff_member() {
let spec = Spec::with_staff("org-staff", "admin");
for kit in fixture(&spec).kits {
kit.seed_org("org-staff", "Staff", "bob", "admin").await;
let _ = kit.create_org("alice", "Acme").await;
let machine = send(&kit, Method::GET, "/v1/orgs/admin/orgs", Some(ADMIN), None).await;
assert_eq!(machine.status, StatusCode::OK, "{:?}", machine.text());
assert_eq!(machine.json()["orgs"].as_array().expect("orgs").len(), 2);
let staff = kit.get("/v1/orgs/admin/orgs", "bob").await;
assert_eq!(staff.status, StatusCode::OK, "{:?}", staff.text());
assert_eq!(staff.json()["orgs"].as_array().expect("orgs").len(), 2);
}
}
#[pollster::test]
async fn a_non_staff_person_is_refused_and_an_anonymous_caller_is_unauthorized() {
let spec = Spec::with_staff("org-staff", "admin");
for kit in fixture(&spec).kits {
kit.seed_org("org-staff", "Staff", "bob", "admin").await;
kit.seed_member("org-staff", "carol", "staff").await;
let stranger = kit.get("/v1/orgs/admin/orgs", "carol").await;
assert_eq!(
stranger.status,
StatusCode::FORBIDDEN,
"{:?}",
stranger.text()
);
assert_eq!(stranger.problem_slug(), "admin-forbidden");
assert_eq!(
kit.get("/v1/orgs/admin/orgs", "dave").await.status,
StatusCode::FORBIDDEN,
"someone outside the staff organization is refused too"
);
let anonymous = send(&kit, Method::GET, "/v1/orgs/admin/orgs", None, None).await;
assert_eq!(anonymous.status, StatusCode::UNAUTHORIZED);
assert_eq!(anonymous.problem_slug(), "admin-unauthorized");
let bad_token = send(
&kit,
Method::GET,
"/v1/orgs/admin/orgs",
Some("not-the-admin-token"),
None,
)
.await;
assert_eq!(bad_token.status, StatusCode::FORBIDDEN);
assert_eq!(bad_token.problem_slug(), "admin-forbidden");
}
}
#[pollster::test]
async fn without_an_admin_token_only_the_staff_path_opens_the_listing() {
let spec = Spec::with_staff("org-staff", "admin");
for kit in fixture_without_admin(&spec).kits {
kit.seed_org("org-staff", "Staff", "bob", "admin").await;
let _ = kit.create_org("alice", "Acme").await;
let machine = send(&kit, Method::GET, "/v1/orgs/admin/orgs", Some(ADMIN), None).await;
assert_eq!(
machine.status,
StatusCode::FORBIDDEN,
"{:?}",
machine.text()
);
assert_eq!(machine.problem_slug(), "admin-forbidden");
let anonymous = send(&kit, Method::GET, "/v1/orgs/admin/orgs", None, None).await;
assert_eq!(anonymous.status, StatusCode::UNAUTHORIZED);
assert_eq!(anonymous.problem_slug(), "admin-unauthorized");
let staff = kit.get("/v1/orgs/admin/orgs", "bob").await;
assert_eq!(staff.status, StatusCode::OK, "{:?}", staff.text());
assert_eq!(staff.json()["orgs"].as_array().expect("orgs").len(), 2);
let outsider = kit.get("/v1/orgs/admin/orgs", "alice").await;
assert_eq!(outsider.status, StatusCode::FORBIDDEN);
assert_eq!(outsider.problem_slug(), "admin-forbidden");
}
}
#[pollster::test]
async fn without_a_staff_organization_a_person_is_not_staff() {
for kit in fixture(&Spec::default()).kits {
let machine = send(&kit, Method::GET, "/v1/orgs/admin/orgs", Some(ADMIN), None).await;
assert_eq!(machine.status, StatusCode::OK, "{:?}", machine.text());
assert!(machine.json()["orgs"].as_array().expect("orgs").is_empty());
let person = kit.get("/v1/orgs/admin/orgs", "alice").await;
assert_eq!(person.status, StatusCode::FORBIDDEN);
assert_eq!(person.problem_slug(), "admin-forbidden");
let anonymous = send(&kit, Method::GET, "/v1/orgs/admin/orgs", None, None).await;
assert_eq!(anonymous.status, StatusCode::UNAUTHORIZED);
assert_eq!(anonymous.problem_slug(), "admin-unauthorized");
}
}