calepin 0.0.22

A Rust CLI for preprocessing Typst documents with executable code chunks
use std::path::Path;
use std::process::Command;

fn calepin_bin() -> &'static Path {
    Path::new(env!("CARGO_BIN_EXE_calepin"))
}

#[cfg(unix)]
fn write_fake_updater(dir: &Path) -> std::path::PathBuf {
    use std::os::unix::fs::PermissionsExt;

    let updater = dir.join("calepin-update");
    std::fs::write(
        &updater,
        "#!/bin/sh\nprintf 'fake updater invoked\\n'\nexit 23\n",
    )
    .unwrap();
    let mut permissions = std::fs::metadata(&updater).unwrap().permissions();
    permissions.set_mode(0o755);
    std::fs::set_permissions(&updater, permissions).unwrap();
    updater
}

#[cfg(unix)]
#[test]
fn update_delegates_to_calepin_update_on_path() {
    let dir = tempfile::tempdir().unwrap();
    let _updater = write_fake_updater(dir.path());
    let path = std::env::join_paths([dir.path()]).unwrap();

    let output = Command::new(calepin_bin())
        .arg("update")
        .env("PATH", path)
        .output()
        .expect("failed to run calepin update");

    assert_eq!(output.status.code(), Some(23));
    assert_eq!(
        String::from_utf8_lossy(&output.stdout),
        "fake updater invoked\n"
    );
}