diff options
author | Tilmann Meyer <allescrafterx@gmail.com> | 2020-08-07 21:13:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-07 15:13:12 -0400 |
commit | 88b603be38aa623705e56e572eb174ae4d94107c (patch) | |
tree | 05033ec2adf013a55d3836a3f739e856880b5055 /src/test/mod.rs | |
parent | 8b0f589486e617c4fd52d870839a94d6e78f7379 (diff) |
test: introduce env variable mocking (#1490)
Diffstat (limited to 'src/test/mod.rs')
-rw-r--r-- | src/test/mod.rs | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/test/mod.rs b/src/test/mod.rs new file mode 100644 index 000000000..71402a0ac --- /dev/null +++ b/src/test/mod.rs @@ -0,0 +1,138 @@ +use crate::config::StarshipConfig; +use crate::context::{Context, Shell}; +use once_cell::sync::Lazy; +use std::io; +use std::path::PathBuf; +use std::process::Command; +use tempfile::TempDir; + +static FIXTURE_DIR: Lazy<PathBuf> = + Lazy::new(|| PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("src/test/fixtures/")); + +static GIT_FIXTURE: Lazy<PathBuf> = Lazy::new(|| FIXTURE_DIR.join("git-repo.bundle")); +static HG_FIXTURE: Lazy<PathBuf> = Lazy::new(|| FIXTURE_DIR.join("hg-repo.bundle")); + +/// Render a specific starship module by name +pub struct ModuleRenderer<'a> { + name: &'a str, + context: Context<'a>, +} + +impl<'a> ModuleRenderer<'a> { + /// Creates a new ModuleRenderer + pub fn new(name: &'a str) -> Self { + let mut context = Context::new_with_dir(clap::ArgMatches::default(), PathBuf::new()); + context.shell = Shell::Unknown; + context.config = StarshipConfig { config: None }; + + Self { name, context } + } + + pub fn path<T>(mut self, path: T) -> Self + where + T: Into<PathBuf>, + { + self.context.current_dir = path.into(); + self + } + + /// Sets the config of the underlying context + pub fn config(mut self, config: toml::Value) -> Self { + self.context.config = StarshipConfig { + config: Some(config), + }; + self + } + + /// Adds the variable to the env_mocks of the underlying context + pub fn env<V: Into<String>>(mut self, key: &'a str, val: V) -> Self { + self.context.env.insert(key, val.into()); + self + } + + pub fn shell(mut self, shell: Shell) -> Self { + self.context.shell = shell; + self + } + + pub fn jobs(mut self, jobs: u64) -> Self { + self.context.properties.insert("jobs", jobs.to_string()); + self + } + + pub fn cmd_duration(mut self, duration: u64) -> Self { + self.context + .properties + .insert("cmd_duration", duration.to_string()); + self + } + + pub fn keymap<T>(mut self, keymap: T) -> Self + where + T: Into<String>, + { + self.context.properties.insert("keymap", keymap.into()); + self + } + + pub fn status(mut self, status: i32) -> Self { + self.context + .properties + .insert("status_code", status.to_string()); + self + } + + /// Renders the module returning its output + pub fn collect(self) -> Option<String> { + crate::print::get_module(self.name, self.context) + } +} + +pub enum FixtureProvider { + GIT, + HG, +} + +pub fn fixture_repo(provider: FixtureProvider) -> io::Result<TempDir> { + match provider { + FixtureProvider::GIT => { + let path = tempfile::tempdir()?; + + Command::new("git") + .current_dir(path.path()) + .args(&["clone", "-b", "master"]) + .arg(GIT_FIXTURE.as_os_str()) + .arg(&path.path()) + .output()?; + + Command::new("git") + .args(&["config", "--local", "user.email", "starship@example.com"]) + .current_dir(&path.path()) + .output()?; + + Command::new("git") + .args(&["config", "--local", "user.name", "starship"]) + .current_dir(&path.path()) + .output()?; + + Command::new("git") + .args(&["reset", "--hard", "HEAD"]) + .current_dir(&path.path()) + .output()?; + + Ok(path) + } + FixtureProvider::HG => { + let path = tempfile::tempdir()?; + + Command::new("hg") + .current_dir(path.path()) + .arg("clone") + .arg(HG_FIXTURE.as_os_str()) + .arg(&path.path()) + .output()?; + + Ok(path) + } + } +} |