molehill 0.2.2

This tools allows you to generate Digdag workflow templates.
Documentation
use assert_cmd::prelude::*;
use predicates::prelude::*;
use std::process::Command;

use std::fs;
use std::path::Path;
use std::error::Error;

fn setup_dir(dir: &str) {
    fs::create_dir_all(dir).unwrap();
}

fn clean_dir(dir: &str) {
    fs::remove_dir_all(dir).unwrap();
}

#[test]
fn invvalid_template_option_short() -> Result<(), Box<dyn Error>> {
    let mut cmd = Command::cargo_bin("molehill")?;

    cmd.arg("-t").arg("path/to/file.txt");
    cmd.assert().failure()
        .stderr(predicate::str::contains("Specify directory path for `-t` / `--template` option."));

    Ok(())
}

#[test]
fn invvalid_template_option_long() -> Result<(), Box<dyn Error>> {
    let mut cmd = Command::cargo_bin("molehill")?;

    cmd.arg("--template").arg("path/to/file.txt");
    cmd.assert().failure()
        .stderr(predicate::str::contains("Specify directory path for `-t` / `--template` option."));

    Ok(())
}

#[test]
fn invalid_output_option_short() -> Result<(), Box<dyn Error>> {
    let mut cmd = Command::cargo_bin("molehill")?;

    cmd.arg("-o").arg("path/to/file.txt");
    cmd.assert().failure()
        .stderr(predicate::str::contains("Specify directory path for `-o` / `--output` option."));
    Ok(())
}

#[test]
fn invalid_output_option_long() -> Result<(), Box<dyn Error>> {
    let mut cmd = Command::cargo_bin("molehill")?;

    cmd.arg("--output").arg("path/to/file.txt");
    cmd.assert().failure()
        .stderr(predicate::str::contains("Specify directory path for `-o` / `--output` option."));
    Ok(())
}

#[test]
fn valid_output_option() -> Result<(), Box<dyn Error>> {
    let mut cmd = Command::cargo_bin("molehill")?;
    let dir = "foo/bar";
    setup_dir(dir);

    cmd.arg("-o").arg("foo/bar");
    cmd.assert().success()
        .stdout(predicate::str::contains("Generated Digdag workflow files!"));

    assert!(Path::new("foo/bar/mailchimp.py").exists());
    assert!(Path::new("foo/bar/notification.dig").exists());
    assert!(Path::new("foo/bar/sample.sql").exists());
    assert!(Path::new("foo/bar/template.html").exists());

    clean_dir("foo");
    Ok(())
}

#[test]
fn valid_template_option() -> Result<(), Box<dyn Error>> {
    let mut cmd = Command::cargo_bin("molehill")?;

    cmd.arg("-t").arg("tests/template_example");
    cmd.assert().success()
        .stdout(predicate::str::contains("Generated Digdag workflow files!"));

    assert!(Path::new("foo.dig").exists());
    assert!(Path::new("bar.sql").exists());

    fs::remove_file("foo.dig").unwrap();
    fs::remove_file("bar.sql").unwrap();
    Ok(())
}

#[test]
fn without_options() -> Result<(), Box<dyn Error>> {
    let mut cmd = Command::cargo_bin("molehill")?;
    cmd.assert().success()
        .stdout(predicate::str::contains("Generated Digdag workflow files!"));

    assert!(Path::new("notification.dig").exists());
    assert!(Path::new("mailchimp.py").exists());
    assert!(Path::new("sample.sql").exists());
    assert!(Path::new("template.html").exists());

    fs::remove_file("notification.dig").unwrap();
    fs::remove_file("mailchimp.py").unwrap();
    fs::remove_file("sample.sql").unwrap();
    fs::remove_file("template.html").unwrap();
    Ok(())
}

#[test]
fn with_options() -> Result<(), Box<dyn Error>> {
    let mut cmd = Command::cargo_bin("molehill")?;
    let dir = "baz";
    setup_dir(dir);

    cmd.arg("--template").arg("tests/template_example")
        .arg("--output").arg("baz");
    cmd.assert().success();

    assert!(Path::new("baz/bar.sql").exists());
    assert!(Path::new("baz/foo.dig").exists());

    clean_dir(dir);
    Ok(())
}