gobby-wiki 0.2.0

Gobby wiki CLI shell
mod common;

fn assert_vault_shape(root: &std::path::Path) {
    for dir in [
        "raw",
        "raw/assets",
        "wiki/sources",
        "wiki/concepts",
        "wiki/topics",
        "inbox",
        "outputs",
        "meta/health",
        ".gwiki",
    ] {
        assert!(root.join(dir).is_dir(), "missing directory {dir}");
    }

    for file in ["raw/INDEX.md", "_index.md", "log.md"] {
        assert!(root.join(file).is_file(), "missing file {file}");
    }
}

#[test]
fn init_creates_vault_shape() {
    let tmp = tempfile::tempdir().expect("tempdir");
    let hub = tmp.path().join("hub");
    let topic_output = common::gwiki_command()
        .args(["init", "--topic", "rust"])
        .env("GOBBY_WIKI_HUB", &hub)
        .current_dir(tmp.path())
        .output()
        .expect("run topic init");

    assert!(
        topic_output.status.success(),
        "topic init failed\nstdout:\n{}\nstderr:\n{}",
        String::from_utf8_lossy(&topic_output.stdout),
        String::from_utf8_lossy(&topic_output.stderr)
    );
    assert_vault_shape(&hub.join("topics").join("rust"));
    assert!(hub.join("wikis.json").is_file());

    let project = tmp.path().join("project");
    let gcode_json = common::write_gcode_json(&project);

    let project_output = common::gwiki_command()
        .args(["init", "--project"])
        .env_remove("GOBBY_WIKI_HUB")
        .current_dir(&project)
        .output()
        .expect("run project init");

    assert!(
        project_output.status.success(),
        "project init failed\nstdout:\n{}\nstderr:\n{}",
        String::from_utf8_lossy(&project_output.stdout),
        String::from_utf8_lossy(&project_output.stderr)
    );
    assert_vault_shape(&project.join(".gobby").join("wiki"));
    assert!(
        project
            .join(".gobby")
            .join("wiki")
            .join("wikis.json")
            .is_file()
    );
    common::assert_gcode_json_unchanged(&gcode_json);
}