diff options
Diffstat (limited to 'crates/mozart/src/commands/licenses.rs')
| -rw-r--r-- | crates/mozart/src/commands/licenses.rs | 293 |
1 files changed, 0 insertions, 293 deletions
diff --git a/crates/mozart/src/commands/licenses.rs b/crates/mozart/src/commands/licenses.rs index 0e4ea0b..93c0e63 100644 --- a/crates/mozart/src/commands/licenses.rs +++ b/crates/mozart/src/commands/licenses.rs @@ -448,296 +448,3 @@ fn tally_licenses(entries: &[LicenseEntry]) -> Vec<(String, usize)> { result.sort_by_key(|(_, count)| std::cmp::Reverse(*count)); result } - -#[cfg(test)] -mod tests { - use super::*; - - fn entry(name: &str, licenses: &[&str]) -> LicenseEntry { - LicenseEntry { - pretty_name: name.to_string(), - name: name.to_lowercase(), - version: "1.0.0".to_string(), - licenses: licenses.iter().map(|s| s.to_string()).collect(), - requires: indexmap::IndexMap::new(), - support_source: None, - source_url: None, - homepage: None, - } - } - - #[test] - fn tally_licenses_orders_by_count_then_first_seen() { - // First MIT entry comes before Apache-2.0; tie-break must keep - // MIT first when their counts collide. - let entries = vec![ - entry("a/a", &["MIT"]), - entry("b/b", &["Apache-2.0"]), - entry("c/c", &["BSD-3-Clause"]), - ]; - let counts = tally_licenses(&entries); - // All three at count 1 — input order preserved. - assert_eq!( - counts, - vec![ - ("MIT".to_string(), 1), - ("Apache-2.0".to_string(), 1), - ("BSD-3-Clause".to_string(), 1), - ] - ); - } - - #[test] - fn tally_licenses_count_descending() { - let entries = vec![ - entry("a/a", &["Apache-2.0"]), - entry("b/b", &["MIT"]), - entry("c/c", &["MIT"]), - ]; - let counts = tally_licenses(&entries); - assert_eq!(counts[0], ("MIT".to_string(), 2)); - assert_eq!(counts[1], ("Apache-2.0".to_string(), 1)); - } - - #[test] - fn tally_licenses_empty() { - assert!(tally_licenses(&[]).is_empty()); - } - - #[test] - fn tally_licenses_no_license_counts_as_none() { - let entries = vec![entry("a/a", &[])]; - let counts = tally_licenses(&entries); - assert_eq!(counts, vec![("none".to_string(), 1)]); - } - - #[test] - fn read_root_licenses_string_form() { - let dir = tempfile::tempdir().unwrap(); - let path = dir.path().join("composer.json"); - std::fs::write(&path, r#"{"name": "test/p", "license": "MIT"}"#).unwrap(); - assert_eq!(read_root_licenses(&path).unwrap(), vec!["MIT"]); - } - - #[test] - fn read_root_licenses_array_form() { - let dir = tempfile::tempdir().unwrap(); - let path = dir.path().join("composer.json"); - std::fs::write( - &path, - r#"{"name": "test/p", "license": ["MIT", "Apache-2.0"]}"#, - ) - .unwrap(); - assert_eq!( - read_root_licenses(&path).unwrap(), - vec!["MIT", "Apache-2.0"] - ); - } - - #[test] - fn read_root_licenses_absent() { - let dir = tempfile::tempdir().unwrap(); - let path = dir.path().join("composer.json"); - std::fs::write(&path, r#"{"name": "test/p"}"#).unwrap(); - assert!(read_root_licenses(&path).unwrap().is_empty()); - } - - #[test] - fn installed_to_entry_extracts_require_and_license() { - use mozart_core::repository::installed::InstalledPackageEntry; - let mut extra = indexmap::IndexMap::new(); - extra.insert("license".to_string(), serde_json::json!(["MIT"])); - extra.insert( - "require".to_string(), - serde_json::json!({"psr/log": "^1.0"}), - ); - let pkg = InstalledPackageEntry { - name: "monolog/monolog".to_string(), - version: "3.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: extra, - }; - let e = installed_to_entry(&pkg); - assert_eq!(e.licenses, vec!["MIT"]); - assert_eq!(e.requires.get("psr/log").map(String::as_str), Some("^1.0")); - } - - #[test] - fn installed_to_entry_pulls_support_source_and_source_url() { - use mozart_core::repository::installed::InstalledPackageEntry; - let pkg = InstalledPackageEntry { - name: "vendor/pkg".to_string(), - version: "1.0.0".to_string(), - version_normalized: None, - source: Some(serde_json::json!({"type": "git", "url": "https://example.com/repo.git"})), - dist: None, - package_type: None, - install_path: None, - autoload: None, - aliases: vec![], - homepage: Some("https://example.com/".to_string()), - support: Some(serde_json::json!({"source": "https://github.com/v/p"})), - extra_fields: indexmap::IndexMap::new(), - }; - let e = installed_to_entry(&pkg); - assert_eq!(e.support_source.as_deref(), Some("https://github.com/v/p")); - assert_eq!( - e.source_url.as_deref(), - Some("https://example.com/repo.git") - ); - assert_eq!(e.homepage.as_deref(), Some("https://example.com/")); - // PackageInfo helpers should pick support source first. - assert_eq!( - package_info::view_source_or_homepage_url(&e).as_deref(), - Some("https://github.com/v/p"), - ); - } - - #[test] - fn no_dev_filters_to_root_require_closure() { - // Set up: root requires a/a only. b/b is in installed but not - // reachable; should be dropped under --no-dev. - let dir = tempfile::tempdir().unwrap(); - let working_dir = dir.path(); - let vendor_dir = working_dir.join("vendor"); - - std::fs::write( - working_dir.join("composer.json"), - r#"{"name": "test/project", "require": {"a/a": "*"}}"#, - ) - .unwrap(); - - let mut installed = mozart_core::repository::installed::InstalledPackages::new(); - installed.upsert(mozart_core::repository::installed::InstalledPackageEntry { - name: "a/a".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: indexmap::IndexMap::new(), - }); - installed.upsert(mozart_core::repository::installed::InstalledPackageEntry { - name: "b/b".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: indexmap::IndexMap::new(), - }); - installed.write(&vendor_dir).unwrap(); - - let mut root_req = indexmap::IndexMap::new(); - root_req.insert("a/a".to_string(), "*".to_string()); - - let kept = load_installed_entries(working_dir, &root_req, true).unwrap(); - let names: Vec<&str> = kept.iter().map(|e| e.name.as_str()).collect(); - assert_eq!(names, vec!["a/a"]); - - // Without --no-dev: both packages are listed. - let all = load_installed_entries(working_dir, &root_req, false).unwrap(); - assert_eq!(all.len(), 2); - } - - #[test] - fn locked_no_dev_drops_packages_dev() { - use mozart_core::repository::lockfile::{LockFile, LockedPackage}; - let dir = tempfile::tempdir().unwrap(); - let working_dir = dir.path(); - std::fs::write( - working_dir.join("composer.json"), - r#"{"name": "test/project"}"#, - ) - .unwrap(); - let lock = LockFile { - readme: LockFile::default_readme(), - content_hash: "abc".to_string(), - packages: vec![LockedPackage { - name: "psr/log".to_string(), - version: "3.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: None, - package_type: None, - autoload: None, - autoload_dev: None, - license: Some(vec!["MIT".to_string()]), - description: None, - homepage: None, - keywords: None, - authors: None, - support: None, - funding: None, - time: None, - extra_fields: indexmap::IndexMap::new(), - }], - packages_dev: Some(vec![LockedPackage { - name: "phpunit/phpunit".to_string(), - version: "10.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: None, - package_type: None, - autoload: None, - autoload_dev: None, - license: Some(vec!["BSD-3-Clause".to_string()]), - description: None, - homepage: None, - keywords: None, - authors: None, - support: None, - funding: None, - time: None, - extra_fields: indexmap::IndexMap::new(), - }]), - 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()), - }; - lock.write_to_file(&working_dir.join("composer.lock")) - .unwrap(); - - let prod = load_locked_entries(working_dir, true).unwrap(); - assert_eq!(prod.len(), 1); - assert_eq!(prod[0].name, "psr/log"); - - let all = load_locked_entries(working_dir, false).unwrap(); - assert_eq!(all.len(), 2); - } -} |
