Skip to main content

api_testing_core/suite/
results.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
4#[serde(rename_all = "camelCase")]
5pub struct SuiteRunSummary {
6    pub total: u32,
7    pub passed: u32,
8    pub failed: u32,
9    pub skipped: u32,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
13#[serde(rename_all = "camelCase")]
14pub struct SuiteCaseResult {
15    pub id: String,
16    #[serde(rename = "type")]
17    pub case_type: String,
18    pub status: String,
19    pub duration_ms: u64,
20    #[serde(default)]
21    pub tags: Vec<String>,
22
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub command: Option<String>,
25
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub message: Option<String>,
28
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub assertions: Option<serde_json::Value>,
31
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub stdout_file: Option<String>,
34
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub stderr_file: Option<String>,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
40#[serde(rename_all = "camelCase")]
41pub struct SuiteRunResults {
42    pub version: u32,
43    pub suite: String,
44    pub suite_file: String,
45    pub run_id: String,
46    pub started_at: String,
47    pub finished_at: String,
48    pub output_dir: String,
49    pub summary: SuiteRunSummary,
50    pub cases: Vec<SuiteCaseResult>,
51}
52
53impl SuiteRunResults {
54    pub fn exit_code(&self) -> i32 {
55        if self.summary.failed > 0 { 2 } else { 0 }
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62    use pretty_assertions::assert_eq;
63
64    #[test]
65    fn suite_results_exit_code_reflects_failures() {
66        let ok = SuiteRunResults {
67            version: 1,
68            suite: "suite".to_string(),
69            suite_file: "suite.json".to_string(),
70            run_id: "run-1".to_string(),
71            started_at: "start".to_string(),
72            finished_at: "end".to_string(),
73            output_dir: "out".to_string(),
74            summary: SuiteRunSummary {
75                total: 1,
76                passed: 1,
77                failed: 0,
78                skipped: 0,
79            },
80            cases: Vec::new(),
81        };
82        assert_eq!(ok.exit_code(), 0);
83
84        let failed = SuiteRunResults {
85            summary: SuiteRunSummary {
86                total: 1,
87                passed: 0,
88                failed: 1,
89                skipped: 0,
90            },
91            ..ok
92        };
93        assert_eq!(failed.exit_code(), 2);
94    }
95}