vership 0.5.0

Multi-target release orchestrator
Documentation
use std::fs;

use tempfile::TempDir;
use vership::project;

#[test]
fn detect_rust_project() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("Cargo.toml"),
        "[package]\nname = \"test\"\nversion = \"0.1.0\"\n",
    )
    .unwrap();

    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Rust");
}

#[test]
fn detect_rust_maturin_project() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("Cargo.toml"),
        "[package]\nname = \"test\"\nversion = \"0.1.0\"\n",
    )
    .unwrap();
    fs::write(
        dir.path().join("pyproject.toml"),
        "[build-system]\nrequires = [\"maturin\"]\n",
    )
    .unwrap();

    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Rust + Maturin");
}

#[test]
fn detect_node_project() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("package.json"),
        r#"{"name": "test", "version": "1.0.0"}"#,
    )
    .unwrap();

    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Node");
}

#[test]
fn detect_python_project() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("pyproject.toml"),
        "[project]\nname = \"test\"\nversion = \"1.0.0\"\n",
    )
    .unwrap();

    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Python");
}

#[test]
fn detect_rust_over_node() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("Cargo.toml"),
        "[package]\nname = \"test\"\nversion = \"0.1.0\"\n",
    )
    .unwrap();
    fs::write(
        dir.path().join("package.json"),
        r#"{"name": "test", "version": "1.0.0"}"#,
    )
    .unwrap();

    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Rust");
}

#[test]
fn detect_node_over_python() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("package.json"),
        r#"{"name": "test", "version": "1.0.0"}"#,
    )
    .unwrap();
    fs::write(
        dir.path().join("pyproject.toml"),
        "[project]\nname = \"test\"\nversion = \"1.0.0\"\n",
    )
    .unwrap();

    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Node");
}

#[test]
fn detect_override_node() {
    let dir = TempDir::new().unwrap();
    let p = project::detect(dir.path(), Some("node")).unwrap();
    assert_eq!(p.name(), "Node");
}

#[test]
fn detect_override_python() {
    let dir = TempDir::new().unwrap();
    let p = project::detect(dir.path(), Some("python")).unwrap();
    assert_eq!(p.name(), "Python");
}

#[test]
fn detect_go_project() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("go.mod"),
        "module example.com/test\n\ngo 1.21\n",
    )
    .unwrap();
    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Go");
}

#[test]
fn detect_rust_over_go() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("Cargo.toml"),
        "[package]\nname = \"test\"\nversion = \"0.1.0\"\n",
    )
    .unwrap();
    fs::write(dir.path().join("go.mod"), "module example.com/test\n").unwrap();
    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Rust");
}

#[test]
fn detect_node_over_go() {
    let dir = TempDir::new().unwrap();
    fs::write(
        dir.path().join("package.json"),
        r#"{"name": "test", "version": "1.0.0"}"#,
    )
    .unwrap();
    fs::write(dir.path().join("go.mod"), "module example.com/test\n").unwrap();
    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Node");
}

#[test]
fn detect_go_over_python() {
    let dir = TempDir::new().unwrap();
    fs::write(dir.path().join("go.mod"), "module example.com/test\n").unwrap();
    fs::write(
        dir.path().join("pyproject.toml"),
        "[project]\nname = \"test\"\nversion = \"1.0.0\"\n",
    )
    .unwrap();
    let p = project::detect(dir.path(), None).unwrap();
    assert_eq!(p.name(), "Go");
}

#[test]
fn detect_override_go() {
    let dir = TempDir::new().unwrap();
    let p = project::detect(dir.path(), Some("go")).unwrap();
    assert_eq!(p.name(), "Go");
}

#[test]
fn detect_unknown_override() {
    let dir = TempDir::new().unwrap();
    let result = project::detect(dir.path(), Some("java"));
    assert!(result.is_err());
}

#[test]
fn detect_no_project() {
    let dir = TempDir::new().unwrap();
    let result = project::detect(dir.path(), None);
    assert!(result.is_err());
}