use vault_client_rs::types::auth::*;
use vault_client_rs::types::sys::*;
use vault_client_rs::{Kv2Operations, TokenAuthOperations, VaultClient, VaultError};
use crate::common::*;
fn client() -> VaultClient {
build_client(&vault_addr(), vault_token())
}
#[tokio::test]
async fn health() {
let client = client();
let health = client.sys().health().await.unwrap();
assert!(health.initialized);
assert!(!health.sealed);
}
#[tokio::test]
async fn seal_status() {
let client = client();
let status = client.sys().seal_status().await.unwrap();
assert!(status.initialized);
assert!(!status.sealed);
}
#[tokio::test]
async fn list_mounts() {
let client = client();
let mounts = client.sys().list_mounts().await.unwrap();
assert!(mounts.contains_key("secret/"));
}
#[tokio::test]
async fn policies() {
let client = client();
let name = unique_name("pol");
let policies = client.sys().list_policies().await.unwrap();
assert!(policies.contains(&"default".to_string()));
let rules = format!(r#"path "secret/data/{name}/*" {{ capabilities = ["read"] }}"#);
client.sys().write_policy(&name, &rules).await.unwrap();
let info = client.sys().read_policy(&name).await.unwrap();
assert!(info.policy.contains(&name));
client.sys().delete_policy(&name).await.unwrap();
}
#[tokio::test]
async fn mount_unmount() {
let client = client();
let mount_path = unique_name("mnt");
let params = MountParams {
mount_type: "kv".to_string(),
description: Some("test mount".into()),
config: None,
options: Some([("version".to_string(), "2".to_string())].into()),
};
client.sys().mount(&mount_path, ¶ms).await.unwrap();
let mounts = client.sys().list_mounts().await.unwrap();
assert!(mounts.contains_key(&format!("{mount_path}/")));
client.sys().unmount(&mount_path).await.unwrap();
}
#[tokio::test]
async fn leader() {
let client = client();
let resp = client.sys().leader().await.unwrap();
assert!(!resp.ha_enabled || resp.is_self);
}
#[tokio::test]
async fn tune_mount_and_read_tune() {
let client = client();
let path = unique_name("tune");
client
.sys()
.mount(
&path,
&MountParams {
mount_type: "kv".into(),
description: Some("tune test".into()),
config: None,
options: Some([("version".to_string(), "2".to_string())].into()),
},
)
.await
.unwrap();
client
.sys()
.tune_mount(
&path,
&MountTuneParams {
default_lease_ttl: Some("3600s".into()),
max_lease_ttl: Some("7200s".into()),
description: None,
},
)
.await
.unwrap();
let tune = client.sys().read_mount_tune(&path).await.unwrap();
assert_eq!(tune.default_lease_ttl, 3600);
assert_eq!(tune.max_lease_ttl, 7200);
client.sys().unmount(&path).await.unwrap();
}
#[tokio::test]
async fn auth_mount_lifecycle() {
let client = client();
let path = unique_name("auth");
client
.sys()
.enable_auth(
&path,
&AuthMountParams {
mount_type: "approle".into(),
description: Some("lifecycle test".into()),
config: None,
},
)
.await
.unwrap();
let mounts = client.sys().list_auth_mounts().await.unwrap();
assert!(mounts.contains_key(&format!("{path}/")));
let tune = client.sys().read_auth_tune(&path).await.unwrap();
assert!(tune.default_lease_ttl > 0);
client.sys().disable_auth(&path).await.unwrap();
}
#[tokio::test]
async fn capabilities_self() {
let client = client();
let caps = client
.sys()
.capabilities_self(&["secret/data/test"])
.await
.unwrap();
let cap_list = caps.get("secret/data/test").unwrap();
assert!(cap_list.contains(&"root".to_string()));
}
#[tokio::test]
async fn capabilities() {
let client = client();
let params = TokenCreateRequest {
policies: Some(vec!["default".into()]),
ttl: Some("5m".into()),
..Default::default()
};
let auth = client.auth().token().create(¶ms).await.unwrap();
let caps = client
.sys()
.capabilities(&auth.client_token, &["sys/health"])
.await
.unwrap();
let cap_list = caps.get("sys/health").unwrap();
assert!(cap_list.contains(&"deny".to_string()));
client
.auth()
.token()
.revoke(&auth.client_token)
.await
.unwrap();
}
#[tokio::test]
async fn key_status() {
let client = client();
let status = client.sys().key_status().await.unwrap();
assert!(status.term >= 1);
assert!(!status.install_time.is_empty());
}
#[tokio::test]
async fn audit_lifecycle() {
let client = client();
let path = unique_name("audit");
let log_path = format!("/tmp/vault-audit-{path}.log");
client
.sys()
.enable_audit(
&path,
&AuditParams {
audit_type: "file".into(),
description: Some("test audit".into()),
options: [("file_path".to_string(), log_path)].into(),
local: None,
},
)
.await
.unwrap();
let devices = client.sys().list_audit_devices().await.unwrap();
assert!(devices.contains_key(&format!("{path}/")));
client.sys().disable_audit(&path).await.unwrap();
}
#[tokio::test]
async fn lease_read() {
let client = client();
let params = TokenCreateRequest {
policies: Some(vec!["default".into()]),
ttl: Some("1h".into()),
..Default::default()
};
let auth = client.auth().token().create(¶ms).await.unwrap();
let lease_id = format!("auth/token/create/{}", auth.accessor);
let result = client.sys().read_lease(&lease_id).await;
assert!(result.is_ok() || matches!(result.unwrap_err(), VaultError::Api { .. }));
client
.auth()
.token()
.revoke(&auth.client_token)
.await
.unwrap();
}
#[tokio::test]
async fn wrap_lookup_and_unwrap() {
let addr = vault_addr();
let wrapping_client = build_wrapping_client(&addr, vault_token(), "5m");
let params = TokenCreateRequest {
policies: Some(vec!["default".into()]),
ttl: Some("1h".into()),
..Default::default()
};
let resp = wrapping_client.auth().token().create(¶ms).await;
let normal_client = build_client(&addr, vault_token());
let path = unique_name("wrap");
normal_client
.kv2("secret")
.write(&path, &serde_json::json!({"wrapped": "value"}))
.await
.unwrap();
normal_client
.kv2("secret")
.delete_metadata(&path)
.await
.unwrap();
drop(resp);
drop(wrapping_client);
}
#[tokio::test]
async fn wrap_rewrap() {
let addr = vault_addr();
let client = build_wrapping_client(&addr, vault_token(), "5m");
let health = client.sys().health().await.unwrap();
assert!(health.initialized);
}