use assert_cmd::Command;
use std::fs;
use tempfile::tempdir;
fn run(from: &str, to: &str, input: &str, in_ext: &str, out_ext: &str) -> Result<String, String> {
let dir = tempdir().unwrap();
let inp = dir.path().join(format!("in.{in_ext}"));
let out = dir.path().join(format!("out.{out_ext}"));
fs::write(&inp, input).unwrap();
let result = Command::cargo_bin("sheeter")
.unwrap()
.args([
"convert",
"--from",
from,
"--to",
to,
inp.to_str().unwrap(),
out.to_str().unwrap(),
])
.output()
.unwrap();
if !result.status.success() {
return Err(String::from_utf8_lossy(&result.stderr).to_string());
}
Ok(fs::read_to_string(out).unwrap())
}
#[test]
fn xml_roundtrips_via_json() {
let json = run("xml", "json", "<r><a>1</a><a>2</a></r>", "xml", "json").unwrap();
assert_eq!(json, r#"{"r":{"a":["1","2"]}}"#);
}
#[test]
fn csv_to_xml_wraps_in_root() {
let xml = run("csv", "xml", "name\nAlice", "csv", "xml").unwrap();
assert!(xml.contains("<root>"));
assert!(xml.contains("<item>"));
assert!(xml.contains("<name>Alice</name>"));
}
#[test]
fn xml_to_csv_extracts_tabular() {
let csv = run(
"xml",
"csv",
"<root><item><name>Alice</name><age>30</age></item></root>",
"xml",
"csv",
)
.unwrap();
assert_eq!(csv, "name,age\nAlice,30\n");
}
#[test]
fn yaml_to_xml_via_hub() {
let xml = run("yaml", "xml", "- name: Alice\n age: 30\n", "yaml", "xml").unwrap();
assert!(xml.contains("<name>Alice</name>"));
}
#[test]
fn xml_attributes_preserved() {
let json = run(
"xml",
"json",
"<r><item id=\"1\">Alice</item></r>",
"xml",
"json",
)
.unwrap();
assert!(json.contains("\"@id\":\"1\""));
assert!(json.contains("\"#text\":\"Alice\""));
}
#[test]
fn xml_scalar_root_is_single_row() {
let csv = run("xml", "csv", "<r>just text</r>", "xml", "csv").unwrap();
assert_eq!(csv, "r\njust text\n");
}
#[test]
fn xml_nested_single_record_is_one_row() {
let csv = run("xml", "csv", "<r><a><b>1</b></a></r>", "xml", "csv").unwrap();
assert_eq!(csv, "b\n1\n");
}