Skip to main content

aleph_types/message/
forget.rs

1use 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    /// Returns the list of item hashes to forget.
23    pub fn hashes(&self) -> &[ItemHash] {
24        &self.hashes
25    }
26
27    /// Returns the optional reason for forgetting.
28    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        // Check content fields
76        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        // Check aggregate content fields
84        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        // No confirmation on this fixture
101        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}