Skip to main content

agm_core/model/
verify.rs

1//! Verification contract types (spec S24).
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6#[serde(tag = "type", rename_all = "snake_case")]
7pub enum VerifyCheck {
8    Command {
9        run: String,
10        #[serde(skip_serializing_if = "Option::is_none")]
11        expect: Option<String>,
12    },
13    FileExists {
14        file: String,
15    },
16    FileContains {
17        file: String,
18        pattern: String,
19    },
20    FileNotContains {
21        file: String,
22        pattern: String,
23    },
24    NodeStatus {
25        node: String,
26        status: String,
27    },
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn test_verify_command_serde_roundtrip() {
36        let v = VerifyCheck::Command {
37            run: "cargo check".to_owned(),
38            expect: Some("exit_code_0".to_owned()),
39        };
40        let json = serde_json::to_string(&v).unwrap();
41        assert!(json.contains("\"type\":\"command\""));
42        let back: VerifyCheck = serde_json::from_str(&json).unwrap();
43        assert_eq!(v, back);
44    }
45
46    #[test]
47    fn test_verify_command_without_expect() {
48        let v = VerifyCheck::Command {
49            run: "echo hello".to_owned(),
50            expect: None,
51        };
52        let json = serde_json::to_string(&v).unwrap();
53        assert!(!json.contains("expect"));
54        let back: VerifyCheck = serde_json::from_str(&json).unwrap();
55        assert_eq!(v, back);
56    }
57
58    #[test]
59    fn test_verify_file_exists_serde_roundtrip() {
60        let v = VerifyCheck::FileExists {
61            file: "src/main.rs".to_owned(),
62        };
63        let json = serde_json::to_string(&v).unwrap();
64        assert!(json.contains("\"type\":\"file_exists\""));
65        let back: VerifyCheck = serde_json::from_str(&json).unwrap();
66        assert_eq!(v, back);
67    }
68
69    #[test]
70    fn test_verify_file_contains_serde_roundtrip() {
71        let v = VerifyCheck::FileContains {
72            file: "src/lib.rs".to_owned(),
73            pattern: "fn main".to_owned(),
74        };
75        let json = serde_json::to_string(&v).unwrap();
76        assert!(json.contains("\"type\":\"file_contains\""));
77        let back: VerifyCheck = serde_json::from_str(&json).unwrap();
78        assert_eq!(v, back);
79    }
80
81    #[test]
82    fn test_verify_file_not_contains_serde_roundtrip() {
83        let v = VerifyCheck::FileNotContains {
84            file: "src/lib.rs".to_owned(),
85            pattern: "unsafe".to_owned(),
86        };
87        let json = serde_json::to_string(&v).unwrap();
88        assert!(json.contains("\"type\":\"file_not_contains\""));
89        let back: VerifyCheck = serde_json::from_str(&json).unwrap();
90        assert_eq!(v, back);
91    }
92
93    #[test]
94    fn test_verify_node_status_serde_roundtrip() {
95        let v = VerifyCheck::NodeStatus {
96            node: "auth.login".to_owned(),
97            status: "completed".to_owned(),
98        };
99        let json = serde_json::to_string(&v).unwrap();
100        assert!(json.contains("\"type\":\"node_status\""));
101        let back: VerifyCheck = serde_json::from_str(&json).unwrap();
102        assert_eq!(v, back);
103    }
104
105    #[test]
106    fn test_verify_deserialize_from_spec_json() {
107        let json = r#"{"type":"command","run":"cargo check","expect":"exit_code_0"}"#;
108        let v: VerifyCheck = serde_json::from_str(json).unwrap();
109        assert!(matches!(v, VerifyCheck::Command { .. }));
110    }
111}