use super::*;
#[test]
fn write_version_to_cargo_toml_reports_changed_on_new_version() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("Cargo.toml");
std::fs::write(&path, "[package]\nname = \"mylib\"\nversion = \"0.1.0\"\n").expect("write");
let changed = write_version_to_cargo_toml(path.to_str().unwrap(), "0.2.0").expect("write ok");
assert!(changed, "a genuinely new version must report changed = true");
let after = std::fs::read_to_string(&path).expect("read");
assert!(
after.contains(r#"version = "0.2.0""#),
"the new version must actually be written:\n{after}"
);
}
#[test]
fn write_version_to_cargo_toml_is_idempotent_when_already_at_target_version() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("Cargo.toml");
let cargo_toml = "[package]\nname = \"mylib\"\nversion = \"0.3.0\"\nedition = \"2024\"\n";
std::fs::write(&path, cargo_toml).expect("write");
let changed = write_version_to_cargo_toml(path.to_str().unwrap(), "0.3.0").expect("no-op must not error");
assert!(
!changed,
"setting the version already on disk must report changed = false"
);
let after = std::fs::read_to_string(&path).expect("read");
assert_eq!(
after, cargo_toml,
"a no-op must leave the file byte-for-byte untouched, not just semantically equal"
);
}
#[test]
fn write_version_to_cargo_toml_is_idempotent_for_workspace_package() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("Cargo.toml");
let cargo_toml = "[workspace.package]\nversion = \"1.2.3\"\n\n[workspace]\nresolver = \"2\"\nmembers = []\n";
std::fs::write(&path, cargo_toml).expect("write");
let changed = write_version_to_cargo_toml(path.to_str().unwrap(), "1.2.3").expect("no-op must not error");
assert!(
!changed,
"setting the workspace version already on disk must report changed = false"
);
let after = std::fs::read_to_string(&path).expect("read");
assert_eq!(after, cargo_toml, "a no-op must leave the file byte-for-byte untouched");
}
#[test]
fn write_version_to_cargo_toml_errors_when_no_version_field_exists() {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("Cargo.toml");
std::fs::write(
&path,
"[package]\nname = \"mylib\"\nedition = \"2024\"\n\n[dependencies]\nserde = \"1.0\"\n",
)
.expect("write");
let result = write_version_to_cargo_toml(path.to_str().unwrap(), "1.0.0");
assert!(
result.is_err(),
"a manifest with no [package]/[workspace.package] version field must still error"
);
let message = result.unwrap_err().to_string();
assert!(
message.contains("Could not find a `[package]`/`[workspace.package]` version field"),
"error message must accurately describe a genuinely missing version field: {message}"
);
}