canic-host 0.110.51

Host-side App build and desired-state Fleet reconciliation library for Canic workspaces
Documentation
use super::*;
use crate::release_set::{ArtifactRootError, resolve_artifact_root, resolve_artifact_root_path};

#[test]
fn config_path_defaults_under_apps_root() {
    let temp = TempWorkspace::new();
    let workspace_root = temp.path();
    let apps_dir = workspace_root.join("apps");
    fs::create_dir_all(&apps_dir).expect("create apps dir");

    assert_eq!(config_path(workspace_root), apps_dir.join("canic.toml"));
}

#[test]
fn app_sources_root_defaults_to_workspace_apps_dir() {
    let temp = TempWorkspace::new();
    let workspace_root = temp.path();

    assert_eq!(
        app_sources_root(workspace_root),
        workspace_root.join("apps")
    );
}

#[test]
fn selected_environment_artifact_root_never_falls_back_to_local() {
    let temp = TempWorkspace::new();
    fs::create_dir_all(temp.path().join(".icp/local/canisters")).expect("create local artifacts");

    assert_eq!(
        resolve_artifact_root(temp.path(), "ic")
            .expect_err("selected environment must not use local artifacts"),
        ArtifactRootError::Missing {
            artifact_root: temp.path().join(".icp/ic/canisters"),
        }
    );
    fs::create_dir_all(temp.path().join(".icp/ic/canisters"))
        .expect("create selected-environment artifacts");
    assert_eq!(
        resolve_artifact_root(temp.path(), "ic").expect("selected root"),
        temp.path().join(".icp/ic/canisters")
    );
}

#[test]
fn exact_release_artifact_root_resolves_inside_the_project() {
    let temp = TempWorkspace::new();
    let artifact_root = temp
        .path()
        .join(".canic/release-builds/0123456789abcdef/artifacts");
    fs::create_dir_all(&artifact_root).expect("create release artifact root");

    assert_eq!(
        resolve_artifact_root_path(temp.path(), &artifact_root).expect("resolve exact root"),
        artifact_root
    );
}

#[cfg(unix)]
#[test]
fn exact_release_artifact_root_rejects_a_symlink_outside_the_project() {
    use std::os::unix::fs::symlink;

    let temp = TempWorkspace::new();
    let outside = TempWorkspace::new();
    let link = temp.path().join(".canic/release-builds/escape/artifacts");
    fs::create_dir_all(link.parent().expect("link parent")).expect("create link parent");
    symlink(outside.path(), &link).expect("link outside root");

    assert_eq!(
        resolve_artifact_root_path(temp.path(), &link)
            .expect_err("outside artifact root must reject"),
        ArtifactRootError::OutsideProject {
            artifact_root: link,
        }
    );
}