surrealkit 0.5.8

Manage migrations, seeding and tests for your SurrealDB via CLI
use std::fs;
use std::path::Path;

use anyhow::{Context, Result};

use super::types::RunReport;

pub fn print_human_report(report: &RunReport) {
	println!("Test run summary:");
	println!("  suites: {} total, {} failed", report.suites_total, report.suites_failed);
	println!(
		"  cases: {} total, {} passed, {} failed",
		report.cases_total, report.cases_passed, report.cases_failed
	);
	println!("  duration_ms: {}", report.duration_ms);

	for suite in &report.suites {
		println!(
			"suite {} [{} / {}]: {} passed, {} failed",
			suite.suite_name,
			suite.namespace,
			suite.database,
			suite.cases_passed,
			suite.cases_failed
		);
		for (index, case) in suite.cases.iter().enumerate() {
			if case.passed {
				continue;
			}
			println!("  FAIL case #{}", index + 1);
			for assertion in &case.assertions {
				if assertion.passed {
					continue;
				}
				println!("    - {} (failed)", assertion.name);
			}
		}
	}
}

pub fn write_json_report(path: &Path, report: &RunReport) -> Result<()> {
	if let Some(parent) = path.parent() {
		fs::create_dir_all(parent)
			.with_context(|| format!("creating report directory {}", parent.display()))?;
	}
	let raw = serde_json::to_string_pretty(report).context("serializing report json")?;
	fs::write(path, format!("{raw}\n"))
		.with_context(|| format!("writing report file {}", path.display()))?;
	Ok(())
}

#[cfg(test)]
mod tests {
	use crate::tester::types::RunReport;

	#[test]
	fn json_report_is_serializable() {
		let report = RunReport {
			started_at: "2020-01-01T00:00:00Z".into(),
			finished_at: "2020-01-01T00:00:01Z".into(),
			duration_ms: 1000,
			suites_total: 1,
			suites_failed: 0,
			cases_total: 1,
			cases_passed: 1,
			cases_failed: 0,
			suites: Vec::new(),
		};
		let encoded = serde_json::to_string(&report).expect("serialization should work");
		assert!(encoded.contains("\"cases_total\":1"));
	}
}