use anyhow::Result; use assert_cmd::{cargo::cargo_bin, Command}; use rexpect::{session::PtySession, spawn}; fn spawn_interactive_process() -> Result { let path = cargo_bin(env!("CARGO_PKG_NAME")); let mut process = spawn(&path.display().to_string(), Some(3000))?; expect_prompt(&mut process)?; Ok(process) } 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 p = spawn_interactive_process()?; p.send_line("")?; expect_prompt(&mut p)?; p.send_line(" ")?; expect_prompt(&mut p)?; Ok(()) } #[test] fn quits_when_eof_is_sent() -> Result<()> { let mut p = spawn_interactive_process()?; p.send_control('d')?; p.exp_eof()?; Ok(()) } #[test] fn quits_when_exit_command_is_sent() -> Result<()> { let mut p = spawn_interactive_process()?; p.send_line("exit")?; p.exp_eof()?; Ok(()) } #[test] fn reports_error_with_unsupported_shell_commands() -> Result<()> { let mut p = spawn_interactive_process()?; p.send_line("ls")?; p.exp_string("Unknown input \"ls\"")?; expect_prompt(&mut p)?; Ok(()) } #[test] fn reports_error_with_nonsense_input() -> Result<()> { let mut p = spawn_interactive_process()?; p.send_line(" asd fg ")?; p.exp_string("Unknown input \"asd fg\"")?; expect_prompt(&mut p)?; Ok(()) } #[test] fn can_init_a_new_git_repo() -> Result<()> { let mut p = spawn_interactive_process()?; p.send_line("git-init my-new-repo")?; p.exp_string("Successfully created my-new-repo.git")?; expect_prompt(&mut p)?; Command::new("git") .arg("rev-list") .arg("--all") .current_dir("git/my-new-repo.git") .assert() .success() .stdout(""); Ok(()) }