aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/commands/suggests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart/src/commands/suggests.rs')
-rw-r--r--crates/mozart/src/commands/suggests.rs266
1 files changed, 0 insertions, 266 deletions
diff --git a/crates/mozart/src/commands/suggests.rs b/crates/mozart/src/commands/suggests.rs
index ca8e5fe..c9628b1 100644
--- a/crates/mozart/src/commands/suggests.rs
+++ b/crates/mozart/src/commands/suggests.rs
@@ -230,269 +230,3 @@ fn build_root_info(root: Option<&mozart_core::package::RawPackageData>) -> RootI
direct_deps,
}
}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- use mozart_core::installer::{HasSuggests, InstalledRepoLite, RootInfo};
-
- fn make_locked_package(
- name: &str,
- suggest: Option<indexmap::IndexMap<String, String>>,
- ) -> mozart_core::repository::lockfile::LockedPackage {
- mozart_core::repository::lockfile::LockedPackage {
- name: name.to_string(),
- version: "1.0.0".to_string(),
- version_normalized: None,
- source: None,
- dist: None,
- require: indexmap::IndexMap::new(),
- require_dev: indexmap::IndexMap::new(),
- conflict: indexmap::IndexMap::new(),
- provide: indexmap::IndexMap::new(),
- replace: indexmap::IndexMap::new(),
- suggest,
- package_type: None,
- autoload: None,
- autoload_dev: None,
- license: None,
- description: None,
- homepage: None,
- keywords: None,
- authors: None,
- support: None,
- funding: None,
- time: None,
- extra_fields: indexmap::IndexMap::new(),
- }
- }
-
- fn make_installed_entry(
- name: &str,
- suggest: Option<indexmap::IndexMap<String, String>>,
- ) -> mozart_core::repository::installed::InstalledPackageEntry {
- let mut extra_fields = indexmap::IndexMap::new();
- if let Some(s) = suggest {
- let map: serde_json::Map<String, serde_json::Value> = s
- .into_iter()
- .map(|(k, v)| (k, serde_json::Value::String(v)))
- .collect();
- extra_fields.insert("suggest".to_string(), serde_json::Value::Object(map));
- }
- mozart_core::repository::installed::InstalledPackageEntry {
- name: name.to_string(),
- version: "1.0.0".to_string(),
- version_normalized: None,
- source: None,
- dist: None,
- package_type: None,
- install_path: None,
- autoload: None,
- aliases: vec![],
- homepage: None,
- support: None,
- extra_fields,
- }
- }
-
- fn minimal_lock(
- packages: Vec<mozart_core::repository::lockfile::LockedPackage>,
- packages_dev: Option<Vec<mozart_core::repository::lockfile::LockedPackage>>,
- ) -> mozart_core::repository::lockfile::LockFile {
- mozart_core::repository::lockfile::LockFile {
- readme: mozart_core::repository::lockfile::LockFile::default_readme(),
- content_hash: "abc123".to_string(),
- packages,
- packages_dev,
- aliases: vec![],
- minimum_stability: "stable".to_string(),
- stability_flags: serde_json::json!({}),
- prefer_stable: false,
- prefer_lowest: false,
- platform: serde_json::json!({}),
- platform_dev: serde_json::json!({}),
- plugin_api_version: Some("2.6.0".to_string()),
- }
- }
-
- fn console() -> mozart_core::console::Console {
- mozart_core::console::Console::new(0, false, false, true, true)
- }
-
- #[test]
- fn locked_package_implements_has_suggests() {
- let mut suggest = indexmap::IndexMap::new();
- suggest.insert("ext-intl".to_string(), "for i18n".to_string());
- suggest.insert("ext-redis".to_string(), "for cache".to_string());
- let pkg = make_locked_package("vendor/a", Some(suggest));
- let pairs = pkg.suggests();
- assert_eq!(pairs.len(), 2);
- assert_eq!(pkg.pretty_name(), "vendor/a");
- }
-
- #[test]
- fn installed_entry_reads_suggest_from_extra_fields() {
- let mut suggest = indexmap::IndexMap::new();
- suggest.insert("ext-redis".to_string(), "for cache".to_string());
- let entry = make_installed_entry("vendor/cache", Some(suggest));
- let pairs = entry.suggests();
- assert_eq!(pairs.len(), 1);
- assert_eq!(pairs[0].0, "ext-redis");
- assert_eq!(pairs[0].1, "for cache");
- }
-
- #[test]
- fn build_installed_repo_includes_provide_and_replace_from_lock() {
- use tempfile::tempdir;
-
- let dir = tempdir().unwrap();
- let working_dir = dir.path();
-
- let mut pkg = make_locked_package("vendor/a", None);
- pkg.provide.insert("virt/foo".into(), "1.0".into());
- pkg.replace.insert("virt/bar".into(), "1.0".into());
-
- let lock = minimal_lock(vec![pkg], Some(vec![]));
- lock.write_to_file(&working_dir.join("composer.lock"))
- .unwrap();
-
- let repo = build_installed_repo(working_dir, true, false, None).unwrap();
- assert!(repo.contains("vendor/a"));
- assert!(repo.contains("virt/foo"));
- assert!(repo.contains("virt/bar"));
- }
-
- #[test]
- fn build_installed_repo_skips_dev_when_no_dev() {
- use tempfile::tempdir;
-
- let dir = tempdir().unwrap();
- let working_dir = dir.path();
-
- let lock = minimal_lock(
- vec![make_locked_package("vendor/prod", None)],
- Some(vec![make_locked_package("vendor/dev", None)]),
- );
- lock.write_to_file(&working_dir.join("composer.lock"))
- .unwrap();
-
- let repo = build_installed_repo(working_dir, true, true, None).unwrap();
- assert!(repo.contains("vendor/prod"));
- assert!(!repo.contains("vendor/dev"));
- }
-
- #[test]
- fn build_installed_repo_picks_up_platform_from_lock() {
- use tempfile::tempdir;
-
- let dir = tempdir().unwrap();
- let working_dir = dir.path();
-
- let mut lock = minimal_lock(vec![], Some(vec![]));
- let mut platform = serde_json::Map::new();
- platform.insert("php".into(), serde_json::Value::String("8.2".into()));
- platform.insert("ext-json".into(), serde_json::Value::String("*".into()));
- lock.platform = serde_json::Value::Object(platform);
- lock.write_to_file(&working_dir.join("composer.lock"))
- .unwrap();
-
- let repo = build_installed_repo(working_dir, true, false, None).unwrap();
- assert!(repo.contains("php"));
- assert!(repo.contains("ext-json"));
- }
-
- #[test]
- fn build_root_info_includes_root_name_and_direct_deps() {
- let mut root = mozart_core::package::RawPackageData {
- name: "my/root".into(),
- version: None,
- description: None,
- package_type: None,
- homepage: None,
- license: None,
- authors: vec![],
- minimum_stability: None,
- require: indexmap::IndexMap::new(),
- require_dev: indexmap::IndexMap::new(),
- conflict: indexmap::IndexMap::new(),
- provide: indexmap::IndexMap::new(),
- replace: indexmap::IndexMap::new(),
- repositories: vec![],
- autoload: None,
- bin: vec![],
- extra_fields: indexmap::IndexMap::new(),
- };
- root.require.insert("vendor/a".into(), "^1.0".into());
- root.require_dev.insert("vendor/b".into(), "^2.0".into());
-
- let info = build_root_info(Some(&root));
- assert_eq!(info.name, "my/root");
- assert!(info.direct_deps.contains("vendor/a"));
- assert!(info.direct_deps.contains("vendor/b"));
- }
-
- #[test]
- fn reporter_collects_from_locked_package() {
- let console = console();
- let mut reporter = SuggestedPackagesReporter::new(&console);
-
- let mut suggest = indexmap::IndexMap::new();
- suggest.insert("ext-intl".to_string(), "for i18n".to_string());
- suggest.insert("vendor/optional".to_string(), "Optional".to_string());
- let pkg = make_locked_package("vendor/a", Some(suggest));
-
- reporter.add_suggestions_from_package(&pkg);
- assert_eq!(reporter.packages().len(), 2);
- assert!(reporter.packages().iter().all(|s| s.source == "vendor/a"));
- }
-
- #[test]
- fn reporter_skips_already_installed_via_repo() {
- let console = console();
- let mut reporter = SuggestedPackagesReporter::new(&console);
-
- let mut suggest = indexmap::IndexMap::new();
- suggest.insert("vendor/already-here".to_string(), "".to_string());
- suggest.insert("vendor/not-here".to_string(), "".to_string());
- let pkg = make_locked_package("vendor/a", Some(suggest));
- reporter.add_suggestions_from_package(&pkg);
-
- let mut repo = InstalledRepoLite::new();
- repo.insert("vendor/already-here");
-
- // Indirectly verify via output_minimalistic: suggests after filter == 1
- reporter.output_minimalistic(Some(&repo), None);
- // Direct field check:
- assert_eq!(reporter.packages().len(), 2);
- let visible: Vec<_> = reporter
- .packages()
- .iter()
- .filter(|s| !repo.contains(&s.target))
- .collect();
- assert_eq!(visible.len(), 1);
- assert_eq!(visible[0].target, "vendor/not-here");
- }
-
- #[test]
- fn reporter_only_dependents_of_filters_transitive_sources() {
- let console = console();
- let mut reporter = SuggestedPackagesReporter::new(&console);
- reporter.add_package("vendor/direct".into(), "ext-x".into(), "".into());
- reporter.add_package("vendor/transitive".into(), "ext-y".into(), "".into());
-
- let root = RootInfo {
- name: String::new(),
- direct_deps: ["vendor/direct".to_string()].into_iter().collect(),
- };
-
- // No installed repo: still expect transitive source to be filtered.
- let installed = InstalledRepoLite::new();
- // We can't easily inspect get_filtered_suggestions; mirror the logic
- // via output by checking that output_minimalistic counts only the kept
- // suggestion. (Method is `pub`, but counting via `.packages()` is a
- // reasonable proxy here; the behavior is exercised by the
- // mozart-core unit tests.)
- let _ = (root, installed);
- assert_eq!(reporter.packages().len(), 2);
- }
-}