use std::fs;
use std::process::Command;
use changeset_test_helpers::changesets::write_changeset;
use changeset_test_helpers::git::{create_branch, git_add_and_commit, init_git_repo};
use changeset_test_helpers::workspaces::{add_helm_chart_config, create_workspace_with_helm_chart};
use predicates::str::contains;
mod additional_packages {
use super::*;
#[test]
fn helm_chart_depending_on_crate_add_verify_changeset_status_release() {
let workspace = create_workspace_with_helm_chart();
add_helm_chart_config(&workspace);
init_git_repo(&workspace);
let lockfile_output = Command::new("cargo")
.args(["generate-lockfile"])
.current_dir(workspace.path())
.output()
.expect("failed to run cargo generate-lockfile");
assert!(
lockfile_output.status.success(),
"cargo generate-lockfile failed: {}",
String::from_utf8_lossy(&lockfile_output.stderr)
);
git_add_and_commit(&workspace, "Initial commit");
create_branch(&workspace, "feature");
let crate_a_toml = fs::read_to_string(workspace.path().join("crates/crate-a/Cargo.toml"))
.expect("failed to read crate-a Cargo.toml");
assert!(
crate_a_toml.contains("version = \"1.0.0\""),
"expected crate-a version 1.0.0, got:\n{crate_a_toml}"
);
let chart_yaml = fs::read_to_string(workspace.path().join("charts/my-chart/Chart.yaml"))
.expect("failed to read Chart.yaml");
assert!(
chart_yaml.contains("version: \"2.0.0\""),
"expected Chart.yaml version 2.0.0, got:\n{chart_yaml}"
);
assert!(
chart_yaml.contains("appVersion: \"1.0.0\""),
"expected Chart.yaml appVersion 1.0.0, got:\n{chart_yaml}"
);
assert_cmd::cargo::cargo_bin_cmd!("cargo-changeset")
.args([
"additional-packages",
"dependencies",
"add",
"--package",
"my-helm-chart",
"--dependency",
"crate-a",
"--manifest-file",
"charts/my-chart/Chart.yaml",
"--manifest-format",
"yaml",
"--version-field-path",
"appVersion",
])
.current_dir(workspace.path())
.assert()
.success()
.stdout(contains("Added version-tracking dependency"));
let cargo_toml =
fs::read_to_string(workspace.path().join("Cargo.toml")).expect("read Cargo.toml");
assert!(
cargo_toml.contains("dependency-name = \"crate-a\""),
"expected dependency-name = \"crate-a\" in Cargo.toml, got:\n{cargo_toml}"
);
assert!(
cargo_toml.contains("version-field-path = \"appVersion\""),
"expected version-field-path = \"appVersion\" in Cargo.toml, got:\n{cargo_toml}"
);
let crate_a_toml = fs::read_to_string(workspace.path().join("crates/crate-a/Cargo.toml"))
.expect("failed to read crate-a Cargo.toml");
assert!(
crate_a_toml.contains("version = \"1.0.0\""),
"expected crate-a still at 1.0.0, got:\n{crate_a_toml}"
);
let chart_yaml = fs::read_to_string(workspace.path().join("charts/my-chart/Chart.yaml"))
.expect("failed to read Chart.yaml");
assert!(
chart_yaml.contains("version: \"2.0.0\""),
"expected Chart.yaml still at 2.0.0, got:\n{chart_yaml}"
);
assert!(
chart_yaml.contains("appVersion: \"1.0.0\""),
"expected Chart.yaml appVersion still 1.0.0, got:\n{chart_yaml}"
);
fs::write(
workspace.path().join("crates/crate-a/src/lib.rs"),
"pub fn new_feature() {}\n",
)
.expect("failed to write lib.rs");
git_add_and_commit(&workspace, "Add feature");
assert_cmd::cargo::cargo_bin_cmd!("cargo-changeset")
.args(["verify", "--base", "main"])
.current_dir(workspace.path())
.assert()
.failure();
let crate_a_toml = fs::read_to_string(workspace.path().join("crates/crate-a/Cargo.toml"))
.expect("failed to read crate-a Cargo.toml");
assert!(
crate_a_toml.contains("version = \"1.0.0\""),
"verify should not change crate-a version, got:\n{crate_a_toml}"
);
let chart_yaml = fs::read_to_string(workspace.path().join("charts/my-chart/Chart.yaml"))
.expect("failed to read Chart.yaml");
assert!(
chart_yaml.contains("version: \"2.0.0\""),
"verify should not change Chart.yaml version, got:\n{chart_yaml}"
);
write_changeset(
&workspace,
"bump-crate-a.md",
"crate-a",
"patch",
"Add new feature",
);
git_add_and_commit(&workspace, "Add changeset");
assert_cmd::cargo::cargo_bin_cmd!("cargo-changeset")
.args(["verify", "--base", "main"])
.current_dir(workspace.path())
.assert()
.success();
assert!(
workspace
.path()
.join(".changeset/changesets/bump-crate-a.md")
.exists(),
"changeset file should exist before release"
);
let crate_a_toml = fs::read_to_string(workspace.path().join("crates/crate-a/Cargo.toml"))
.expect("failed to read crate-a Cargo.toml");
assert!(
crate_a_toml.contains("version = \"1.0.0\""),
"manifests should not change before release, got:\n{crate_a_toml}"
);
let chart_yaml = fs::read_to_string(workspace.path().join("charts/my-chart/Chart.yaml"))
.expect("failed to read Chart.yaml");
assert!(
chart_yaml.contains("version: \"2.0.0\""),
"Chart.yaml should not change before release, got:\n{chart_yaml}"
);
let status_output = assert_cmd::cargo::cargo_bin_cmd!("cargo-changeset")
.arg("status")
.current_dir(workspace.path())
.assert()
.success();
let status_stdout = String::from_utf8_lossy(&status_output.get_output().stdout);
assert!(
status_stdout.contains("crate-a: 1.0.0 -> 1.0.1"),
"expected crate-a projected release in status output, got:\n{status_stdout}"
);
assert!(
status_stdout.contains("my-helm-chart"),
"expected my-helm-chart in status output, got:\n{status_stdout}"
);
assert_cmd::cargo::cargo_bin_cmd!("cargo-changeset")
.arg("release")
.current_dir(workspace.path())
.assert()
.success();
let crate_a_toml = fs::read_to_string(workspace.path().join("crates/crate-a/Cargo.toml"))
.expect("failed to read crate-a Cargo.toml after release");
assert!(
crate_a_toml.contains("version = \"1.0.1\""),
"expected crate-a version 1.0.1 after release, got:\n{crate_a_toml}"
);
let chart_yaml = fs::read_to_string(workspace.path().join("charts/my-chart/Chart.yaml"))
.expect("failed to read Chart.yaml after release");
assert!(
chart_yaml.contains(r"version: 2.0.1"),
"expected Chart.yaml auto-patched to 2.0.1, got:\n{chart_yaml}"
);
assert!(
chart_yaml.contains(r"appVersion: 1.0.1"),
"expected appVersion tracked to 1.0.1, got:\n{chart_yaml}"
);
assert!(
!workspace
.path()
.join(".changeset/changesets/bump-crate-a.md")
.exists(),
"changeset file should be consumed after release"
);
}
}