use anyhow::Result; use assert_cmd::{cargo::cargo_bin, Command}; use rexpect::session::{spawn_command, PtySession}; use tempfile::TempDir; struct TestContext { p: PtySession, workdir: TempDir, } fn spawn_interactive_process() -> Result { let workdir = tempfile::tempdir()?; let path = cargo_bin(env!("CARGO_PKG_NAME")); let mut command = std::process::Command::new(&path); command.current_dir(&workdir); let mut p = spawn_command(command, Some(3000))?; expect_prompt(&mut p)?; Ok(TestContext { p, workdir }) } fn expect_prompt(p: &mut PtySession) -> Result<()> { p.exp_string("> ")?; Ok(()) } #[test] fn shows_a_prompt() -> Result<()> { spawn_interactive_process()?; Ok(()) } #[test] fn does_nothing_after_receiving_whitespace_input() -> Result<()> { let mut c = spawn_interactive_process()?; c.p.send_line("")?; expect_prompt(&mut c.p)?; c.p.send_line(" ")?; expect_prompt(&mut c.p)?; Ok(()) } #[test] fn quits_when_eof_is_sent() -> Result<()> { let mut c = spawn_interactive_process()?; c.p.send_control('d')?; c.p.exp_eof()?; Ok(()) } #[test] fn quits_when_exit_command_is_sent() -> Result<()> { let mut c = spawn_interactive_process()?; c.p.send_line("exit")?; c.p.exp_eof()?; Ok(()) } #[test] fn reports_error_with_unsupported_shell_commands() -> Result<()> { let mut c = spawn_interactive_process()?; c.p.send_line("ls")?; c.p.exp_string("Unknown input \"ls\"")?; expect_prompt(&mut c.p)?; Ok(()) } #[test] fn reports_error_with_nonsense_input() -> Result<()> { let mut c = spawn_interactive_process()?; c.p.send_line(" asd fg ")?; c.p.exp_string("Unknown input \"asd fg\"")?; expect_prompt(&mut c.p)?; Ok(()) } #[test] fn can_init_a_new_git_repo() -> Result<()> { let mut c = spawn_interactive_process()?; c.p.send_line("git-init my-new-repo")?; c.p.exp_string("Successfully created my-new-repo.git")?; expect_prompt(&mut c.p)?; Command::new("git") .arg("rev-list") .arg("--all") .current_dir(c.workdir.as_ref().join("git").join("my-new-repo.git")) .assert() .success() .stdout(""); Ok(()) }