gobby-wiki 0.2.0

Gobby wiki CLI shell
use std::process::Output;

mod common;

fn gwiki(args: &[&str]) -> Output {
    let tmp = tempfile::tempdir().expect("tempdir");
    let hub = tmp.path().join("hub");
    let project = tmp.path().join("project");
    common::write_gcode_json(&project);

    common::gwiki_command()
        .args(args)
        .env_clear()
        .env("HOME", tmp.path())
        .env("GOBBY_WIKI_HUB", &hub)
        .current_dir(&project)
        .output()
        .expect("gwiki binary runs")
}

#[test]
fn collect_parses_scope_flags() {
    let cases = [
        vec!["--format", "text", "--quiet", "collect", "--topic", "rust"],
        vec!["--format", "text", "--quiet", "collect", "--project"],
    ];

    for args in cases {
        let output = gwiki(&args);
        let stdout = String::from_utf8_lossy(&output.stdout);
        let stderr = String::from_utf8_lossy(&output.stderr);
        assert!(
            output.status.success(),
            "{args:?} failed\nstdout:\n{}\nstderr:\n{}",
            stdout,
            stderr
        );
        let stderr_lower = stderr.to_ascii_lowercase();
        assert!(
            !stderr_lower.contains("error") && !stderr_lower.contains("panic"),
            "{args:?} wrote fatal stderr:\n{stderr}"
        );
        assert!(stdout.contains("Collect ready"), "{stdout}");
        assert!(stdout.contains("Accepted: 0"), "{stdout}");
        assert!(stdout.contains("Skipped: 0"), "{stdout}");
        if args.contains(&"--topic") {
            assert!(stdout.contains("Scope: topic:rust"), "{stdout}");
        } else {
            assert!(
                stdout.contains(&format!("Scope: project:{}", common::PROJECT_ID)),
                "{stdout}"
            );
        }
    }
}