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}