use super::*;
const NATIVE_RELATIVE_DIR: &str = "packages/elixir/native/demo_nif";
const CANONICAL: &str = "1.5.0";
const THIRD_PARTY_DEPENDENCY: &str = "demo-upstream-crate";
const STALE_PIN: &str = "1.4.2";
fn write_native_manifest(root: &Path, requirement: &str) -> PathBuf {
let dir = root.join(NATIVE_RELATIVE_DIR);
std::fs::create_dir_all(&dir).expect("create native dir");
let manifest = dir.join("Cargo.toml");
std::fs::write(
&manifest,
format!(
"[package]\nname = \"demo_nif\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n\
[dependencies]\n{THIRD_PARTY_DEPENDENCY} = \"{requirement}\"\n"
),
)
.expect("write native Cargo.toml");
manifest
}
fn write_native_lock(root: &Path, pin: &str) {
std::fs::write(
root.join(NATIVE_RELATIVE_DIR).join("Cargo.lock"),
format!(
"version = 3\n\n\
[[package]]\nname = \"demo_nif\"\nversion = \"0.1.0\"\n\n\
[[package]]\nname = \"{THIRD_PARTY_DEPENDENCY}\"\nversion = \"{pin}\"\nsource = \
\"registry+https://github.com/rust-lang/crates.io-index\"\n"
),
)
.expect("write native Cargo.lock");
}
#[test]
fn without_a_colliding_in_tree_package_the_drift_is_reported() {
let temp = tempfile::tempdir().expect("tempdir");
let root = temp.path();
let manifest = write_native_manifest(root, CANONICAL);
write_native_lock(root, STALE_PIN);
let generated: HashSet<PathBuf> = [manifest].into_iter().collect();
let result = check_generated_lock_freshness_tolerating_pending_publish(&generated, root, Some(CANONICAL));
assert!(
result.is_some(),
"a genuine third-party drift with nothing else in the tree must fail: {result:?}"
);
}
#[test]
fn an_unrelated_in_tree_package_sharing_name_and_canonical_version_wrongly_exempts_the_drift() {
let temp = tempfile::tempdir().expect("tempdir");
let root = temp.path();
std::fs::create_dir_all(root.join("some-other-crate")).expect("mkdir colliding crate");
std::fs::write(
root.join("some-other-crate/Cargo.toml"),
format!("[package]\nname = \"{THIRD_PARTY_DEPENDENCY}\"\nversion = \"{CANONICAL}\"\nedition = \"2024\"\n"),
)
.expect("write colliding Cargo.toml");
let manifest = write_native_manifest(root, CANONICAL);
write_native_lock(root, STALE_PIN);
let generated: HashSet<PathBuf> = [manifest].into_iter().collect();
let result = check_generated_lock_freshness_tolerating_pending_publish(&generated, root, Some(CANONICAL));
assert!(
result.is_none(),
"KNOWN GAP (not fixed by design, see module doc): a coincidental in-tree name+version \
collision wrongly exempts a real third-party drift. If this assertion ever starts \
failing, `unpublished_dependency` has been made release-identity-aware and this whole \
file's module doc should be revisited: {result:?}"
);
}