use super::journal_target_ids;
use crate::contract::schema::{Adapter, Ecosystem, Registry};
use crate::protocol::plan::PlanTarget;
fn t(ecosystem: Ecosystem, package: &str, registry: Registry, adapter: Adapter) -> PlanTarget {
PlanTarget {
ecosystem,
package: Some(package.to_string()),
registry,
adapter,
}
}
#[test]
fn lone_target_per_ecosystem_keeps_the_bare_ecosystem_id() {
let targets = vec![
t(
Ecosystem::Rust,
"tool",
Registry::CratesIo,
Adapter::CargoPublish,
),
t(Ecosystem::Node, "tool", Registry::Npm, Adapter::NpmPublish),
];
assert_eq!(journal_target_ids(&targets), vec!["rust", "node"]);
}
#[test]
fn two_crates_in_one_ecosystem_disambiguate_by_package() {
let targets = vec![
t(
Ecosystem::Rust,
"ossctl-core",
Registry::CratesIo,
Adapter::CargoPublish,
),
t(
Ecosystem::Rust,
"ossctl",
Registry::CratesIo,
Adapter::CargoPublish,
),
];
assert_eq!(
journal_target_ids(&targets),
vec!["rust:ossctl-core", "rust:ossctl"]
);
}
#[test]
fn same_package_different_channels_disambiguate_by_registry() {
let targets = vec![
t(
Ecosystem::Rust,
"ossctl-core",
Registry::CratesIo,
Adapter::CargoPublish,
),
t(
Ecosystem::Rust,
"ossctl",
Registry::CratesIo,
Adapter::CargoPublish,
),
t(
Ecosystem::Rust,
"ossctl",
Registry::GhReleases,
Adapter::CargoDist,
),
t(
Ecosystem::Rust,
"ossctl",
Registry::Homebrew,
Adapter::HomebrewTap,
),
];
assert_eq!(
journal_target_ids(&targets),
vec![
"rust:ossctl-core:crates.io",
"rust:ossctl:crates.io",
"rust:ossctl:gh-releases",
"rust:ossctl:homebrew",
]
);
let ids = journal_target_ids(&targets);
let mut sorted = ids.clone();
sorted.sort();
sorted.dedup();
assert_eq!(sorted.len(), ids.len(), "ids must be unique");
}
#[test]
fn identical_targets_collide_so_the_coordinator_can_reject_them() {
let targets = vec![
t(
Ecosystem::Rust,
"ossctl",
Registry::CratesIo,
Adapter::CargoPublish,
),
t(
Ecosystem::Rust,
"ossctl",
Registry::CratesIo,
Adapter::CargoPublish,
),
];
let ids = journal_target_ids(&targets);
assert_eq!(
ids[0], ids[1],
"identical targets must produce a colliding id"
);
}
#[test]
fn is_deterministic() {
let targets = vec![
t(
Ecosystem::Rust,
"ossctl-core",
Registry::CratesIo,
Adapter::CargoPublish,
),
t(
Ecosystem::Rust,
"ossctl",
Registry::Homebrew,
Adapter::HomebrewTap,
),
t(Ecosystem::Node, "tool", Registry::Npm, Adapter::NpmPublish),
];
assert_eq!(journal_target_ids(&targets), journal_target_ids(&targets));
}