From f2e402321898da395718c5c37137d404bda7f858 Mon Sep 17 00:00:00 2001 From: Zac Pitones Date: Mon, 9 Oct 2023 09:25:59 -0500 Subject: [PATCH] add timestamps to HTML reports --- packages/hurl/src/main.rs | 1 + packages/hurl/src/report/html/mod.rs | 2 ++ packages/hurl/src/report/html/report.rs | 29 +++++++++++++++++-- .../src/report/html/resources/report.html | 3 +- packages/hurl/src/report/html/testcase.rs | 2 ++ packages/hurl/src/report/junit/mod.rs | 3 ++ packages/hurl/src/report/junit/testcase.rs | 3 ++ packages/hurl/src/runner/core.rs | 1 + packages/hurl/src/runner/hurl_file.rs | 4 +++ 9 files changed, 44 insertions(+), 4 deletions(-) diff --git a/packages/hurl/src/main.rs b/packages/hurl/src/main.rs index fa201f98a..9e5b37c72 100644 --- a/packages/hurl/src/main.rs +++ b/packages/hurl/src/main.rs @@ -346,6 +346,7 @@ pub mod tests { time_in_ms: 0, success, cookies: vec![], + timestamp: 1, }, } } diff --git a/packages/hurl/src/report/html/mod.rs b/packages/hurl/src/report/html/mod.rs index 931e33731..c250fb59f 100644 --- a/packages/hurl/src/report/html/mod.rs +++ b/packages/hurl/src/report/html/mod.rs @@ -36,6 +36,7 @@ struct HTMLResult { pub id: String, pub time_in_ms: u128, pub success: bool, + pub timestamp: i64, } impl HTMLResult { @@ -46,6 +47,7 @@ impl HTMLResult { id: testcase.id.clone(), time_in_ms: testcase.time_in_ms, success: testcase.success, + timestamp: testcase.timestamp, } } } diff --git a/packages/hurl/src/report/html/report.rs b/packages/hurl/src/report/html/report.rs index 7bf1f1051..527a23d53 100644 --- a/packages/hurl/src/report/html/report.rs +++ b/packages/hurl/src/report/html/report.rs @@ -18,7 +18,7 @@ use std::io::Write; use std::path::Path; -use chrono::{DateTime, Local}; +use chrono::{DateTime, Local, NaiveDateTime}; use crate::report::html::{HTMLResult, Testcase}; use crate::report::Error; @@ -106,6 +106,8 @@ fn parse_html_report(html: &str) -> Vec { data-filename="(?P[A-Za-z0-9_./-]+)" \s+ data-id="(?P[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})" + (\s+ + data-timestamp="(?P[0-9]{1,10})")? "#, ) .unwrap(); @@ -115,11 +117,18 @@ fn parse_html_report(html: &str) -> Vec { let id = cap["id"].to_string(); let time_in_ms = cap["time_in_ms"].to_string().parse().unwrap(); let success = &cap["status"] == "success"; + + // Older reports won't have this so make it optional + let timestamp: i64 = cap + .name("timestamp") + .map_or(0, |m| m.as_str().parse().unwrap()); + HTMLResult { filename, id, time_in_ms, success, + timestamp, } }) .collect::>() @@ -140,11 +149,22 @@ fn create_html_table_row(result: &HTMLResult) -> String { filename }; let id = &result.id; + let timestamp = result.timestamp; + let displayed_time = if timestamp == 0 { + "-".to_string() + } else { + NaiveDateTime::from_timestamp_opt(timestamp, 0) + .unwrap() + .and_local_timezone(Local) + .unwrap() + .to_rfc3339() + }; format!( - r#" + r#" {displayed_filename} {status} + {displayed_time} {duration_in_s} "# @@ -179,9 +199,10 @@ mod tests { success 0.1s - + tests/failure.hurl failure + 2023-10-05T02:37:24Z 0.2s @@ -197,12 +218,14 @@ mod tests { id: "08aad14a-8d10-4ecc-892e-a72703c5b494".to_string(), time_in_ms: 100, success: true, + timestamp: 0, }, HTMLResult { filename: "tests/failure.hurl".to_string(), id: "a6641ae3-8ce0-4d9f-80c5-3e23e032e055".to_string(), time_in_ms: 200, success: false, + timestamp: 1696473444, } ] ); diff --git a/packages/hurl/src/report/html/resources/report.html b/packages/hurl/src/report/html/resources/report.html index 1294a1b3d..8e38b31a6 100644 --- a/packages/hurl/src/report/html/resources/report.html +++ b/packages/hurl/src/report/html/resources/report.html @@ -20,6 +20,7 @@ File Status + Start Time Duration @@ -28,4 +29,4 @@ - \ No newline at end of file + diff --git a/packages/hurl/src/report/html/testcase.rs b/packages/hurl/src/report/html/testcase.rs index a17111cf9..d17ae2cbc 100644 --- a/packages/hurl/src/report/html/testcase.rs +++ b/packages/hurl/src/report/html/testcase.rs @@ -30,6 +30,7 @@ pub struct Testcase { pub success: bool, pub time_in_ms: u128, pub errors: Vec, + pub timestamp: i64, } impl Testcase { @@ -43,6 +44,7 @@ impl Testcase { time_in_ms: hurl_result.time_in_ms, success: hurl_result.success, errors, + timestamp: hurl_result.timestamp, } } diff --git a/packages/hurl/src/report/junit/mod.rs b/packages/hurl/src/report/junit/mod.rs index 6f0c1147a..8b7d0e981 100644 --- a/packages/hurl/src/report/junit/mod.rs +++ b/packages/hurl/src/report/junit/mod.rs @@ -161,6 +161,7 @@ mod tests { time_in_ms: 230, success: true, cookies: vec![], + timestamp: 1, }; let tc = Testcase::from(&res, content, filename); testcases.push(tc); @@ -184,6 +185,7 @@ mod tests { time_in_ms: 230, success: true, cookies: vec![], + timestamp: 1, }; let tc = Testcase::from(&res, content, filename); testcases.push(tc); @@ -208,6 +210,7 @@ mod tests { time_in_ms: 230, success: true, cookies: vec![], + timestamp: 1, }; let tc = Testcase::from(&res, content, filename); testcases.push(tc); diff --git a/packages/hurl/src/report/junit/testcase.rs b/packages/hurl/src/report/junit/testcase.rs index 85de9e023..951a36c32 100644 --- a/packages/hurl/src/report/junit/testcase.rs +++ b/packages/hurl/src/report/junit/testcase.rs @@ -121,6 +121,7 @@ mod test { time_in_ms: 230, success: true, cookies: vec![], + timestamp: 1, }; let mut buffer = Vec::new(); @@ -161,6 +162,7 @@ HTTP/1.0 200 time_in_ms: 230, success: true, cookies: vec![], + timestamp: 1, }; let mut buffer = Vec::new(); Testcase::from(&hurl_result, content, filename) @@ -202,6 +204,7 @@ HTTP/1.0 200 time_in_ms: 230, success: true, cookies: vec![], + timestamp: 1, }; let mut buffer = Vec::new(); Testcase::from(&hurl_result, content, filename) diff --git a/packages/hurl/src/runner/core.rs b/packages/hurl/src/runner/core.rs index 22eef4a07..391506f73 100644 --- a/packages/hurl/src/runner/core.rs +++ b/packages/hurl/src/runner/core.rs @@ -28,6 +28,7 @@ pub struct HurlResult { pub time_in_ms: u128, pub success: bool, pub cookies: Vec, + pub timestamp: i64, } impl HurlResult { diff --git a/packages/hurl/src/runner/hurl_file.rs b/packages/hurl/src/runner/hurl_file.rs index b2673e088..6648769ee 100644 --- a/packages/hurl/src/runner/hurl_file.rs +++ b/packages/hurl/src/runner/hurl_file.rs @@ -19,6 +19,8 @@ use std::collections::HashMap; use std::thread; use std::time::Instant; +use chrono::Utc; + use hurl_core::ast::VersionValue::VersionAnyLegacy; use hurl_core::ast::*; use hurl_core::error::Error; @@ -101,6 +103,7 @@ pub fn run( hurl_file.entries.len() }; let start = Instant::now(); + let timestamp = Utc::now().timestamp(); loop { if entry_index > n { @@ -230,6 +233,7 @@ pub fn run( time_in_ms, success, cookies, + timestamp, }) }