Skip to main content

shard_core/
commit.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Serialize, Deserialize, Debug, Clone)]
4pub struct Commit {
5    pub commit_id: String,
6    pub parents: Vec<String>,
7    pub manifests: Vec<String>,
8    pub author: String,
9    pub message: String,
10    pub timestamp: u64,
11    pub public_key: Option<String>,
12    pub signature: Option<String>,
13    #[serde(default)]
14    pub key_id: Option<String>,
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20
21    #[test]
22    fn test_commit_serialization_roundtrip() {
23        let c = Commit {
24            commit_id: "abc".into(),
25            parents: vec!["parent1".into()],
26            manifests: vec!["man1".into()],
27            author: "Test".into(),
28            message: "test message".into(),
29            timestamp: 1000,
30            public_key: Some("pk".into()),
31            signature: Some("sig".into()),
32            key_id: Some("key1".into()),
33        };
34        let json = serde_json::to_vec(&c).unwrap();
35        let c2: Commit = serde_json::from_slice(&json).unwrap();
36        assert_eq!(c.commit_id, c2.commit_id);
37        assert_eq!(c.author, c2.author);
38        assert_eq!(c.message, c2.message);
39        assert_eq!(c.timestamp, c2.timestamp);
40        assert_eq!(c.key_id, c2.key_id);
41    }
42
43    #[test]
44    fn test_commit_key_id_backward_compat() {
45        let json = r#"{"commit_id":"x","parents":[],"manifests":[],"author":"A","message":"M","timestamp":0}"#;
46        let c: Commit = serde_json::from_str(json).unwrap();
47        assert!(c.key_id.is_none());
48        assert_eq!(c.commit_id, "x");
49    }
50
51    #[test]
52    fn test_commit_empty_parents() {
53        let c = Commit {
54            commit_id: "root".into(),
55            parents: vec![],
56            manifests: vec![],
57            author: "Root".into(),
58            message: "root commit".into(),
59            timestamp: 0,
60            public_key: None,
61            signature: None,
62            key_id: None,
63        };
64        assert!(c.parents.is_empty());
65        assert!(c.public_key.is_none());
66    }
67
68    #[test]
69    fn test_commit_with_all_fields() {
70        let c = Commit {
71            commit_id: "full".into(),
72            parents: vec!["p1".into(), "p2".into()],
73            manifests: vec!["m1".into(), "m2".into(), "m3".into()],
74            author: "Author <a@b.com>".into(),
75            message: "merge commit".into(),
76            timestamp: 1234567890,
77            public_key: Some("pkhex".into()),
78            signature: Some("sighex".into()),
79            key_id: Some("keyid".into()),
80        };
81        let json = serde_json::to_string_pretty(&c).unwrap();
82        let c2: Commit = serde_json::from_str(&json).unwrap();
83        assert_eq!(c2.parents.len(), 2);
84        assert_eq!(c2.manifests.len(), 3);
85    }
86}