use hdk::prelude::*;
pub fn check_author_match(
original_author: &AgentPubKey,
action_author: &AgentPubKey,
operation: &str,
) -> ValidateCallbackResult {
if original_author != action_author {
ValidateCallbackResult::Invalid(format!(
"Only the original entry author can {} their entries",
operation
))
} else {
ValidateCallbackResult::Valid
}
}
pub fn check_link_author_match(
original_author: &AgentPubKey,
action_author: &AgentPubKey,
) -> ValidateCallbackResult {
if original_author != action_author {
ValidateCallbackResult::Invalid("Only the original author can delete this link".into())
} else {
ValidateCallbackResult::Valid
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_agent(byte: u8) -> AgentPubKey {
AgentPubKey::from_raw_36(vec![byte; 36])
}
#[test]
fn author_match_same_agent_is_valid() {
let agent = make_agent(1);
let result = check_author_match(&agent, &agent, "update");
assert_eq!(result, ValidateCallbackResult::Valid);
}
#[test]
fn author_match_different_agent_is_invalid() {
let original = make_agent(1);
let impersonator = make_agent(2);
let result = check_author_match(&original, &impersonator, "update");
match &result {
ValidateCallbackResult::Invalid(msg) => {
assert!(msg.contains("update"));
assert!(msg.contains("Only the original entry author"));
}
_ => panic!("Expected Invalid, got {:?}", result),
}
}
#[test]
fn author_match_delete_operation_message() {
let original = make_agent(10);
let other = make_agent(20);
let result = check_author_match(&original, &other, "delete");
match &result {
ValidateCallbackResult::Invalid(msg) => {
assert!(msg.contains("delete"));
}
_ => panic!("Expected Invalid"),
}
}
#[test]
fn author_match_cloned_keys_are_equal() {
let agent = make_agent(42);
let cloned = agent.clone();
let result = check_author_match(&agent, &cloned, "update");
assert_eq!(result, ValidateCallbackResult::Valid);
}
#[test]
fn link_author_match_same_agent_is_valid() {
let agent = make_agent(5);
let result = check_link_author_match(&agent, &agent);
assert_eq!(result, ValidateCallbackResult::Valid);
}
#[test]
fn link_author_match_different_agent_is_invalid() {
let original = make_agent(5);
let other = make_agent(6);
let result = check_link_author_match(&original, &other);
match &result {
ValidateCallbackResult::Invalid(msg) => {
assert!(msg.contains("delete this link"));
assert!(msg.contains("Only the original author"));
}
_ => panic!("Expected Invalid, got {:?}", result),
}
}
#[test]
fn link_author_match_message_differs_from_entry() {
let original = make_agent(1);
let other = make_agent(2);
let entry_result = check_author_match(&original, &other, "delete");
let link_result = check_link_author_match(&original, &other);
match (&entry_result, &link_result) {
(
ValidateCallbackResult::Invalid(entry_msg),
ValidateCallbackResult::Invalid(link_msg),
) => {
assert_ne!(entry_msg, link_msg);
assert!(link_msg.contains("link"));
}
_ => panic!("Expected both Invalid"),
}
}
}