use std::fs;
use std::path::Path;
use crate::report::ReportError;
use crate::runner::{EntryResult, HurlResult, RunnerError};
use hurl_core::ast::SourceInfo;
use hurl_core::input::Input;
use hurl_core::parser;
use uuid::Uuid;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Testcase {
pub id: String,
pub filename: String,
pub success: bool,
pub time_in_ms: u128,
pub errors: Vec<(RunnerError, SourceInfo)>,
pub timestamp: i64,
}
impl Testcase {
pub fn from(hurl_result: &HurlResult, filename: &Input) -> Testcase {
let id = Uuid::new_v4();
let errors = hurl_result
.errors()
.into_iter()
.map(|(error, entry_src_info)| (error.clone(), entry_src_info))
.collect();
Testcase {
id: id.to_string(),
filename: filename.to_string(),
time_in_ms: hurl_result.duration.as_millis(),
success: hurl_result.success,
errors,
timestamp: hurl_result.timestamp,
}
}
pub fn write_html(
&self,
content: &str,
entries: &[EntryResult],
dir: &Path,
secrets: &[&str],
) -> Result<(), ReportError> {
let hurl_file = parser::parse_hurl_file(content).unwrap();
let output_file = dir.join(self.timeline_filename());
let html = self.get_timeline_html(&hurl_file, content, entries, secrets);
fs::write(&output_file, html.as_bytes()).map_err(|e| {
ReportError::from_io_error(&e, &output_file, "Issue writing HTML report")
})?;
let output_file = dir.join(self.run_filename());
let html = self.get_run_html(&hurl_file, content, entries, secrets);
fs::write(&output_file, html.as_bytes()).map_err(|e| {
ReportError::from_io_error(&e, &output_file, "Issue writing HTML report")
})?;
let output_file = dir.join(self.source_filename());
let html = self.get_source_html(&hurl_file, content, secrets);
fs::write(&output_file, html.as_bytes()).map_err(|e| {
ReportError::from_io_error(&e, &output_file, "Issue writing HTML report")
})?;
Ok(())
}
pub fn source_filename(&self) -> String {
format!("{}-source.html", self.id)
}
pub fn timeline_filename(&self) -> String {
format!("{}-timeline.html", self.id)
}
pub fn run_filename(&self) -> String {
format!("{}-run.html", self.id)
}
}