use crate::docs::enforce_snippet_summary;
use crate::snippets::types::{
DowngradeReason, Language, RunSummary, Snippet, SnippetMetadata, SnippetStatus, SourceOrigin, ValidationLevel,
ValidationResult,
};
use tracing_test::traced_test;
fn result(id: &str, status: SnippetStatus) -> ValidationResult {
ValidationResult {
snippet: Snippet {
id: Some(id.to_string()),
path: "docs/example.md".into(),
language: Language::C,
title: None,
code: String::new(),
start_line: 1,
block_index: 0,
annotation: None,
metadata: SnippetMetadata::default(),
source_origin: SourceOrigin {
path: "docs/example.md".into(),
line: 3,
block_index: 0,
},
},
status,
level: ValidationLevel::Syntax,
requested_level: ValidationLevel::TypeCheck,
effective_level: ValidationLevel::Syntax,
message: None,
duration_ms: 0,
capability_capped: false,
downgrade_reason: None,
unresolved_dependency: false,
}
}
#[test]
fn hard_failures_bail_before_a_strict_downgrade() {
let summary = RunSummary::from_results(vec![
result("fixture_downgraded", SnippetStatus::Downgraded),
result("fixture_failed", SnippetStatus::Fail),
]);
let error = enforce_snippet_summary("fixture-crate", true, &summary).expect_err("must fail");
let message = error.to_string();
assert!(message.contains("1 failed"), "got: {message}");
assert!(
!message.contains("downgraded"),
"the failure bail must return before the downgraded check ever runs, got: {message}"
);
}
#[test]
fn session_errors_bail_before_a_strict_downgrade() {
let summary = RunSummary::from_results(vec![
result("fixture_downgraded", SnippetStatus::Downgraded),
result("fixture_session_error", SnippetStatus::Error),
]);
let error = enforce_snippet_summary("fixture-crate", true, &summary).expect_err("must fail");
let message = error.to_string();
assert!(message.contains("1 errors"), "got: {message}");
assert!(!message.contains("downgraded"), "got: {message}");
}
#[test]
fn a_strict_downgrade_still_bails_when_nothing_failed() {
let summary = RunSummary::from_results(vec![result("fixture_downgraded", SnippetStatus::Downgraded)]);
let error = enforce_snippet_summary("fixture-crate", true, &summary).expect_err("must fail");
assert!(error.to_string().contains("1 validation(s) downgraded"));
}
#[test]
fn non_strict_mode_never_bails_on_a_downgrade() {
let summary = RunSummary::from_results(vec![result("fixture_downgraded", SnippetStatus::Downgraded)]);
enforce_snippet_summary("fixture-crate", false, &summary).expect("non-strict must not bail");
}
#[traced_test]
#[test]
fn declared_capped_results_warn_but_do_not_bail_even_in_strict_mode() {
let summary = RunSummary::from_results(vec![ValidationResult {
status: SnippetStatus::Pass,
downgrade_reason: Some(DowngradeReason::Declared),
message: Some("requested run, validated at declared level typecheck".to_string()),
..result("fixture_e2e_typecheck", SnippetStatus::Pass)
}]);
enforce_snippet_summary("fixture-crate", true, &summary).expect("a declared cap must not bail, even strict");
assert!(
logs_contain("front-matter `level:`"),
"a declared-level cap must be warned about, not silently passed"
);
}
#[traced_test]
#[test]
fn an_ordinary_clean_run_emits_no_declared_capped_warning() {
let summary = RunSummary::from_results(vec![result("fixture_ok", SnippetStatus::Pass)]);
enforce_snippet_summary("fixture-crate", true, &summary).expect("a clean run must not bail");
assert!(
!logs_contain("front-matter `level:`"),
"an ordinary clean run must not warn about a declared-level cap that never happened"
);
}
#[traced_test]
#[test]
fn unresolved_dependency_unavailable_does_not_bail_even_in_strict_mode() {
let summary = RunSummary::from_results(vec![ValidationResult {
status: SnippetStatus::Unavailable,
unresolved_dependency: true,
..result("fixture_ts_import", SnippetStatus::Unavailable)
}]);
enforce_snippet_summary("fixture-crate", true, &summary)
.expect("an unresolved-dependency-only unavailable result must not bail strict mode");
assert!(
logs_contain("unresolved dependency"),
"a demoted-to-warning unresolved dependency must still be reported loudly"
);
}
#[test]
fn toolchain_missing_unavailable_still_bails_in_strict_mode() {
let summary = RunSummary::from_results(vec![result("fixture_zig_missing", SnippetStatus::Unavailable)]);
let error = enforce_snippet_summary("fixture-crate", true, &summary)
.expect_err("a genuinely missing toolchain must still fail strict mode");
let message = error.to_string();
assert!(message.contains("missing toolchain"), "got: {message}");
assert!(
!message.contains("unresolved dependency)"),
"a pure toolchain-missing bail must not claim any unresolved dependency: {message}"
);
}
#[traced_test]
#[test]
fn checked_nothing_warns_loudly_without_bailing_even_in_strict_mode() {
let summary = RunSummary::from_results(vec![ValidationResult {
status: SnippetStatus::Unavailable,
unresolved_dependency: true,
..result("fixture_ts_import", SnippetStatus::Unavailable)
}]);
enforce_snippet_summary("fixture-crate", true, &summary).expect("must not bail, per task #186");
assert!(
logs_contain("NOT ONE reached the requested level"),
"a corpus that checked nothing must warn loudly regardless of the bail decision"
);
}
#[traced_test]
#[test]
fn a_healthy_run_never_warns_that_it_checked_nothing() {
let summary = RunSummary::from_results(vec![result("fixture_ok", SnippetStatus::Pass)]);
enforce_snippet_summary("fixture-crate", true, &summary).expect("a clean run must not bail");
assert!(
!logs_contain("NOT ONE reached the requested level"),
"a run with a real pass must not claim it checked nothing"
);
}
#[test]
fn a_mix_of_both_causes_still_bails_on_the_toolchain_missing_half() {
let summary = RunSummary::from_results(vec![
ValidationResult {
status: SnippetStatus::Unavailable,
unresolved_dependency: true,
..result("fixture_ts_import", SnippetStatus::Unavailable)
},
result("fixture_zig_missing", SnippetStatus::Unavailable),
]);
let error = enforce_snippet_summary("fixture-crate", true, &summary)
.expect_err("a genuine toolchain gap in the same batch must still fail strict mode");
assert!(error.to_string().contains("1 unavailable"), "got: {error}");
}