use apcore_cli::security::config_encryptor::{ConfigDecryptionError, ConfigEncryptor};
use base64::engine::general_purpose::STANDARD as B64;
use base64::Engine as _;
fn aes_enc() -> ConfigEncryptor {
ConfigEncryptor::new_forced_aes()
}
#[test]
fn test_store_and_retrieve_roundtrip() {
let enc = aes_enc();
let token = enc
.store("auth.api_key", "my-secret")
.expect("store must succeed");
let result = enc
.retrieve(&token, "auth.api_key")
.expect("retrieve must succeed");
assert_eq!(result, "my-secret");
}
#[test]
fn test_retrieve_missing_key_returns_error() {
let enc = aes_enc();
let result = enc.retrieve("keyring:__apcore_test_missing_9f3d__", "auth.api_key");
assert!(
matches!(result, Err(ConfigDecryptionError::KeyringError(_))),
"expected KeyringError for missing keyring entry, got {result:?}"
);
}
#[test]
fn test_tampered_ciphertext_returns_auth_tag_error() {
let enc = aes_enc();
let mut bad = vec![0u8; 40];
bad[12] ^= 0xFF; let config_value = format!("enc:{}", B64.encode(&bad));
let result = enc.retrieve(&config_value, "some.key");
assert!(
matches!(result, Err(ConfigDecryptionError::AuthTagMismatch)),
"expected AuthTagMismatch for tampered v1 ciphertext, got {result:?}"
);
}
#[test]
fn test_tampered_v2_ciphertext_returns_auth_tag_error() {
let enc = aes_enc();
let mut bad = vec![0u8; 56]; bad[16 + 12] ^= 0xFF; let config_value = format!("enc:v2:{}", B64.encode(&bad));
let result = enc.retrieve(&config_value, "some.key");
assert!(
matches!(result, Err(ConfigDecryptionError::AuthTagMismatch)),
"expected AuthTagMismatch for tampered v2 ciphertext, got {result:?}"
);
}
#[test]
fn test_store_produces_v2_token() {
let enc = aes_enc();
let token = enc.store("some.key", "value").expect("store must succeed");
assert!(
token.starts_with("enc:v2:"),
"store must produce enc:v2: token, got: {token}"
);
}
#[test]
fn test_different_services_are_independent() {
let enc = aes_enc();
let token_a = enc.store("service.key_a", "value-a").expect("store a");
let token_b = enc.store("service.key_b", "value-b").expect("store b");
let result_a = enc.retrieve(&token_a, "service.key_a").expect("retrieve a");
let result_b = enc.retrieve(&token_b, "service.key_b").expect("retrieve b");
assert_eq!(result_a, "value-a");
assert_eq!(result_b, "value-b");
assert_ne!(token_a, token_b);
}