vership 0.3.0

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

use semver::Version;
use tempfile::TempDir;
use vership::project::ProjectType;
use vership::project::node::NodeProject;

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

    let project = NodeProject::new();
    let version = project.read_version(dir.path()).unwrap();
    assert_eq!(version, Version::new(1, 2, 3));
}

#[test]
fn node_write_version() {
    let dir = TempDir::new().unwrap();
    let pkg = dir.path().join("package.json");
    fs::write(
        &pkg,
        r#"{
  "name": "test-app",
  "version": "1.0.0",
  "dependencies": {
    "lodash": "^4.17.0"
  }
}"#,
    )
    .unwrap();

    let project = NodeProject::new();
    project
        .write_version(dir.path(), &Version::new(1, 1, 0))
        .unwrap();

    let content = fs::read_to_string(&pkg).unwrap();
    assert!(content.contains(r#""version": "1.1.0""#));
    assert!(content.contains(r#""lodash": "^4.17.0""#));
}

#[test]
fn node_modified_files_with_npm() {
    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("package-lock.json"), "{}").unwrap();

    let project = NodeProject::new();
    project
        .write_version(dir.path(), &Version::new(1, 0, 1))
        .unwrap();

    let files = project.modified_files();
    assert!(files.iter().any(|f| f.to_str() == Some("package.json")));
    assert!(
        files
            .iter()
            .any(|f| f.to_str() == Some("package-lock.json"))
    );
}

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

    let project = NodeProject::new();
    project
        .write_version(dir.path(), &Version::new(1, 0, 1))
        .unwrap();

    let files = project.modified_files();
    assert_eq!(files.len(), 1);
    assert_eq!(files[0].to_str(), Some("package.json"));
}

#[test]
fn node_name() {
    let project = NodeProject::new();
    assert_eq!(project.name(), "Node");
}