mdo-cli 0.3.0

A simple Rust CLI to convert Markdown to HTML5 (styled with simple.css), with optional file watching
use std::fs;
use std::path::PathBuf;
use std::process::Command;
use std::time::{SystemTime, UNIX_EPOCH};

fn fixture_dir(name: &str) -> PathBuf {
    let stamp = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .expect("system time should be after Unix epoch")
        .as_nanos();
    let dir = std::env::temp_dir().join(format!("mdo-test-{name}-{}-{stamp}", std::process::id()));
    fs::create_dir_all(&dir).expect("failed to create temp fixture dir");
    dir
}

#[test]
fn converts_markdown_to_styled_html5_document() {
    let dir = fixture_dir("html5");
    let input = dir.join("sample.md");
    fs::write(
        &input,
        "# Sample Title\n\nA paragraph with **strong** text.\n\n| A | B |\n|---|---|\n| 1 | 2 |\n",
    )
    .expect("failed to write markdown fixture");

    let output = Command::new(env!("CARGO_BIN_EXE_mdo"))
        .arg(&input)
        .output()
        .expect("failed to run mdo");

    assert!(output.status.success(), "mdo failed: {output:?}");

    let html = fs::read_to_string(dir.join("sample.html")).expect("failed to read html output");
    assert!(html.contains("<!DOCTYPE html>"));
    assert!(html.contains("<title>Sample Title</title>"));
    assert!(html.contains("<h1>Sample Title</h1>"));
    assert!(html.contains("<strong>strong</strong>"));
    assert!(html.contains("<table>"));
    assert!(html.contains("#theme-toggle"));

    fs::remove_dir_all(dir).expect("failed to clean up temp fixture dir");
}

#[test]
fn bare_output_omits_document_shell() {
    let dir = fixture_dir("bare");
    let input = dir.join("fragment.md");
    let output_path = dir.join("fragment.html");
    fs::write(&input, "**bare** fragment").expect("failed to write markdown fixture");

    let output = Command::new(env!("CARGO_BIN_EXE_mdo"))
        .args(["--bare", "--output"])
        .arg(&output_path)
        .arg(&input)
        .output()
        .expect("failed to run mdo");

    assert!(output.status.success(), "mdo failed: {output:?}");

    let html = fs::read_to_string(output_path).expect("failed to read html output");
    assert!(html.contains("<p><strong>bare</strong> fragment</p>"));
    assert!(!html.contains("<!DOCTYPE html>"));
    assert!(!html.contains("<html"));
    assert!(!html.contains("<style>"));

    fs::remove_dir_all(dir).expect("failed to clean up temp fixture dir");
}