summaryrefslogtreecommitdiffstats
path: root/src/test/mod.rs
diff options
context:
space:
mode:
authorTilmann Meyer <allescrafterx@gmail.com>2020-08-07 21:13:12 +0200
committerGitHub <noreply@github.com>2020-08-07 15:13:12 -0400
commit88b603be38aa623705e56e572eb174ae4d94107c (patch)
tree05033ec2adf013a55d3836a3f739e856880b5055 /src/test/mod.rs
parent8b0f589486e617c4fd52d870839a94d6e78f7379 (diff)
test: introduce env variable mocking (#1490)
Diffstat (limited to 'src/test/mod.rs')
-rw-r--r--src/test/mod.rs138
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)
+ }
+ }
+}