release-tool 0.3.1

Configuration-driven release lifecycle for computed-parameter repositories
Documentation
use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
use tempfile::TempDir;

#[test]
fn plan_rejects_a_config_that_requires_a_newer_tool_version() {
    let project = project_with_config(
        r#"
required_version = "999.0.0"

[repository]
github = "computed-parameter/example"
branch = "main"
"#,
    );

    Command::cargo_bin("release-tool")
        .unwrap()
        .current_dir(project.path())
        .arg("plan")
        .assert()
        .failure()
        .stderr(predicate::str::contains(
            "release.toml requires release-tool >= 999.0.0; current version is 0.3.1",
        ))
        .stderr(predicate::str::contains(
            "update the repository's release-tool dependency and Cargo.lock",
        ));
}

#[test]
fn an_older_minimum_version_remains_compatible() {
    let config = release_tool::config::Config::parse(
        r#"required_version = "0.0.1"

[repository]
github = "computed-parameter/example"
branch = "main"
"#,
    )
    .unwrap();

    assert_eq!(config.required_version, "0.0.1");
}

#[test]
fn plan_rejects_unknown_config_fields() {
    let project = project_with_config(
        r#"
required_version = "0.1.0"
unexpected = true

[repository]
github = "computed-parameter/example"
branch = "main"
"#,
    );

    Command::cargo_bin("release-tool")
        .unwrap()
        .current_dir(project.path())
        .arg("plan")
        .assert()
        .failure()
        .stderr(predicate::str::contains("unknown field `unexpected`"));
}

fn project_with_config(config: &str) -> TempDir {
    let project = tempfile::tempdir().unwrap();
    fs::write(project.path().join("release.toml"), config).unwrap();
    project
}