aleph_types/message/
forget.rs1use crate::item_hash::ItemHash;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
5pub struct ForgetContent {
6 hashes: Vec<ItemHash>,
7 #[serde(default)]
8 aggregates: Vec<ItemHash>,
9 #[serde(default, skip_serializing_if = "Option::is_none")]
10 reason: Option<String>,
11}
12
13impl ForgetContent {
14 pub fn new(hashes: Vec<ItemHash>, aggregates: Vec<ItemHash>, reason: Option<String>) -> Self {
15 Self {
16 hashes,
17 aggregates,
18 reason,
19 }
20 }
21
22 pub fn hashes(&self) -> &[ItemHash] {
24 &self.hashes
25 }
26
27 pub fn reason(&self) -> Option<&str> {
29 self.reason.as_deref()
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::*;
36 use crate::chain::Chain;
37 use crate::message::base_message::MessageContentEnum;
38 use crate::message::{ContentSource, Message, MessageType};
39 use crate::timestamp::Timestamp;
40 use crate::{address, channel, item_hash, signature};
41 use assert_matches::assert_matches;
42
43 const FORGET_FIXTURE: &str = include_str!(concat!(
44 env!("CARGO_MANIFEST_DIR"),
45 "/../../fixtures/messages/forget/forget.json"
46 ));
47
48 #[test]
49 fn test_deserialize_forget() {
50 let message: Message = serde_json::from_str(FORGET_FIXTURE).unwrap();
51
52 assert_eq!(
53 message.sender,
54 address!("0xB68B9D4f3771c246233823ed1D3Add451055F9Ef")
55 );
56 assert_eq!(message.chain, Chain::Ethereum);
57 assert_eq!(
58 message.signature,
59 Some(signature!(
60 "0x2e80006a8e60cb51b1aaa052069d7b86aeea6f4460f7f0fa824f3ed2b6989e4b6ec9cdf8522a257f1fa4e729e3bbec728f75b1cb538b359cbe7340937b336a771b"
61 ))
62 );
63 assert_matches!(message.message_type, MessageType::Forget);
64 assert_matches!(
65 message.content_source,
66 ContentSource::Inline { item_content: _ }
67 );
68 assert_eq!(
69 message.item_hash,
70 item_hash!("35ea7a4bdd8c631b5ccec84ddf3b0ac65a0da1fbb2942d77eac27577326a8a0f")
71 );
72 assert_eq!(message.time, Timestamp::from(1762515432.413));
73 assert_eq!(message.channel, Some(channel!("TEST")));
74
75 assert_eq!(
77 &message.content.address,
78 &address!("0xB68B9D4f3771c246233823ed1D3Add451055F9Ef")
79 );
80 assert_eq!(&message.content.time, &Timestamp::from(1762515432.413));
81 assert_eq!(message.sent_at(), &message.content.time);
82
83 let forget_content = match message.content() {
85 MessageContentEnum::Forget(content) => content,
86 other => {
87 panic!("Expected MessageContentEnum::Forget, got {:?}", other);
88 }
89 };
90
91 assert_eq!(
92 forget_content.hashes,
93 vec![item_hash!(
94 "ecd3bab3db7b449ad7875336c9a46dbbe6a010b023fc9525d81e8fdf56936ea1"
95 )]
96 );
97 assert_eq!(forget_content.aggregates, vec![]);
98 assert_eq!(forget_content.reason, Some("None".to_string()));
99
100 assert!(!message.confirmed());
102 assert!(message.confirmations.is_empty());
103
104 message.verify_item_hash().unwrap();
105 }
106
107 #[test]
108 fn test_forget_content_new() {
109 let hashes = vec![item_hash!(
110 "ecd3bab3db7b449ad7875336c9a46dbbe6a010b023fc9525d81e8fdf56936ea1"
111 )];
112 let content = ForgetContent::new(hashes.clone(), vec![], Some("test reason".to_string()));
113 assert_eq!(
114 serde_json::to_value(&content).unwrap(),
115 serde_json::json!({
116 "hashes": ["ecd3bab3db7b449ad7875336c9a46dbbe6a010b023fc9525d81e8fdf56936ea1"],
117 "aggregates": [],
118 "reason": "test reason"
119 })
120 );
121 }
122}