use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AddTrustedKeyPayload {
pub key_id: String,
pub public_key_pem: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TrustRootSeed {
pub key_id: String,
pub public_key_pem: String,
pub trusted_key_count: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TrustRootAddOutcome {
pub added_key_id: String,
pub trusted_key_count: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TrustRootRemoveOutcome {
pub removed_key_id: String,
pub removed_public_key_pem: Option<String>,
pub trusted_key_count: usize,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn add_payload_encoding_is_pinned() {
let payload = AddTrustedKeyPayload {
key_id: "abc123".to_string(),
public_key_pem: "-----BEGIN PUBLIC KEY-----".to_string(),
};
assert_eq!(
serde_json::to_value(&payload).unwrap(),
json!({"key_id": "abc123", "public_key_pem": "-----BEGIN PUBLIC KEY-----"})
);
}
#[test]
fn seed_encoding_is_pinned() {
let seed = TrustRootSeed {
key_id: "abc123".to_string(),
public_key_pem: "pem".to_string(),
trusted_key_count: 1,
};
assert_eq!(
serde_json::to_value(&seed).unwrap(),
json!({"key_id": "abc123", "public_key_pem": "pem", "trusted_key_count": 1})
);
assert_eq!(
serde_json::to_value(Option::<TrustRootSeed>::None).unwrap(),
json!(null)
);
}
#[test]
fn add_outcome_encoding_is_pinned() {
let outcome = TrustRootAddOutcome {
added_key_id: "abc123".to_string(),
trusted_key_count: 2,
};
assert_eq!(
serde_json::to_value(&outcome).unwrap(),
json!({"added_key_id": "abc123", "trusted_key_count": 2})
);
}
#[test]
fn remove_outcome_encodes_noop_pem_as_explicit_null() {
let outcome = TrustRootRemoveOutcome {
removed_key_id: "abc123".to_string(),
removed_public_key_pem: None,
trusted_key_count: 0,
};
assert_eq!(
serde_json::to_value(&outcome).unwrap(),
json!({
"removed_key_id": "abc123",
"removed_public_key_pem": null,
"trusted_key_count": 0
})
);
}
#[test]
fn outcomes_round_trip() {
let removed = TrustRootRemoveOutcome {
removed_key_id: "abc123".to_string(),
removed_public_key_pem: Some("pem".to_string()),
trusted_key_count: 1,
};
let parsed: TrustRootRemoveOutcome =
serde_json::from_str(&serde_json::to_string(&removed).unwrap()).unwrap();
assert_eq!(parsed, removed);
}
}