use std::io::Write; use anyhow::Result; use assert_cmd::Command; use indoc::indoc; use tempfile::NamedTempFile; #[test] fn no_such_file() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.arg("/foo/bar"); cmd.assert().failure().stderr(indoc! {" Error: failed to open file: /foo/bar Caused by: No such file or directory (os error 2) "}); Ok(()) } #[test] fn from_stdin() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.write_stdin(indoc! {" --- context --- x: echo 42 --- template --- x = {{x}} "}); cmd.assert().stdout("x = 42\n"); Ok(()) } #[test] fn from_stdin_2() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.arg("-").write_stdin(indoc! {" --- context --- x: echo 42 --- template --- x = {{x}} "}); cmd.assert().stdout("x = 42\n"); Ok(()) } #[test] fn from_file() -> Result<()> { let mut file = NamedTempFile::new()?; let src = indoc! {" --- context --- x: echo 42 --- template --- x = {{x}} "}; write!(file, "{}", src)?; let mut cmd = Command::cargo_bin("handlematters")?; cmd.arg(file.path()); cmd.assert().stdout("x = 42\n"); Ok(()) } #[test] fn stderr() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.write_stdin(indoc! {" --- context --- | echo world echo foo >&2 --- template --- hello, {{this}} "}); cmd.assert().stdout("hello, world\n").stderr("foo\n"); Ok(()) } #[test] fn script_nonzero() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.write_stdin(indoc! {" --- context --- | echo world echo foo >&2 exit 42 --- template --- hello, {{this}} "}); cmd.assert().failure().stderr(indoc! {" Error: failed to execute script ---- script ---- echo world echo foo >&2 exit 42 ---- stdout ---- world ---- stderr ---- foo Caused by: process exited unsuccessfully: exit status: 42 "}); Ok(()) } #[test] fn script_killed() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.write_stdin(indoc! {" --- context --- | echo world echo foo >&2 kill $$ --- template --- hello, {{this}} "}); cmd.assert().failure().stderr(indoc! {" Error: failed to execute script ---- script ---- echo world echo foo >&2 kill $$ ---- stdout ---- world ---- stderr ---- foo Caused by: process exited unsuccessfully: signal: 15 (SIGTERM) "}); Ok(()) } #[test] fn no_context_block() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.write_stdin(indoc! {" --- template --- hey "}); cmd.assert().success().stdout("hey\n"); Ok(()) } #[test] fn no_template_block() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.write_stdin(indoc! {" --- context --- true "}); cmd.assert().failure().stderr(indoc! {" Error: no template block found Example: --- context --- to: echo world --- template --- hello, {{to}} "}); Ok(()) } #[test] fn invalid_yaml() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.write_stdin(indoc! {" --- context --- & --- template --- "}); cmd.assert().failure().stderr(indoc! {" Error: error while parsing context as YAML --- context --- & Caused by: did not find expected alphabetic or numeric character at line 1 column 2, while scanning an anchor "}); Ok(()) } #[test] fn invalid_hbs() -> Result<()> { let mut cmd = Command::cargo_bin("handlematters")?; cmd.write_stdin(indoc! {" --- context --- true --- template --- {{ "}); cmd.assert().failure().stderr(indoc! {r#" Error: Template error: invalid handlebars syntax: expected identifier, subexpression, leading_tilde_to_omit_whitespace, or path_inline --> Template error in "Unnamed":2:1 | 0 | {{ | = reason: invalid handlebars syntax: expected identifier, subexpression, leading_tilde_to_omit_whitespace, or path_inline "#}); Ok(()) }