From dc267979a46caee4d79ed2e3d17af9bd513c4e39 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Fri, 8 Jan 2021 10:33:55 -0500 Subject: Prevent tests setting env vars from affecting other tests --- src/git_config/git_config.rs | 8 +++++-- src/options/get.rs | 46 ++++++++++++++++++------------------- src/tests/integration_test_utils.rs | 23 ++++++++++++++++--- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/src/git_config/git_config.rs b/src/git_config/git_config.rs index 96209603..d95a6b1a 100644 --- a/src/git_config/git_config.rs +++ b/src/git_config/git_config.rs @@ -42,10 +42,14 @@ impl GitConfig { } #[cfg(test)] - pub fn from_path(path: &Path) -> Self { + pub fn from_path(path: &Path, honor_env_var: bool) -> Self { Self { config: git2::Config::open(path).unwrap(), - config_from_env_var: parse_config_from_env_var(), + config_from_env_var: if honor_env_var { + parse_config_from_env_var() + } else { + HashMap::new() + }, repo: None, enabled: true, } diff --git a/src/options/get.rs b/src/options/get.rs index f19c3293..a36987ca 100644 --- a/src/options/get.rs +++ b/src/options/get.rs @@ -117,8 +117,13 @@ pub mod tests { use crate::tests::integration_test_utils::integration_test_utils; + // TODO: the followig tests are collapsed into one since they all set the same env var and thus + // could affect each other if allowed to run concurrently. + #[test] - fn test_simple_string_env_var_overrides_git_config() { + fn test_env_var_overrides_git_config() { + // ---------------------------------------------------------------------------------------- + // simple string let git_config_contents = b" [delta] plus-style = blue @@ -133,7 +138,7 @@ pub mod tests { assert_eq!(opt.plus_style, "blue"); env::set_var("GIT_CONFIG_PARAMETERS", "'delta.plus-style=green'"); - let opt = integration_test_utils::make_options_from_args_and_git_config( + let opt = integration_test_utils::make_options_from_args_and_git_config_honoring_env_var( &[], Some(git_config_contents), Some(git_config_path), @@ -141,10 +146,9 @@ pub mod tests { assert_eq!(opt.plus_style, "green"); remove_file(git_config_path).unwrap(); - } - #[test] - fn test_complex_string_env_var_overrides_git_config() { + // ---------------------------------------------------------------------------------------- + // complex string let git_config_contents = br##" [delta] minus-style = red bold ul "#ffeeee" @@ -162,7 +166,7 @@ pub mod tests { "GIT_CONFIG_PARAMETERS", r##"'delta.minus-style=magenta italic ol "#aabbcc"'"##, ); - let opt = integration_test_utils::make_options_from_args_and_git_config( + let opt = integration_test_utils::make_options_from_args_and_git_config_honoring_env_var( &[], Some(git_config_contents), Some(git_config_path), @@ -170,10 +174,9 @@ pub mod tests { assert_eq!(opt.minus_style, r##"magenta italic ol "#aabbcc""##,); remove_file(git_config_path).unwrap(); - } - #[test] - fn test_option_string_env_var_overrides_git_config() { + // ---------------------------------------------------------------------------------------- + // option string let git_config_contents = b" [delta] plus-style = blue @@ -188,7 +191,7 @@ pub mod tests { assert_eq!(opt.plus_style, "blue"); env::set_var("GIT_CONFIG_PARAMETERS", "'delta.plus-style=green'"); - let opt = integration_test_utils::make_options_from_args_and_git_config( + let opt = integration_test_utils::make_options_from_args_and_git_config_honoring_env_var( &[], Some(git_config_contents), Some(git_config_path), @@ -196,10 +199,9 @@ pub mod tests { assert_eq!(opt.plus_style, "green"); remove_file(git_config_path).unwrap(); - } - #[test] - fn test_bool_env_var_overrides_git_config() { + // ---------------------------------------------------------------------------------------- + // bool let git_config_contents = b" [delta] side-by-side = true @@ -214,7 +216,7 @@ pub mod tests { assert_eq!(opt.side_by_side, true); env::set_var("GIT_CONFIG_PARAMETERS", "'delta.side-by-side=false'"); - let opt = integration_test_utils::make_options_from_args_and_git_config( + let opt = integration_test_utils::make_options_from_args_and_git_config_honoring_env_var( &[], Some(git_config_contents), Some(git_config_path), @@ -222,10 +224,9 @@ pub mod tests { assert_eq!(opt.side_by_side, false); remove_file(git_config_path).unwrap(); - } - #[test] - fn test_int_env_var_overrides_git_config() { + // ---------------------------------------------------------------------------------------- + // int let git_config_contents = b" [delta] max-line-length = 1 @@ -240,7 +241,7 @@ pub mod tests { assert_eq!(opt.max_line_length, 1); env::set_var("GIT_CONFIG_PARAMETERS", "'delta.max-line-length=2'"); - let opt = integration_test_utils::make_options_from_args_and_git_config( + let opt = integration_test_utils::make_options_from_args_and_git_config_honoring_env_var( &[], Some(git_config_contents), Some(git_config_path), @@ -248,17 +249,16 @@ pub mod tests { assert_eq!(opt.max_line_length, 2); remove_file(git_config_path).unwrap(); - } - #[test] - fn test_float_env_var_overrides_git_config() { + // ---------------------------------------------------------------------------------------- + // float let git_config_contents = b" [delta] max-line-distance = 0.6 "; let git_config_path = "delta__test_float_env_var_overrides_git_config.gitconfig"; - let opt = integration_test_utils::make_options_from_args_and_git_config( + let opt = integration_test_utils::make_options_from_args_and_git_config_honoring_env_var( &[], Some(git_config_contents), Some(git_config_path), @@ -266,7 +266,7 @@ pub mod tests { assert_eq!(opt.max_line_distance, 0.6); env::set_var("GIT_CONFIG_PARAMETERS", "'delta.max-line-distance=0.7'"); - let opt = integration_test_utils::make_options_from_args_and_git_config( + let opt = integration_test_utils::make_options_from_args_and_git_config_honoring_env_var( &[], Some(git_config_contents), Some(git_config_path), diff --git a/src/tests/integration_test_utils.rs b/src/tests/integration_test_utils.rs index 37ae0575..8eb36748 100644 --- a/src/tests/integration_test_utils.rs +++ b/src/tests/integration_test_utils.rs @@ -17,12 +17,29 @@ pub mod integration_test_utils { args: &[&str], git_config_contents: Option<&[u8]>, git_config_path: Option<&str>, + ) -> cli::Opt { + _make_options_from_args_and_git_config(args, git_config_contents, git_config_path, false) + } + + pub fn make_options_from_args_and_git_config_honoring_env_var( + args: &[&str], + git_config_contents: Option<&[u8]>, + git_config_path: Option<&str>, + ) -> cli::Opt { + _make_options_from_args_and_git_config(args, git_config_contents, git_config_path, true) + } + + fn _make_options_from_args_and_git_config( + args: &[&str], + git_config_contents: Option<&[u8]>, + git_config_path: Option<&str>, + honor_env_var: bool, ) -> cli::Opt { let mut args: Vec<&str> = itertools::chain(&["/dev/null", "/dev/null"], args) .map(|s| *s) .collect(); let mut git_config = match (git_config_contents, git_config_path) { - (Some(contents), Some(path)) => Some(make_git_config(contents, path)), + (Some(contents), Some(path)) => Some(make_git_config(contents, path, honor_env_var)), _ => { args.push("--no-gitconfig"); None @@ -52,11 +69,11 @@ pub mod integration_test_utils { config::Config::from(make_options_from_args(args)) } - fn make_git_config(contents: &[u8], path: &str) -> GitConfig { + fn make_git_config(contents: &[u8], path: &str, honor_env_var: bool) -> GitConfig { let path = Path::new(path); let mut file = File::create(path).unwrap(); file.write_all(contents).unwrap(); - GitConfig::from_path(&path) + GitConfig::from_path(&path, honor_env_var) } pub fn get_line_of_code_from_delta( -- cgit v1.2.3