use secure_data::config::SecretReference;
use secure_data::error::DataError;
use secure_data::kms::{KeyProvider, StaticDevKeyProvider};
use secure_data::resolve::resolve_secret;
#[tokio::test]
async fn e2e_static_dev_provider_backward_compat() {
let provider = StaticDevKeyProvider::new();
let (dek, wrapped, version) = provider
.generate_data_key("e2e-test-key")
.await
.expect("generate_data_key must succeed");
let recovered = provider
.unwrap_data_key(&wrapped, "e2e-test-key", &version)
.await
.expect("unwrap_data_key must succeed");
assert_eq!(
dek.as_slice(),
recovered.as_slice(),
"recovered DEK must match original"
);
}
#[tokio::test]
async fn e2e_envelope_encryption_still_works() {
use secure_data::envelope::{decrypt_for_use, encrypt_for_storage};
let provider = StaticDevKeyProvider::new();
let plaintext = b"e2e test plaintext for m13 regression";
let envelope = encrypt_for_storage(plaintext, "e2e-key", &provider)
.await
.expect("encryption must succeed");
let recovered = decrypt_for_use(&envelope, &provider)
.await
.expect("decryption must succeed");
assert_eq!(recovered, plaintext, "recovered plaintext must match");
}
#[tokio::test]
async fn e2e_resolve_secret_env() {
std::env::set_var("E2E_M13_SECRET", "e2e-resolved-value");
let reference = SecretReference::parse("env://E2E_M13_SECRET").unwrap();
let secret = resolve_secret(&reference)
.await
.expect("env:// resolution must succeed");
assert_eq!(secret.expose_secret(), "e2e-resolved-value");
std::env::remove_var("E2E_M13_SECRET");
}
#[tokio::test]
async fn e2e_resolve_secret_env_missing_returns_error() {
std::env::remove_var("E2E_M13_NO_SUCH_VAR_XYZ");
let reference = SecretReference::parse("env://E2E_M13_NO_SUCH_VAR_XYZ").unwrap();
let result = resolve_secret(&reference).await;
assert!(
matches!(result, Err(DataError::SecretNotFound { .. })),
"must return SecretNotFound for missing env var"
);
}
#[tokio::test]
async fn e2e_new_error_variants_are_display_formatted() {
let unavailable = DataError::ProviderUnavailable {
provider: "vault".to_string(),
reason: "connection refused".to_string(),
};
let auth_error = DataError::ProviderAuthError {
provider: "vault".to_string(),
reason: "invalid token".to_string(),
};
let not_found = DataError::SecretNotFound {
reference: "env://MISSING".to_string(),
};
assert!(!unavailable.to_string().is_empty());
assert!(!auth_error.to_string().is_empty());
assert!(!not_found.to_string().is_empty());
}
#[tokio::test]
async fn e2e_secret_reference_parsing_all_schemes() {
let vault_ref = SecretReference::parse("vault://kv/path#field").expect("vault:// must parse");
let kms_ref = SecretReference::parse("kms://alias/my-key").expect("kms:// must parse");
let env_ref = SecretReference::parse("env://MY_VAR").expect("env:// must parse");
assert_eq!(vault_ref.path, "kv/path");
assert_eq!(vault_ref.field, Some("field".to_string()));
assert_eq!(kms_ref.path, "alias/my-key");
assert_eq!(env_ref.path, "MY_VAR");
}