whyno-cli 0.3.0

Linux permission debugger
//! Snapshot tests for explain output renderer.

use whyno_core::checks::{run_checks, CheckReport};
use whyno_core::fix::{generate_fixes, FixPlan};
use whyno_core::operation::Operation;
use whyno_core::test_helpers::StateBuilder;

use crate::output::explain;

/// Renders to string for snapshot comparison.
fn render_to_string(
    report: &CheckReport,
    plan: &FixPlan,
    state: &whyno_core::state::SystemState,
) -> String {
    let mut buf = Vec::new();
    explain::render(report, plan, state, &mut buf).expect("render should succeed");
    String::from_utf8(buf).expect("output should be valid UTF-8")
}

#[test]
fn full_scenario_explain() {
    let state = StateBuilder::new()
        .subject(33, 33, vec![33])
        .operation(Operation::Read)
        .component("/", 0, 0, 0o755)
        .component("/var", 0, 0, 0o755)
        .component("/var/log", 0, 4, 0o750)
        .component_file("/var/log/app.log", 0, 0, 0o640)
        .mount("/", "ext4", "rw")
        .mount("/var", "ext4", "rw")
        .build();
    let report = run_checks(&state);
    let plan = generate_fixes(&report, &state);
    let output = render_to_string(&report, &plan, &state);
    insta::assert_snapshot!(output);
}

#[test]
fn all_pass_explain() {
    let state = StateBuilder::new()
        .subject(1000, 1000, vec![])
        .operation(Operation::Read)
        .component("/", 0, 0, 0o755)
        .component_file("/home/file.txt", 1000, 1000, 0o644)
        .mount("/", "ext4", "rw")
        .build();
    let report = run_checks(&state);
    let plan = generate_fixes(&report, &state);
    let output = render_to_string(&report, &plan, &state);
    insta::assert_snapshot!(output);
}