ito-core 0.1.33

Core functionality and business logic for Ito
Documentation
use std::collections::BTreeSet;

use ito_config::ConfigContext;
use ito_core::installers::{InitOptions, InstallMode, install_default_templates};

fn install(project: &std::path::Path, mode: InstallMode, opts: InitOptions) {
    let ctx = ConfigContext {
        project_dir: Some(project.to_path_buf()),
        ..Default::default()
    };
    install_default_templates(project, &ctx, mode, &opts, None).expect("install should succeed");
}

#[test]
fn update_preserves_existing_wiki_content_and_installs_missing_scaffold() {
    let dir = tempfile::tempdir().expect("tempdir should succeed");
    let project = dir.path();

    install(
        project,
        InstallMode::Init,
        InitOptions::new(BTreeSet::new(), false, false),
    );

    let overview = project.join(".ito/wiki/overview.md");
    let config = project.join(".ito/wiki/_meta/config.yaml");
    let status = project.join(".ito/wiki/_meta/status.md");
    let overview_contents = "# Project-owned overview\n\nKeep this synthesis.\n";
    let config_contents = "version: 99\nwrite_policy:\n  default: project-owned\n";

    std::fs::write(&overview, overview_contents).expect("overview write should succeed");
    std::fs::write(&config, config_contents).expect("config write should succeed");
    std::fs::remove_file(&status).expect("status removal should succeed");

    install(
        project,
        InstallMode::Update,
        InitOptions::new(BTreeSet::new(), false, true),
    );

    assert_eq!(
        std::fs::read_to_string(&overview).expect("overview read should succeed"),
        overview_contents
    );
    assert_eq!(
        std::fs::read_to_string(&config).expect("config read should succeed"),
        config_contents
    );
    assert!(
        status.exists(),
        "missing wiki scaffold file should be installed"
    );
}

#[test]
fn init_upgrade_preserves_existing_wiki_content() {
    let dir = tempfile::tempdir().expect("tempdir should succeed");
    let project = dir.path();

    install(
        project,
        InstallMode::Init,
        InitOptions::new(BTreeSet::new(), false, false),
    );

    let index = project.join(".ito/wiki/index.md");
    let index_contents = "# Project-owned wiki index\n";
    std::fs::write(&index, index_contents).expect("index write should succeed");

    install(
        project,
        InstallMode::Init,
        InitOptions::new_upgrade(BTreeSet::new()),
    );

    assert_eq!(
        std::fs::read_to_string(&index).expect("index read should succeed"),
        index_contents
    );
}