2026-04-01 21:16:39 -04:00
|
|
|
use notsecrets::{FileSource, IdentitySource, X25519Identity, resolve_identities};
|
2026-03-31 17:26:10 -04:00
|
|
|
use std::fs;
|
|
|
|
|
use tempfile::TempDir;
|
|
|
|
|
|
2026-04-01 21:16:39 -04:00
|
|
|
fn generate_age_key_str() -> String {
|
|
|
|
|
use rand::rngs::OsRng;
|
|
|
|
|
use x25519_dalek::StaticSecret;
|
|
|
|
|
let identity = X25519Identity::from_static_secret(StaticSecret::random_from_rng(OsRng));
|
|
|
|
|
identity.to_bech32()
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-31 17:26:10 -04:00
|
|
|
#[test]
|
2026-04-01 21:16:39 -04:00
|
|
|
fn test_file_source_loads_valid_key() {
|
2026-03-31 17:26:10 -04:00
|
|
|
let dir = TempDir::new().unwrap();
|
|
|
|
|
let key_file = dir.path().join("age.key");
|
2026-04-01 21:16:39 -04:00
|
|
|
let key = generate_age_key_str();
|
|
|
|
|
fs::write(&key_file, format!("{}\n", key)).unwrap();
|
2026-03-31 17:26:10 -04:00
|
|
|
|
|
|
|
|
let source = FileSource::new(key_file.clone());
|
2026-04-01 21:16:39 -04:00
|
|
|
let result = source.load();
|
|
|
|
|
assert!(result.is_ok(), "expected Ok, got: {:?}", result.err());
|
2026-03-31 17:26:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_file_source_missing_returns_err() {
|
|
|
|
|
let source = FileSource::new("/nonexistent/age.key".into());
|
2026-04-01 21:16:39 -04:00
|
|
|
assert!(source.load().is_err());
|
2026-03-31 17:26:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
2026-04-01 21:16:39 -04:00
|
|
|
fn test_resolve_identities_uses_file_source() {
|
2026-03-31 17:26:10 -04:00
|
|
|
let dir = TempDir::new().unwrap();
|
|
|
|
|
let key_file = dir.path().join("age.key");
|
2026-04-01 21:16:39 -04:00
|
|
|
let key = generate_age_key_str();
|
|
|
|
|
fs::write(&key_file, format!("{}\n", key)).unwrap();
|
2026-03-31 17:26:10 -04:00
|
|
|
|
2026-04-01 21:16:39 -04:00
|
|
|
let sources: Vec<Box<dyn IdentitySource>> = vec![Box::new(FileSource::new(key_file))];
|
|
|
|
|
let ids = resolve_identities(sources).unwrap();
|
|
|
|
|
assert_eq!(ids.len(), 1);
|
2026-03-31 17:26:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
2026-04-01 21:16:39 -04:00
|
|
|
fn test_resolve_identities_all_fail_returns_err() {
|
|
|
|
|
let sources: Vec<Box<dyn IdentitySource>> =
|
2026-04-01 20:44:05 -04:00
|
|
|
vec![Box::new(FileSource::new("/nonexistent".into()))];
|
2026-04-01 21:16:39 -04:00
|
|
|
assert!(resolve_identities(sources).is_err());
|
2026-03-31 17:26:10 -04:00
|
|
|
}
|