1use 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}