"""Tests for the preflight runner.""" from __future__ import annotations import unittest from unittest.mock import patch from zsgdp.preflight import StepResult, format_failures, format_summary, run_preflight class FormatSummaryTests(unittest.TestCase): def test_pass_summary_lists_each_step(self): from zsgdp.preflight import PreflightResult result = PreflightResult( steps=[ StepResult(name="unit", passed=True, elapsed_seconds=0.5), StepResult(name="regression", passed=True, elapsed_seconds=0.7), ] ) summary = format_summary(result) self.assertIn("[ok] unit", summary) self.assertIn("[ok] regression", summary) self.assertIn("preflight: PASS", summary) def test_fail_summary_marks_failed_step(self): from zsgdp.preflight import PreflightResult result = PreflightResult( steps=[ StepResult(name="unit", passed=True, elapsed_seconds=0.5), StepResult(name="regression", passed=False, elapsed_seconds=1.2, output="snapshot drift"), ] ) summary = format_summary(result) self.assertIn("[FAIL] regression", summary) self.assertIn("preflight: FAIL", summary) def test_skipped_steps_render_as_skip(self): from zsgdp.preflight import PreflightResult result = PreflightResult( steps=[StepResult(name="unit", passed=True, elapsed_seconds=0.0, skipped=True)] ) self.assertIn("[skip] unit", format_summary(result)) def test_format_failures_concatenates_outputs(self): from zsgdp.preflight import PreflightResult result = PreflightResult( steps=[ StepResult(name="unit", passed=False, elapsed_seconds=0.0, output="boom"), StepResult(name="regression", passed=False, elapsed_seconds=0.0, output="snapshot off"), ] ) text = format_failures(result) self.assertIn("--- unit output ---", text) self.assertIn("boom", text) self.assertIn("--- regression output ---", text) self.assertIn("snapshot off", text) class RunPreflightTests(unittest.TestCase): def test_skip_flags_mark_steps_skipped(self): with patch("zsgdp.preflight._run_step") as run_step: run_step.return_value = StepResult(name="unit", passed=True, elapsed_seconds=0.0) result = run_preflight( skip_unit=True, skip_regression=True, skip_space_check=True, skip_parsers=True, ) self.assertEqual(run_step.call_count, 0) self.assertTrue(all(step.skipped for step in result.steps)) self.assertTrue(result.passed) def test_aggregates_pass_when_all_steps_succeed(self): with patch( "zsgdp.preflight._run_step", side_effect=lambda name, command, cwd: StepResult(name=name, passed=True, elapsed_seconds=0.1), ): result = run_preflight() self.assertTrue(result.passed) # No benchmark by default => 4 steps. self.assertEqual(len(result.steps), 4) def test_failure_in_one_step_fails_overall(self): def _step(name, command, cwd): return StepResult(name=name, passed=(name != "regression"), elapsed_seconds=0.1, output="boom" if name == "regression" else "") with patch("zsgdp.preflight._run_step", side_effect=_step): result = run_preflight() self.assertFalse(result.passed) failed_names = [step.name for step in result.failed_steps] self.assertEqual(failed_names, ["regression"]) def test_benchmark_step_added_when_enabled(self): with patch( "zsgdp.preflight._run_step", side_effect=lambda name, command, cwd: StepResult(name=name, passed=True, elapsed_seconds=0.1), ): result = run_preflight(run_benchmark=True) names = [step.name for step in result.steps] self.assertEqual(names, ["unit", "regression", "space_check", "parsers", "benchmark"]) if __name__ == "__main__": unittest.main()