swactor/crates/datastore/tests/acl_persistence_tests.rs
Zachery Aaron Shores-Chmielewski e2017ea369
Some checks failed
ci/check Job 'check' failed: command exited with code 101 [stderr] | |_^ [stderr] | [stderr] = note: the lang item is first defined in crate `std` (which `ed25519_dalek` depends on) [stderr] = note: first definition in `std` loaded from /home/z...
ci/clippy Job 'clippy' failed: command exited with code 101 [stderr] help: try adding this [stderr] | [stderr] 157 + impl Default for TransportRouter { [stderr] 158 + fn default() -> Self { [stderr] 159 + Self::new() [stderr] 160 + } [st...
ci/ci Pipeline 'ci' failure
feat: MVP authorization layer for swactor datastores (#43)
Very barebones, untrustworthy, barely reviewed auth layer. LGTM.
Co-authored-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
Co-committed-by: Zachery Aaron Shores-Chmielewski <zacheryasc@gmail.com>
2026-02-16 15:39:27 +00:00

59 lines
2.5 KiB
Rust

//! ACL file persistence tests — roundtrip save/load.
use std::collections::{HashMap, HashSet};
use distribution::crypto::Keypair;
use swactor_datastore::auth::AccessControlList;
// ═══════════════════════════════════════════════════════════════════════════
// 1. Save + load preserves owner and authorized_keys
// ═══════════════════════════════════════════════════════════════════════════
#[test]
fn save_and_load_roundtrip() {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("acl.json");
let owner = Keypair::generate().node_id();
let client_a = Keypair::generate().node_id();
let client_b = Keypair::generate().node_id();
let mut keys = HashSet::new();
keys.insert(client_a);
keys.insert(client_b);
let acl = AccessControlList {
owner,
authorized_keys: keys.clone(),
key_labels: HashMap::new(),
};
acl.save(&path).unwrap();
let loaded = AccessControlList::load_or_create(&path, owner).unwrap();
assert_eq!(loaded.owner, owner);
assert_eq!(loaded.authorized_keys, keys);
}
// ═══════════════════════════════════════════════════════════════════════════
// 2. load_or_create on missing file creates default
// ═══════════════════════════════════════════════════════════════════════════
#[test]
fn load_or_create_on_missing_file_creates_default() {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("nonexistent/acl.json");
let owner = Keypair::generate().node_id();
let acl = AccessControlList::load_or_create(&path, owner).unwrap();
assert_eq!(acl.owner, owner);
assert!(acl.authorized_keys.is_empty());
// File should now exist
assert!(path.exists());
// Loading again should give same result
let acl2 = AccessControlList::load_or_create(&path, owner).unwrap();
assert_eq!(acl2.owner, owner);
assert!(acl2.authorized_keys.is_empty());
}