ic-auth 0.35.2

Portable authentication, delegation proof verification and local session machinery
Documentation
use super::*;

#[test]
fn scope_narrowing_matches_set_inclusion_for_sparse_and_unordered_requests() {
    for allowed in 0_u32..64 {
        let ceiling: Vec<_> = (0..6)
            .filter(|bit| allowed & (1 << bit) != 0)
            .map(|bit| format!("scope{bit}"))
            .collect();
        for wanted in 0_u32..64 {
            let mut requested: Vec<_> = (0..6)
                .filter(|bit| wanted & (1 << bit) != 0)
                .map(|bit| format!("scope{bit}"))
                .collect();
            requested.reverse();
            requested.extend(requested.clone());
            assert_eq!(
                scopes_are_subset(&requested, &ceiling),
                wanted & !allowed == 0
            );
        }
    }
}

#[test]
fn grant_narrowing_keeps_role_boundaries_and_missing_scope_refusals() {
    let grant = |role: &str, scopes: &[&str]| DelegatedRoleGrant {
        target: role.parse().unwrap(),
        scopes: scopes.iter().map(|scope| scope.parse().unwrap()).collect(),
    };
    let ceiling = [grant("a", &["read", "write"]), grant("c", &["read"])];
    for (requested, expected) in [
        (vec![], true),
        (vec![grant("a", &["write"]), grant("c", &["read"])], true),
        (vec![grant("b", &["read"])], false),
        (vec![grant("d", &["read"])], false),
        (vec![grant("c", &["write"])], false),
        (vec![grant("a", &["read", "read_all"])], false),
    ] {
        assert_eq!(grants_are_subset(&requested, &ceiling), expected);
    }
}