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 toml_to_json_basic() {
let json = run(
"toml",
"json",
"name = \"Alice\"\nage = 30\n",
"toml",
"json",
)
.unwrap();
assert_eq!(json, r#"{"name":"Alice","age":30}"#);
}
#[test]
fn toml_to_csv_flat() {
let csv = run("toml", "csv", "name = \"Alice\"\nage = 30\n", "toml", "csv").unwrap();
assert_eq!(csv, "name,age\nAlice,30\n");
}
#[test]
fn toml_to_csv_finds_array_of_tables() {
let toml = "title = \"Config\"\n[[server]]\nhost = \"a\"\n[[server]]\nhost = \"b\"\n";
let csv = run("toml", "csv", toml, "toml", "csv").unwrap();
assert_eq!(csv, "host\na\nb\n");
}
#[test]
fn toml_to_json_datetime_stringified() {
let json = run(
"toml",
"json",
"created = 2024-01-15T10:30:00Z\n",
"toml",
"json",
)
.unwrap();
assert!(json.contains("2024-01-15"));
}
#[test]
fn json_to_toml_basic() {
let toml = run(
"json",
"toml",
r#"{"name":"Alice","age":30}"#,
"json",
"toml",
)
.unwrap();
assert!(toml.contains("name = \"Alice\""));
assert!(toml.contains("age = 30"));
}
#[test]
fn json_array_root_wrapped_in_item() {
let toml = run("json", "toml", r#"[{"a":1},{"a":2}]"#, "json", "toml").unwrap();
assert!(toml.contains("[[item]]"), "array root must wrap: {toml}");
}
#[test]
fn json_null_skipped_in_toml() {
let toml = run("json", "toml", r#"{"a":null,"b":1}"#, "json", "toml").unwrap();
assert!(!toml.contains("a ="), "null key must be skipped: {toml}");
assert!(toml.contains("b = 1"));
}
#[test]
fn csv_to_toml_roundtrip() {
let toml = run("csv", "toml", "name,age\nAlice,30\n", "csv", "toml").unwrap();
assert!(toml.contains("name = \"Alice\""));
assert!(toml.contains("age = \"30\""));
}