From 847b8998aeda0191763b12303d78c731a9369641 Mon Sep 17 00:00:00 2001 From: Chemaclass Date: Thu, 4 Dec 2025 19:22:07 +0100 Subject: [PATCH] fix(data-provider): resolve paths when set_up_before_script changes directory When set_up_before_script uses cd to change the working directory, relative test file paths become invalid for file operations like grep. This caused data providers to silently fail because the script file couldn't be found --- CHANGELOG.md | 1 + bashunit | 4 ++++ src/helpers.sh | 11 +++++++++++ tests/functional/provider_with_cd_test.sh | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 tests/functional/provider_with_cd_test.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 77ccd24c..66cdfec4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,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 ## [0.28.0](https://github.com/TypedDevs/bashunit/compare/0.27.0...0.28.0) - 2025-12-01 diff --git a/bashunit b/bashunit index 05a4a931..0b0fd379 100755 --- a/bashunit +++ b/bashunit @@ -34,6 +34,10 @@ declare -r BASHUNIT_VERSION="0.28.0" declare -r BASHUNIT_ROOT_DIR="$(dirname "${BASH_SOURCE[0]}")" export BASHUNIT_ROOT_DIR +# Capture working directory at startup (before any test changes it) +declare -r BASHUNIT_WORKING_DIR="$PWD" +export BASHUNIT_WORKING_DIR + source "$BASHUNIT_ROOT_DIR/src/dev/debug.sh" source "$BASHUNIT_ROOT_DIR/src/check_os.sh" source "$BASHUNIT_ROOT_DIR/src/str.sh" diff --git a/src/helpers.sh b/src/helpers.sh index e8b23fdb..0507ec4b 100755 --- a/src/helpers.sh +++ b/src/helpers.sh @@ -130,6 +130,11 @@ function helper::decode_base64() { function helper::check_duplicate_functions() { local script="$1" + # Handle directory changes in set_up_before_script (issue #529) + if [[ ! -f "$script" && -n "${BASHUNIT_WORKING_DIR:-}" ]]; then + script="$BASHUNIT_WORKING_DIR/$script" + fi + local filtered_lines filtered_lines=$(grep -E '^[[:space:]]*(function[[:space:]]+)?test[a-zA-Z_][a-zA-Z0-9_]*\s*\(\)\s*\{' "$script") @@ -244,6 +249,12 @@ function helper::get_provider_data() { local function_name="$1" local script="$2" + # Handle directory changes in set_up_before_script (issue #529) + # If relative path doesn't exist, try with BASHUNIT_WORKING_DIR + if [[ ! -f "$script" && -n "${BASHUNIT_WORKING_DIR:-}" ]]; then + script="$BASHUNIT_WORKING_DIR/$script" + fi + if [[ ! -f "$script" ]]; then return fi diff --git a/tests/functional/provider_with_cd_test.sh b/tests/functional/provider_with_cd_test.sh new file mode 100644 index 00000000..d6604c17 --- /dev/null +++ b/tests/functional/provider_with_cd_test.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Regression test for https://github.com/TypedDevs/bashunit/issues/529 +# Data providers should work even when set_up_before_script changes directory + +function set_up_before_script() { + cd "$(temp_dir)" || return 1 +} + +# @data_provider provide_data +function test_data_provider_works_after_cd_in_set_up_before_script() { + local value="$1" + + assert_equals "expected_value" "$value" +} + +function provide_data() { + echo "expected_value" +}