use assert_cmd::Command;
use predicates::prelude::*;
use std::io::Write;
use tempfile::NamedTempFile;
#[test]
fn formats_json_from_stdin() {
let mut cmd = Command::cargo_bin("fmtview").unwrap();
cmd.args(["--type", "json"])
.write_stdin(r#"{"a":{"b":1}}"#)
.assert()
.success()
.stdout(predicate::str::contains("\"b\": 1"));
}
#[test]
fn formats_jsonl_from_stdin() {
let mut cmd = Command::cargo_bin("fmtview").unwrap();
cmd.args(["--type", "jsonl"])
.write_stdin("{\"a\":1}\n{\"b\":2}\n")
.assert()
.success()
.stdout(predicate::str::contains("\"a\": 1"))
.stdout(predicate::str::contains("\"b\": 2"));
}
#[test]
fn keeps_jsonl_records_line_delimited() {
let mut cmd = Command::cargo_bin("fmtview").unwrap();
let assert = cmd
.args(["--type", "jsonl"])
.write_stdin("{\"a\":{\"b\":1}}\n[1,{\"c\":2}]\n")
.assert()
.success();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
assert_eq!(stdout, "{\"a\": {\"b\": 1}}\n[1, {\"c\": 2}]\n");
assert_eq!(stdout.lines().count(), 2);
}
#[test]
fn preserves_large_json_numbers() {
let mut cmd = Command::cargo_bin("fmtview").unwrap();
cmd.args(["--type", "json"])
.write_stdin(r#"{"n":123456789012345678901234567890}"#)
.assert()
.success()
.stdout(predicate::str::contains(
r#""n": 123456789012345678901234567890"#,
))
.stdout(predicate::str::contains("1.2345678901234568e+29").not());
}
#[test]
fn preserves_large_jsonl_numbers() {
let mut cmd = Command::cargo_bin("fmtview").unwrap();
cmd.args(["--type", "jsonl"])
.write_stdin("{\"n\":123456789012345678901234567890}\n")
.assert()
.success()
.stdout(predicate::eq("{\"n\": 123456789012345678901234567890}\n"));
}
#[test]
fn formats_xml_from_stdin() {
let mut cmd = Command::cargo_bin("fmtview").unwrap();
cmd.args(["--type", "xml"])
.write_stdin("<root><child>1</child></root>")
.assert()
.success()
.stdout(predicate::str::contains("<child>1</child>"));
}
#[test]
fn preserves_embedded_xml_string() {
let mut cmd = Command::cargo_bin("fmtview").unwrap();
cmd.args(["--type", "json"])
.write_stdin(r#"{"xml":"<root><child>1</child></root>"}"#)
.assert()
.success()
.stdout(predicate::str::contains(
r#""xml": "<root><child>1</child></root>""#,
));
}
#[test]
fn diffs_formatted_json() {
let mut left = NamedTempFile::new().unwrap();
let mut right = NamedTempFile::new().unwrap();
write!(left, r#"{{"a":1}}"#).unwrap();
write!(right, r#"{{"a":2}}"#).unwrap();
let mut cmd = Command::cargo_bin("fmtview").unwrap();
cmd.args([
"diff",
"--type",
"json",
left.path().to_str().unwrap(),
right.path().to_str().unwrap(),
])
.assert()
.success()
.stdout(predicate::str::contains("- \"a\": 1"))
.stdout(predicate::str::contains("+ \"a\": 2"));
}
#[test]
fn equal_diff_stdout_is_empty() {
let mut left = NamedTempFile::new().unwrap();
let mut right = NamedTempFile::new().unwrap();
write!(left, r#"{{"a":1}}"#).unwrap();
write!(right, r#"{{"a":1}}"#).unwrap();
let mut cmd = Command::cargo_bin("fmtview").unwrap();
cmd.args([
"diff",
"--type",
"json",
left.path().to_str().unwrap(),
right.path().to_str().unwrap(),
])
.assert()
.success()
.stdout(predicate::eq(""));
}