Platform restructured into crates/, added AI service and detector,
migrated control-center-ui to Leptos 0.8
156 lines
4.8 KiB
Rust
156 lines
4.8 KiB
Rust
//! Integration tests for vault secrets management
|
|
//!
|
|
//! These tests verify the vault secrets integration works correctly
|
|
//! by testing the core components in isolation.
|
|
//!
|
|
//! NOTE: These tests are disabled due to API mismatches (KmsServiceClient::new
|
|
//! signature changed) Re-enable after updating the tests to match the current
|
|
//! API
|
|
|
|
// Disabled: API mismatches
|
|
#![allow(unexpected_cfgs)]
|
|
#![cfg(feature = "vault_integration_tests")]
|
|
#![allow(unused_imports)]
|
|
|
|
use std::sync::Arc;
|
|
|
|
use base64::{engine::general_purpose, Engine as _};
|
|
use control_center::kms::audit::AuditLogger;
|
|
use control_center::kms::kms_service_client::KmsServiceClient;
|
|
use control_center::services::secrets::SecretsService;
|
|
use control_center::storage::surrealdb_storage::SurrealDbStorage;
|
|
|
|
#[tokio::test]
|
|
async fn test_kms_client_encrypt_decrypt() {
|
|
// Test KMS Service client can encrypt and decrypt
|
|
let kms_client = KmsServiceClient::new("http://localhost:8081".to_string(), 3);
|
|
|
|
let plaintext = b"test secret value";
|
|
let context = Some("test-context");
|
|
|
|
// Encrypt
|
|
let ciphertext = kms_client
|
|
.encrypt(plaintext, context)
|
|
.await
|
|
.expect("Failed to encrypt");
|
|
|
|
assert!(!ciphertext.is_empty(), "Ciphertext should not be empty");
|
|
assert_ne!(
|
|
ciphertext, plaintext,
|
|
"Ciphertext should differ from plaintext"
|
|
);
|
|
|
|
// Decrypt
|
|
let decrypted = kms_client
|
|
.decrypt(&ciphertext, context)
|
|
.await
|
|
.expect("Failed to decrypt");
|
|
|
|
assert_eq!(
|
|
decrypted, plaintext,
|
|
"Decrypted value should match original"
|
|
);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_kms_client_health_check() {
|
|
let kms_client = KmsServiceClient::new("http://localhost:8081".to_string(), 3);
|
|
|
|
let is_healthy = kms_client
|
|
.health_check()
|
|
.await
|
|
.expect("Health check failed");
|
|
|
|
assert!(is_healthy, "KMS Service should be healthy");
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_kms_client_generate_data_key() {
|
|
let kms_client = KmsServiceClient::new("http://localhost:8081".to_string(), 3);
|
|
|
|
let key_spec = "AES_256"; // Key specification
|
|
|
|
let data_key = kms_client
|
|
.generate_data_key(key_spec)
|
|
.await
|
|
.expect("Failed to generate data key");
|
|
|
|
assert!(
|
|
!data_key.plaintext.is_empty(),
|
|
"Plaintext key should not be empty"
|
|
);
|
|
assert!(
|
|
!data_key.ciphertext.is_empty(),
|
|
"Encrypted key should not be empty"
|
|
);
|
|
assert!(!data_key.key_id.is_empty(), "Key ID should not be empty");
|
|
|
|
// Verify plaintext is base64 encoded
|
|
let plaintext_bytes = general_purpose::STANDARD
|
|
.decode(&data_key.plaintext)
|
|
.expect("Plaintext should be valid base64");
|
|
assert_eq!(
|
|
plaintext_bytes.len(),
|
|
32,
|
|
"Decoded plaintext should be 32 bytes for AES-256"
|
|
);
|
|
|
|
// Verify we can decrypt the encrypted key and it matches the plaintext
|
|
let decrypted_key = kms_client
|
|
.decrypt(data_key.ciphertext.as_bytes(), None)
|
|
.await
|
|
.expect("Failed to decrypt data key");
|
|
|
|
assert_eq!(
|
|
decrypted_key, plaintext_bytes,
|
|
"Decrypted key should match plaintext key"
|
|
);
|
|
}
|
|
|
|
#[tokio::test]
|
|
#[ignore] // Requires SurrealDB running
|
|
async fn test_secret_lifecycle_with_storage() {
|
|
// This test would verify the full secret lifecycle:
|
|
// 1. Create secret (encrypt + store metadata)
|
|
// 2. Retrieve secret (fetch metadata + decrypt)
|
|
// 3. Update secret (new version)
|
|
// 4. List secrets
|
|
// 5. Get history
|
|
// 6. Delete secret
|
|
|
|
// Skipped for now due to SurrealDB dependency and control-center
|
|
// compilation issues Once control-center builds successfully, this can
|
|
// be enabled
|
|
}
|
|
|
|
#[test]
|
|
fn test_vault_secret_serialization() {
|
|
use control_center::services::secrets::VaultSecret;
|
|
use serde_json;
|
|
|
|
let secret = VaultSecret {
|
|
id: "secret:test-123".to_string(),
|
|
path: "database/prod/password".to_string(),
|
|
encrypted_value: "base64encodedciphertext".to_string(),
|
|
version: 1,
|
|
created_at: "2025-10-08T00:00:00Z".to_string(),
|
|
updated_at: "2025-10-08T00:00:00Z".to_string(),
|
|
created_by: "user:alice".to_string(),
|
|
updated_by: "user:alice".to_string(),
|
|
deleted: false,
|
|
encryption_context: Some("production".to_string()),
|
|
metadata: Some(serde_json::json!({"environment": "prod"})),
|
|
};
|
|
|
|
// Test serialization
|
|
let json = serde_json::to_string(&secret).expect("Failed to serialize");
|
|
assert!(json.contains("database/prod/password"));
|
|
assert!(json.contains("production"));
|
|
|
|
// Test deserialization
|
|
let deserialized: VaultSecret = serde_json::from_str(&json).expect("Failed to deserialize");
|
|
assert_eq!(deserialized.id, secret.id);
|
|
assert_eq!(deserialized.path, secret.path);
|
|
assert_eq!(deserialized.version, secret.version);
|
|
}
|