kimun 0.35.0

Code metrics tool — health score, complexity, duplication, hotspots, ownership
use super::*;

fn dep(target: DepTarget, scope: Scope) -> RawDep {
    RawDep { target, scope }
}

fn name(n: &str) -> DepTarget {
    DepTarget::Name(n.to_string())
}

#[test]
fn every_section_with_its_scope() {
    let m = read(
        r#"{
  "name": "@acme/web",
  "dependencies": { "@acme/ui": "workspace:*", "react": "^18.0.0" },
  "peerDependencies": { "@acme/theme": "^1.0.0" },
  "optionalDependencies": { "@acme/native": "1.2.3" },
  "devDependencies": { "@acme/test-utils": "*" }
}"#,
    );

    assert_eq!(m.name.as_deref(), Some("@acme/web"));
    assert_eq!(
        m.deps,
        [
            dep(name("@acme/ui"), Scope::Runtime),
            dep(name("react"), Scope::Runtime),
            dep(name("@acme/theme"), Scope::Runtime),
            dep(name("@acme/native"), Scope::Optional),
            dep(name("@acme/test-utils"), Scope::Dev),
        ]
    );
}

#[test]
fn file_and_link_specs_are_paths() {
    let m =
        read(r#"{ "name": "app", "dependencies": { "a": "file:../a", "b": "link:../libs/b" } }"#);
    assert_eq!(
        m.deps,
        [
            dep(DepTarget::Path(PathBuf::from("../a")), Scope::Runtime),
            dep(DepTarget::Path(PathBuf::from("../libs/b")), Scope::Runtime),
        ]
    );
}

#[test]
fn a_package_without_name_or_dependencies() {
    let m = read(r#"{ "private": true, "workspaces": ["packages/*"] }"#);
    assert_eq!(m.name, None);
    assert!(m.deps.is_empty());
}

#[test]
fn non_string_specs_are_ignored() {
    let m = read(r#"{ "name": "app", "dependencies": { "a": 1, "b": "^1" } }"#);
    assert_eq!(m.deps, [dep(name("b"), Scope::Runtime)]);
}

#[test]
fn unparsable_manifest_declares_nothing() {
    assert_eq!(read("{ not json"), Manifest::default());
}