diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 4882505c..95a5c9ab 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -247,7 +247,13 @@ jobs: - name: Run tests shell: bash - run: $BUILD_CMD test --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}} + run: | + if [[ ${{ matrix.job.os }} = windows-* ]] + then + powershell.exe -command "$BUILD_CMD test --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}" + else + $BUILD_CMD test --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}} + fi - name: Run bat shell: bash diff --git a/tests/examples/bat-windows.conf b/tests/examples/bat-windows.conf new file mode 100644 index 00000000..68122f4f --- /dev/null +++ b/tests/examples/bat-windows.conf @@ -0,0 +1,5 @@ +# Make sure that the pager gets executed +--paging=always + +# Output a dummy message for the integration test and system wide config test. +--pager="echo.bat dummy-pager-from-config" diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 8fc2c30c..e5507628 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -34,6 +34,14 @@ use utils::mocked_pagers; const EXAMPLES_DIR: &str = "tests/examples"; +fn get_config() -> &'static str { + if cfg!(windows) { + "bat-windows.conf" + } else { + "bat.conf" + } +} + #[test] fn basic() { bat() @@ -589,37 +597,49 @@ fn do_not_exit_directory() { } #[test] +#[serial] fn pager_basic() { - bat() - .env("PAGER", "echo pager-output") - .arg("--paging=always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("pager-output\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat() + .env("PAGER", mocked_pagers::from("echo pager-output")) + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("pager-output\n").normalize()); + }); } #[test] +#[serial] fn pager_basic_arg() { - bat() - .arg("--pager=echo pager-output") - .arg("--paging=always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("pager-output\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat() + .arg(format!( + "--pager={}", + mocked_pagers::from("echo pager-output") + )) + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("pager-output\n").normalize()); + }); } #[test] +#[serial] fn pager_overwrite() { - bat() - .env("PAGER", "echo other-pager") - .env("BAT_PAGER", "echo pager-output") - .arg("--paging=always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("pager-output\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat() + .env("PAGER", mocked_pagers::from("echo other-pager")) + .env("BAT_PAGER", mocked_pagers::from("echo pager-output")) + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("pager-output\n").normalize()); + }); } #[test] @@ -635,55 +655,73 @@ fn pager_disable() { } #[test] +#[serial] fn pager_arg_override_env_withconfig() { - bat_with_config() - .env("BAT_CONFIG_PATH", "bat.conf") - .env("PAGER", "echo another-pager") - .env("BAT_PAGER", "echo other-pager") - .arg("--pager=echo pager-output") - .arg("--paging=always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("pager-output\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat_with_config() + .env("BAT_CONFIG_PATH", get_config()) + .env("PAGER", mocked_pagers::from("echo another-pager")) + .env("BAT_PAGER", mocked_pagers::from("echo other-pager")) + .arg(format!( + "--pager={}", + mocked_pagers::from("echo pager-output") + )) + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("pager-output\n").normalize()); + }); } #[test] +#[serial] fn pager_arg_override_env_noconfig() { - bat() - .env("PAGER", "echo another-pager") - .env("BAT_PAGER", "echo other-pager") - .arg("--pager=echo pager-output") - .arg("--paging=always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("pager-output\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat() + .env("PAGER", mocked_pagers::from("echo another-pager")) + .env("BAT_PAGER", mocked_pagers::from("echo other-pager")) + .arg(format!( + "--pager={}", + mocked_pagers::from("echo pager-output") + )) + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("pager-output\n").normalize()); + }); } #[test] +#[serial] fn pager_env_bat_pager_override_config() { - bat_with_config() - .env("BAT_CONFIG_PATH", "bat.conf") - .env("PAGER", "echo other-pager") - .env("BAT_PAGER", "echo pager-output") - .arg("--paging=always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("pager-output\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat_with_config() + .env("BAT_CONFIG_PATH", get_config()) + .env("PAGER", mocked_pagers::from("echo other-pager")) + .env("BAT_PAGER", mocked_pagers::from("echo pager-output")) + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("pager-output\n").normalize()); + }); } #[test] +#[serial] fn pager_env_pager_nooverride_config() { - bat_with_config() - .env("BAT_CONFIG_PATH", "bat.conf") - .env("PAGER", "echo other-pager") - .arg("--paging=always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("dummy-pager-from-config\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat_with_config() + .env("BAT_CONFIG_PATH", get_config()) + .env("PAGER", mocked_pagers::from("echo other-pager")) + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("dummy-pager-from-config\n").normalize()); + }); } #[test] @@ -809,15 +847,18 @@ fn alias_pager_disable() { } #[test] +#[serial] fn alias_pager_disable_long_overrides_short() { - bat() - .env("PAGER", "echo pager-output") - .arg("-P") - .arg("--paging=always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("pager-output\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat() + .env("PAGER", mocked_pagers::from("echo pager-output")) + .arg("-P") + .arg("--paging=always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("pager-output\n").normalize()); + }); } #[test] @@ -844,14 +885,17 @@ fn pager_failed_to_parse() { } #[test] +#[serial] fn env_var_bat_paging() { - bat() - .env("BAT_PAGER", "echo pager-output") - .env("BAT_PAGING", "always") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("pager-output\n")); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat() + .env("BAT_PAGER", mocked_pagers::from("echo pager-output")) + .env("BAT_PAGING", "always") + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("pager-output\n").normalize()); + }); } #[test] @@ -912,13 +956,16 @@ fn config_location_from_bat_config_dir_variable() { } #[test] +#[serial] fn config_read_arguments_from_file() { - bat_with_config() - .env("BAT_CONFIG_PATH", "bat.conf") - .arg("test.txt") - .assert() - .success() - .stdout(predicate::eq("dummy-pager-from-config\n").normalize()); + mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { + bat_with_config() + .env("BAT_CONFIG_PATH", get_config()) + .arg("test.txt") + .assert() + .success() + .stdout(predicate::str::contains("dummy-pager-from-config\n").normalize()); + }); } #[cfg(unix)] diff --git a/tests/mocked-pagers/echo.bat b/tests/mocked-pagers/echo.bat new file mode 100644 index 00000000..62fa9423 --- /dev/null +++ b/tests/mocked-pagers/echo.bat @@ -0,0 +1 @@ +ECHO %* diff --git a/tests/utils/mocked_pagers.rs b/tests/utils/mocked_pagers.rs index 07ae6fcd..98055e38 100644 --- a/tests/utils/mocked_pagers.rs +++ b/tests/utils/mocked_pagers.rs @@ -17,11 +17,16 @@ fn get_mocked_pagers_dir() -> PathBuf { /// On Unix: 'most' -> 'most' /// On Windows: 'most' -> 'most.bat' pub fn from(base: &str) -> String { - if cfg!(windows) { - format!("{}.bat", base) - } else { - String::from(base) + let mut cmd_and_args = shell_words::split(base).unwrap(); + let suffix = if cfg!(windows) { ".bat" } else { "" }; + let mut out_cmd = format!("{}{}", cmd_and_args.first().unwrap(), suffix); + + if (cmd_and_args.len() > 1) { + out_cmd.push(' '); + out_cmd.push_str(cmd_and_args[1..].to_vec().join(" ").as_str()); } + + out_cmd } /// Prepends a directory to the PATH environment variable @@ -62,6 +67,11 @@ pub fn with_mocked_versions_of_more_and_most_in_path(actual_test: fn()) { .assert() .success() .stdout(predicate::str::contains("I am most")); + Command::new(from("echo")) + .arg("foobar") + .assert() + .success() + .stdout(predicate::str::contains("foobar")); // Now run the actual test actual_test();