langcodec-cli 0.11.0

A universal CLI tool for converting and inspecting localization files (Apple, Android, CSV, etc.)
Documentation
use serde_json::Value;
use std::fs;
use std::process::Command;
use tempfile::TempDir;

fn langcodec_cmd() -> Command {
    Command::new(assert_cmd::cargo::cargo_bin!("langcodec"))
}

#[test]
fn test_diff_json_reports_added_removed_changed() {
    let temp_dir = TempDir::new().unwrap();
    let source = temp_dir.path().join("source.csv");
    let target = temp_dir.path().join("target.csv");

    let source_content = "\
key,en,fr
a,A1,FA1
b,B1,FB1
c,C1,FC1
";
    let target_content = "\
key,en,fr
b,B2,FB2
c,C1,FC1
d,D1,FD1
";
    fs::write(&source, source_content).unwrap();
    fs::write(&target, target_content).unwrap();

    let out = langcodec_cmd()
        .args([
            "diff",
            "--source",
            source.to_str().unwrap(),
            "--target",
            target.to_str().unwrap(),
            "--json",
        ])
        .output()
        .unwrap();

    assert!(
        out.status.success(),
        "stderr: {}",
        String::from_utf8_lossy(&out.stderr)
    );

    let stdout = String::from_utf8_lossy(&out.stdout);
    let report: Value = serde_json::from_str(&stdout).unwrap();
    let langs = report["languages"].as_array().unwrap();
    let en = langs
        .iter()
        .find(|l| l["language"] == "en")
        .expect("missing en language report");

    assert_eq!(en["counts"]["added"], 1);
    assert_eq!(en["counts"]["removed"], 1);
    assert_eq!(en["counts"]["changed"], 1);
    assert_eq!(en["counts"]["unchanged"], 1);
}

#[test]
fn test_diff_lang_filter() {
    let temp_dir = TempDir::new().unwrap();
    let source = temp_dir.path().join("source.csv");
    let target = temp_dir.path().join("target.csv");

    let source_content = "\
key,en,fr
a,A1,FA1
";
    let target_content = "\
key,en,fr
a,A2,FA2
";
    fs::write(&source, source_content).unwrap();
    fs::write(&target, target_content).unwrap();

    let out = langcodec_cmd()
        .args([
            "diff",
            "--source",
            source.to_str().unwrap(),
            "--target",
            target.to_str().unwrap(),
            "--lang",
            "en",
        ])
        .output()
        .unwrap();

    assert!(
        out.status.success(),
        "stderr: {}",
        String::from_utf8_lossy(&out.stderr)
    );
    let stdout = String::from_utf8_lossy(&out.stdout);
    assert!(stdout.contains("Language: en"));
    assert!(!stdout.contains("Language: fr"));
}

#[test]
fn test_diff_json_writes_report_file() {
    let temp_dir = TempDir::new().unwrap();
    let source = temp_dir.path().join("source.csv");
    let target = temp_dir.path().join("target.csv");
    let report = temp_dir.path().join("diff_report.json");

    fs::write(&source, "key,en\na,A\n").unwrap();
    fs::write(&target, "key,en\na,B\n").unwrap();

    let out = langcodec_cmd()
        .args([
            "diff",
            "--source",
            source.to_str().unwrap(),
            "--target",
            target.to_str().unwrap(),
            "--json",
            "--output",
            report.to_str().unwrap(),
        ])
        .output()
        .unwrap();

    assert!(
        out.status.success(),
        "stderr: {}",
        String::from_utf8_lossy(&out.stderr)
    );
    assert!(report.exists());

    let content = fs::read_to_string(&report).unwrap();
    let parsed: Value = serde_json::from_str(&content).unwrap();
    assert_eq!(parsed["summary"]["languages"], 1);
}