api_testing_core/suite/
results.rs1use 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}