From 84be3c9ae7a1b6a86f3a4ccc58e48eab46466b22 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Thu, 6 Jul 2023 15:22:44 +0200 Subject: Move test helper functions into their own helper module --- tests/cli_test_utils/context.rs | 114 ++++++++++++++++++++++++++++++++++++++++ tests/cli_test_utils/git.rs | 41 +++++++++++++++ tests/cli_test_utils/mod.rs | 5 ++ 3 files changed, 160 insertions(+) create mode 100644 tests/cli_test_utils/context.rs create mode 100644 tests/cli_test_utils/git.rs create mode 100644 tests/cli_test_utils/mod.rs (limited to 'tests/cli_test_utils') diff --git a/tests/cli_test_utils/context.rs b/tests/cli_test_utils/context.rs new file mode 100644 index 0000000..2517040 --- /dev/null +++ b/tests/cli_test_utils/context.rs @@ -0,0 +1,114 @@ +use anyhow::Result; +use assert_cmd::cargo::cargo_bin; +use rexpect::session::{spawn_command, PtySession}; +use shackle_shell::user_info::{get_user_groups, get_username}; +use std::path::PathBuf; +use tempfile::TempDir; + +pub struct TestContext { + pub p: PtySession, + pub workdir: TempDir, +} + +impl TestContext { + pub fn new_interactive() -> 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 p = spawn_command(command, Some(3000))?; + let mut c = TestContext { p, workdir }; + c.expect_prompt()?; + Ok(c) + } + + pub fn new_batch(batch_command: &str) -> 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); + command.args(["-c", batch_command]); + let p = spawn_command(command, Some(3000))?; + + Ok(TestContext { p, workdir }) + } + + pub fn personal_repo_dir(&self, repo_name: &str) -> PathBuf { + let username = get_username().unwrap(); + self.workdir + .as_ref() + .join("git") + .join(username) + .join(&format!("{}.git", repo_name)) + } + + pub fn group_repo_dir(&self, group: &str, repo_name: &str) -> PathBuf { + self.workdir + .as_ref() + .join("git") + .join(group) + .join(&format!("{}.git", repo_name)) + } + + pub fn expect_prompt(&mut self) -> Result<()> { + self.p.exp_string("> ")?; + Ok(()) + } + + pub fn expect_successful_init_message(&mut self, repo_path: &str) -> Result<()> { + self.p + .exp_string(&format!("Successfully created \"{repo_path}\""))?; + self.expect_prompt() + } + + pub fn expect_list_table(&mut self, repos: &[(&str, &str)]) -> Result<()> { + self.p.send_line("list")?; + self.p.exp_regex(r"\+-+\+-+\+")?; + self.p.exp_regex(r"\| path +\| description +\|")?; + self.p.exp_regex(r"\+=+\+")?; + for (path, description) in repos { + self.p.exp_string("| ")?; + self.p.exp_string(path)?; + self.p.exp_regex(r" +\| ")?; + self.p.exp_string(&description)?; + self.p.exp_regex(r" +\|")?; + } + self.p.exp_regex(r"\+-+\+-+\+")?; + self.expect_prompt()?; + Ok(()) + } + + pub fn expect_list_table_verbose(&mut self, repos: &[(&str, &str)]) -> Result<()> { + self.p.send_line("list --verbose")?; + self.p.exp_regex(r"\+-+\+-+\+-+\+")?; + self.p.exp_regex(r"\| path +\| description +\| size +\|")?; + self.p.exp_regex(r"\+=+\+")?; + for (path, description) in repos { + self.p.exp_string("| ")?; + self.p.exp_string(path)?; + self.p.exp_regex(r" +\| ")?; + self.p.exp_string(&description)?; + self.p.exp_regex(r" +\|")?; + self.p.exp_regex(r"\d+ (MiB|KiB|B)")?; + self.p.exp_regex(r" +\|")?; + } + self.p.exp_regex(r"\+-+\+-+\+-+\+")?; + self.expect_prompt()?; + Ok(()) + } +} + +pub fn personal_repo_path(repo_name: &str) -> String { + let username = get_username().unwrap(); + format!("git/{username}/{repo_name}.git") +} + +pub fn arbitrary_user_group() -> String { + get_user_groups().into_iter().next().unwrap() +} + +pub fn group_repo_path(group: &str, repo_name: &str) -> String { + format!("git/{group}/{repo_name}.git") +} diff --git a/tests/cli_test_utils/git.rs b/tests/cli_test_utils/git.rs new file mode 100644 index 0000000..d3f35c4 --- /dev/null +++ b/tests/cli_test_utils/git.rs @@ -0,0 +1,41 @@ +use assert_cmd::Command; +use std::path::Path; + +pub fn verify_repo_exists(repo_dir: &Path) { + Command::new("git") + .arg("rev-list") + .arg("--all") + .current_dir(repo_dir) + .assert() + .success() + .stdout(""); +} + +pub fn verify_repo_does_not_exist(repo_dir: &Path) { + assert!(!repo_dir.exists()); +} + +pub fn verify_current_branch(repo_dir: &Path, expected_ref: &str) { + Command::new("git") + .arg("symbolic-ref") + .arg("HEAD") + .current_dir(repo_dir) + .assert() + .success() + .stdout(format!("{expected_ref}\n")); +} + +pub fn verify_repo_config_value(repo_dir: &Path, config_key: &str, config_value: Option<&str>) { + let assert = Command::new("git") + .args(["config", "--local", config_key]) + .current_dir(repo_dir) + .assert(); + match config_value { + Some(value) => { + assert.success().stdout(format!("{value}\n")); + } + None => { + assert.failure().code(1); + } + } +} diff --git a/tests/cli_test_utils/mod.rs b/tests/cli_test_utils/mod.rs new file mode 100644 index 0000000..7aaf1db --- /dev/null +++ b/tests/cli_test_utils/mod.rs @@ -0,0 +1,5 @@ +pub mod context; +pub mod git; + +pub use context::*; +pub use git::*; -- cgit v1.2.3