From 51cb2b232c3748157e111e1cfc9e09ab863063a2 Mon Sep 17 00:00:00 2001 From: Chemaclass Date: Thu, 4 Dec 2025 22:46:37 +0100 Subject: [PATCH 1/2] fix(runner): restore working directory after each test file When set_up_before_script changes the working directory, subsequent test files would not run because relative paths became invalid. Now the working directory is restored after each test file completes. Fixes #532 --- CHANGELOG.md | 1 + src/runner.sh | 8 +++++ ...bashunit_cd_in_setup_before_script_test.sh | 33 +++++++++++++++++++ .../test_cd_in_setup_before_script_first.sh | 13 ++++++++ .../test_cd_in_setup_before_script_second.sh | 9 +++++ 5 files changed, 64 insertions(+) create mode 100644 tests/acceptance/bashunit_cd_in_setup_before_script_test.sh create mode 100644 tests/acceptance/fixtures/test_cd_in_setup_before_script_first.sh create mode 100644 tests/acceptance/fixtures/test_cd_in_setup_before_script_second.sh 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..d5e6f62d 100755 --- a/src/runner.sh +++ b/src/runner.sh @@ -43,6 +43,8 @@ function runner::load_test_files() { if ! parallel::is_enabled; then cleanup_script_temp_files fi + # Restore working directory in case set_up_before_script changed it + cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true continue fi if parallel::is_enabled; then @@ -56,6 +58,8 @@ function runner::load_test_files() { cleanup_script_temp_files fi internal_log "Finished file" "$test_file" + # Restore working directory in case set_up_before_script changed it + cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true done if parallel::is_enabled; then @@ -101,12 +105,16 @@ function runner::load_bench_files() { fi runner::clean_set_up_and_tear_down_after_script cleanup_script_temp_files + # Restore working directory in case set_up_before_script changed it + cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true 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 + # Restore working directory in case set_up_before_script changed it + cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true 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" +} From 73a7d0cc646821d868ecee478c0fd277646e4b3d Mon Sep 17 00:00:00 2001 From: Chemaclass Date: Thu, 4 Dec 2025 22:56:15 +0100 Subject: [PATCH 2/2] ref: extract func runner::restore_workdir --- src/runner.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/runner.sh b/src/runner.sh index d5e6f62d..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,8 +47,7 @@ function runner::load_test_files() { if ! parallel::is_enabled; then cleanup_script_temp_files fi - # Restore working directory in case set_up_before_script changed it - cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true + runner::restore_workdir continue fi if parallel::is_enabled; then @@ -58,8 +61,7 @@ function runner::load_test_files() { cleanup_script_temp_files fi internal_log "Finished file" "$test_file" - # Restore working directory in case set_up_before_script changed it - cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true + runner::restore_workdir done if parallel::is_enabled; then @@ -105,16 +107,14 @@ function runner::load_bench_files() { fi runner::clean_set_up_and_tear_down_after_script cleanup_script_temp_files - # Restore working directory in case set_up_before_script changed it - cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true + 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 - # Restore working directory in case set_up_before_script changed it - cd "$BASHUNIT_WORKING_DIR" 2>/dev/null || true + runner::restore_workdir done }