gobby-wiki 0.3.0

Gobby wiki CLI shell
use std::fs;

mod common;

fn gwiki(args: &[&str]) -> std::process::Output {
    let fixture = common::GwikiFixture::new();
    common::write_gcode_json(fixture.project());
    fs::write(fixture.project().join("README.md"), "# Parse fixture\n")
        .expect("write ingest fixture");
    if args.first().is_none_or(|command| *command != "init") {
        if args.contains(&"--topic") {
            let mut command = fixture.command_in_project();
            command.args(["init", "--topic", "rust"]);
            let output = command.output().expect("gwiki topic init runs");
            common::assert_success(&output, "topic init fixture");
        } else if args.contains(&"--project") {
            let mut command = fixture.command_in_project();
            command.args(["init", "--project"]);
            let output = command.output().expect("gwiki project init runs");
            common::assert_success(&output, "project init fixture");
        }
    }

    let mut command = fixture.command_in_project();
    command.args(args);
    command.output().expect("gwiki binary runs")
}

#[test]
fn core_commands_parse_scope_flags() {
    let cases = [
        vec!["init", "--topic", "rust"],
        vec!["setup", "--topic", "rust"],
        vec!["index", "--topic", "rust"],
        vec!["ingest-file", "--topic", "rust", "README.md"],
        vec!["search", "--topic", "rust", "ownership"],
        vec!["read", "--topic", "rust", "--path", "wiki/topics/rust.md"],
        vec!["read", "--topic", "rust", "--title", "Rust"],
        vec!["backlinks", "--topic", "rust", "wiki/topics/rust.md"],
        vec!["link-suggest", "--topic", "rust"],
        vec!["audit", "--topic", "rust"],
        vec!["lint", "--topic", "rust"],
        vec!["health", "--topic", "rust"],
        vec!["status", "--topic", "rust"],
        vec!["--project", "search", "ownership"],
    ];

    for args in cases {
        let output = gwiki(&args);
        assert!(
            output.status.success(),
            "{args:?} failed\nstdout:\n{}\nstderr:\n{}",
            String::from_utf8_lossy(&output.stdout),
            String::from_utf8_lossy(&output.stderr)
        );
    }

    let quiet = gwiki(&["--quiet", "status", "--topic", "rust"]);
    assert!(quiet.status.success());
    assert_eq!(String::from_utf8_lossy(&quiet.stderr), "");
    assert!(String::from_utf8_lossy(&quiet.stdout).contains("\"status\": \"shell-ready\""));
}