confmark 0.3.1

Bidirectional CLI tool for converting Markdown to Confluence markup and Confluence markup back to Markdown.
Documentation
use std::{fs, path::PathBuf};

use assert_cmd::Command;
use predicates::prelude::*;

fn confmark() -> Command {
    Command::cargo_bin("confmark").unwrap()
}

#[test]
fn test_help_command() {
    confmark()
        .arg("--help")
        .assert()
        .success()
        .stdout(predicate::str::contains("Usage:"))
        .stdout(predicate::str::contains("--from"));
}

#[test]
fn test_version_flag() {
    confmark()
        .arg("--version")
        .assert()
        .success()
        .stdout(predicate::str::contains(env!("CARGO_PKG_VERSION")));
}

#[test]
fn test_missing_required_args() {
    confmark()
        .assert()
        .failure()
        .stderr(predicate::str::contains("required"));
}

#[test]
fn test_identical_formats_rejected() {
    confmark()
        .args(["--from", "md", "--to", "md"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("must differ"));
}

#[test]
fn test_converts_markdown_to_confluence_from_stdin() {
    confmark()
        .args(["--from", "md", "--to", "cf"])
        .write_stdin("# Hi")
        .assert()
        .success()
        .stdout("<h1>Hi</h1>");
}

#[test]
fn test_short_flags_parse() {
    confmark()
        .args(["-f", "md", "-t", "cf"])
        .write_stdin("# Hi")
        .assert()
        .success()
        .stdout("<h1>Hi</h1>");
}

#[test]
fn test_converts_confluence_to_markdown_from_stdin() {
    confmark()
        .args(["--from", "cf", "--to", "md"])
        .write_stdin("<h1>Hi</h1>")
        .assert()
        .success()
        .stdout("# Hi");
}

#[test]
fn test_reads_input_file() {
    let input = PathBuf::from(env!("CARGO_TARGET_TMPDIR")).join("in.md");
    fs::write(&input, "# Title").unwrap();

    confmark()
        .args(["-f", "md", "-t", "cf"])
        .arg(&input)
        .assert()
        .success()
        .stdout("<h1>Title</h1>");
}

#[test]
fn test_writes_output_file() {
    let output = PathBuf::from(env!("CARGO_TARGET_TMPDIR")).join("out.xml");

    confmark()
        .args(["-f", "md", "-t", "cf", "-o"])
        .arg(&output)
        .write_stdin("# Hi")
        .assert()
        .success()
        .stdout("");

    assert_eq!(fs::read_to_string(&output).unwrap(), "<h1>Hi</h1>");
}

#[test]
fn test_missing_input_file_errors() {
    let missing = PathBuf::from(env!("CARGO_TARGET_TMPDIR")).join("does-not-exist.md");

    confmark()
        .args(["-f", "md", "-t", "cf"])
        .arg(&missing)
        .assert()
        .failure()
        .stderr(predicate::str::contains("failed to read"));
}