use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Secret {
pub id: Uuid,
pub key: String,
#[serde(skip_serializing)]
pub value: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecretMetadata {
pub id: Uuid,
pub key: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn secret_serde_excludes_value() {
let secret = Secret {
id: Uuid::now_v7(),
key: "test/my-secret".to_string(),
value: "super-secret-value-should-not-appear".to_string(),
created_at: Utc::now(),
updated_at: Utc::now(),
};
let json = serde_json::to_string(&secret).expect("serialize");
assert!(!json.contains("super-secret-value-should-not-appear"));
assert!(json.contains("test/my-secret"));
}
#[test]
fn secret_preserves_value_in_struct() {
let secret = Secret {
id: Uuid::now_v7(),
key: "k".to_string(),
value: "v".to_string(),
created_at: Utc::now(),
updated_at: Utc::now(),
};
assert_eq!(secret.value, "v");
}
#[test]
fn secret_metadata_serde_has_no_value() {
let meta = SecretMetadata {
id: Uuid::now_v7(),
key: "my/key".to_string(),
created_at: Utc::now(),
updated_at: Utc::now(),
};
let json = serde_json::to_string(&meta).expect("serialize");
assert!(json.contains("my/key"));
assert!(!json.contains("value"));
}
}