diff --git a/CHANGELOG.md b/CHANGELOG.md index 66cdfec4..0f688a71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixed - Custom assertions now display the correct test function name in failure messages - Data providers now work when `set_up_before_script` changes directory +- Subsequent test files now run when `set_up_before_script` changes directory ## [0.28.0](https://github.com/TypedDevs/bashunit/compare/0.27.0...0.28.0) - 2025-12-01 diff --git a/src/runner.sh b/src/runner.sh index 07a3ffdb..cb14d09b 100755 --- a/src/runner.sh +++ b/src/runner.sh @@ -8,6 +8,10 @@ if [[ -z ${RUNNER_PARSE_RESULT_REGEX+x} ]]; then 'TEST_EXIT_CODE=([0-9]*)' fi +function runner::restore_workdir() { + cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true +} + function runner::load_test_files() { local filter=$1 shift @@ -43,6 +47,7 @@ function runner::load_test_files() { if ! parallel::is_enabled; then cleanup_script_temp_files fi + runner::restore_workdir continue fi if parallel::is_enabled; then @@ -56,6 +61,7 @@ function runner::load_test_files() { cleanup_script_temp_files fi internal_log "Finished file" "$test_file" + runner::restore_workdir done if parallel::is_enabled; then @@ -101,12 +107,14 @@ function runner::load_bench_files() { fi runner::clean_set_up_and_tear_down_after_script cleanup_script_temp_files + runner::restore_workdir continue fi runner::call_bench_functions "$bench_file" "$filter" runner::run_tear_down_after_script "$bench_file" runner::clean_set_up_and_tear_down_after_script cleanup_script_temp_files + runner::restore_workdir done } diff --git a/tests/acceptance/bashunit_cd_in_setup_before_script_test.sh b/tests/acceptance/bashunit_cd_in_setup_before_script_test.sh new file mode 100644 index 00000000..0a400641 --- /dev/null +++ b/tests/acceptance/bashunit_cd_in_setup_before_script_test.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Regression test for https://github.com/TypedDevs/bashunit/issues/532 +# Subsequent tests should run when an earlier test's set_up_before_script changes directory + +function set_up_before_script() { + TEST_ENV_FILE="tests/acceptance/fixtures/.env.default" +} + +function strip_ansi() { + sed -E 's/\x1B\[[0-9;]*[A-Za-z]//g' +} + +function test_subsequent_tests_run_when_set_up_before_script_changes_directory() { + local first_file=./tests/acceptance/fixtures/test_cd_in_setup_before_script_first.sh + local second_file=./tests/acceptance/fixtures/test_cd_in_setup_before_script_second.sh + + local actual_raw + actual_raw="$(./bashunit --no-parallel --env "$TEST_ENV_FILE" "$first_file" "$second_file")" + + local actual + actual="$(printf "%s" "$actual_raw" | strip_ansi)" + + # Both test files should run + assert_contains "Running" "$actual" + assert_contains "test_cd_in_setup_before_script_first.sh" "$actual" + assert_contains "test_cd_in_setup_before_script_second.sh" "$actual" + + # Both tests should pass + assert_contains "2 passed, 2 total" "$actual" + assert_successful_code "$(./bashunit --no-parallel --env "$TEST_ENV_FILE" "$first_file" "$second_file")" +} diff --git a/tests/acceptance/fixtures/test_cd_in_setup_before_script_first.sh b/tests/acceptance/fixtures/test_cd_in_setup_before_script_first.sh new file mode 100644 index 00000000..fd534627 --- /dev/null +++ b/tests/acceptance/fixtures/test_cd_in_setup_before_script_first.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Regression test for https://github.com/TypedDevs/bashunit/issues/532 +# First test file that changes directory in set_up_before_script + +function set_up_before_script() { + cd "$(temp_dir)" || return 1 +} + +function test_first_file_runs() { + assert_equals "first" "first" +} diff --git a/tests/acceptance/fixtures/test_cd_in_setup_before_script_second.sh b/tests/acceptance/fixtures/test_cd_in_setup_before_script_second.sh new file mode 100644 index 00000000..3c95a6b4 --- /dev/null +++ b/tests/acceptance/fixtures/test_cd_in_setup_before_script_second.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Regression test for https://github.com/TypedDevs/bashunit/issues/532 +# Second test file that should run after the first test changes directory + +function test_second_file_runs() { + assert_equals "second" "second" +}