Skip to content

Support Bash "strict mode" (and fix one unit test) #239

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Dec 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
- Add `--upgrade` option to `./bashunit`
- Remove support to deprecated `setUp`, `tearDown`, `setUpBeforeScript` and `tearDownAfterScript` functions
- Optimize test execution time
- Support tests written using Bash's errexit (-e), nounset (-u), and pipefail options ("unofficial strict mode").

## [0.10.1](https://github.com/TypedDevs/bashunit/compare/0.10.0...0.10.1) - 2023-11-13

Expand Down
1 change: 1 addition & 0 deletions bashunit
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

# shellcheck disable=SC2034
declare -r BASHUNIT_VERSION="0.10.1"
Expand Down
28 changes: 14 additions & 14 deletions src/console_results.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,18 @@ function console_results::render_result() {
echo ""

local total_tests=0
((total_tests+=$(state::get_tests_passed)))
((total_tests+=$(state::get_tests_skipped)))
((total_tests+=$(state::get_tests_incomplete)))
((total_tests+=$(state::get_tests_snapshot)))
((total_tests+=$(state::get_tests_failed)))
((total_tests += $(state::get_tests_passed))) || true
((total_tests += $(state::get_tests_skipped))) || true
((total_tests += $(state::get_tests_incomplete))) || true
((total_tests += $(state::get_tests_snapshot))) || true
((total_tests += $(state::get_tests_failed))) || true

local total_assertions=0
((total_assertions+=$(state::get_assertions_passed)))
((total_assertions+=$(state::get_assertions_skipped)))
((total_assertions+=$(state::get_assertions_incomplete)))
((total_assertions+=$(state::get_assertions_snapshot)))
((total_assertions+=$(state::get_assertions_failed)))
((total_assertions += $(state::get_assertions_passed))) || true
((total_assertions += $(state::get_assertions_skipped))) || true
((total_assertions += $(state::get_assertions_incomplete))) || true
((total_assertions += $(state::get_assertions_snapshot))) || true
((total_assertions += $(state::get_assertions_failed))) || true

printf "%sTests: %s" "$_COLOR_FAINT" "$_COLOR_DEFAULT"
if [[ "$(state::get_tests_passed)" -gt 0 ]] || [[ "$(state::get_assertions_passed)" -gt 0 ]]; then
Expand Down Expand Up @@ -111,7 +111,7 @@ function console_results::print_execution_time() {
}

function console_results::print_successful_test() {
((_SUCCESSFUL_TEST_COUNT++))
((_SUCCESSFUL_TEST_COUNT++)) || true

if [[ "$SIMPLE_OUTPUT" == true ]]; then
if (( _SUCCESSFUL_TEST_COUNT % 50 != 0 )); then
Expand All @@ -121,7 +121,7 @@ function console_results::print_successful_test() {
fi
else
local test_name=$1
local data=$2
local data=${2-}

if [[ -z "$data" ]]; then
printf "%sβœ“ Passed%s: %s\n" "$_COLOR_PASSED" "$_COLOR_DEFAULT" "${test_name}"
Expand Down Expand Up @@ -163,7 +163,7 @@ function console_results::print_failed_snapshot_test() {

function console_results::print_skipped_test() {
local test_name=$1
local reason=$2
local reason=${2-}

printf "${_COLOR_SKIPPED}β†· Skipped${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand All @@ -174,7 +174,7 @@ function console_results::print_skipped_test() {

function console_results::print_incomplete_test() {
local test_name=$1
local pending=$2
local pending=${2-}

printf "${_COLOR_INCOMPLETE}βœ’ Incomplete${_COLOR_DEFAULT}: %s\n" "${test_name}"

Expand Down
34 changes: 7 additions & 27 deletions src/env_configuration.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,10 @@ set -o allexport
[[ -f ".env" ]] && source .env set
set +o allexport

if [[ -z "$PARALLEL_RUN" ]]; then
PARALLEL_RUN=$_DEFAULT_PARALLEL_RUN
fi

if [[ -z "$SHOW_HEADER" ]]; then
SHOW_HEADER=$_DEFAULT_SHOW_HEADER
fi

if [[ -z "$HEADER_ASCII_ART" ]]; then
HEADER_ASCII_ART=$_DEFAULT_HEADER_ASCII_ART
fi

if [[ -z "$SIMPLE_OUTPUT" ]]; then
SIMPLE_OUTPUT=$_DEFAULT_SIMPLE_OUTPUT
fi

if [[ -z "$STOP_ON_FAILURE" ]]; then
STOP_ON_FAILURE=$_DEFAULT_STOP_ON_FAILURE
fi

if [[ -z "$SHOW_EXECUTION_TIME" ]]; then
SHOW_EXECUTION_TIME=$_DEFAULT_SHOW_EXECUTION_TIME
fi

if [[ -z "$DEFAULT_PATH" ]]; then
DEFAULT_PATH=$_DEFAULT_DEFAULT_PATH
fi
: "${PARALLEL_RUN:=$_DEFAULT_PARALLEL_RUN}"
: "${SHOW_HEADER:=$_DEFAULT_SHOW_HEADER}"
: "${HEADER_ASCII_ART:=$_DEFAULT_HEADER_ASCII_ART}"
: "${SIMPLE_OUTPUT:=$_DEFAULT_SIMPLE_OUTPUT}"
: "${STOP_ON_FAILURE:=$_DEFAULT_STOP_ON_FAILURE}"
: "${SHOW_EXECUTION_TIME:=$_DEFAULT_SHOW_EXECUTION_TIME}"
: "${DEFAULT_PATH:=$_DEFAULT_DEFAULT_PATH}"
7 changes: 5 additions & 2 deletions src/helpers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ declare -r BASHUNIT_GIT_REPO="https://github.com/TypedDevs/bashunit"
# @return string Eg: "Some logic camelCase"
#
function helper::normalize_test_function_name() {
local original_function_name="$1"
local original_function_name="${1-}"
local result

# Remove "test_" prefix
Expand Down Expand Up @@ -85,7 +85,9 @@ function helper::get_functions_to_run() {
# @param $1 string Eg: "do_something"
#
function helper::execute_function_if_exists() {
"$1" 2>/dev/null
if [[ "$(type -t "$1")" == "function" ]]; then
"$1" 2>/dev/null
fi
}

#
Expand Down Expand Up @@ -133,6 +135,7 @@ function helper::get_provider_data() {
grep -B 1 "function $function_name()" "$script" |\
grep "# data_provider " |\
sed -E -e 's/\ *# data_provider (.*)$/\1/g'\
|| true
)

if [[ -n "$data_provider_function" ]]; then
Expand Down
14 changes: 7 additions & 7 deletions src/runner.sh
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ function runner::call_test_functions() {
echo "Running $script"
fi

helper::check_duplicate_functions "$script"
helper::check_duplicate_functions "$script" || true

for function_name in "${functions_to_run[@]}"; do
local provider_data=()
Expand Down Expand Up @@ -107,16 +107,16 @@ function runner::parse_execution_result() {
sed -E -e 's/.*##ASSERTIONS_SNAPSHOT=([0-9]*)##.*/\1/g'\
)

_ASSERTIONS_PASSED=$((_ASSERTIONS_PASSED + assertions_passed))
_ASSERTIONS_FAILED=$((_ASSERTIONS_FAILED + assertions_failed))
_ASSERTIONS_SKIPPED=$((_ASSERTIONS_SKIPPED + assertions_skipped))
_ASSERTIONS_INCOMPLETE=$((_ASSERTIONS_INCOMPLETE + assertions_incomplete))
_ASSERTIONS_SNAPSHOT=$((_ASSERTIONS_SNAPSHOT + assertions_snapshot))
((_ASSERTIONS_PASSED += assertions_passed)) || true
((_ASSERTIONS_FAILED += assertions_failed)) || true
((_ASSERTIONS_SKIPPED += assertions_skipped)) || true
((_ASSERTIONS_INCOMPLETE += assertions_incomplete)) || true
((_ASSERTIONS_SNAPSHOT += assertions_snapshot)) || true
}

function runner::run_test() {
local function_name="$1"
local data="$2"
local data="${2-}"
local current_assertions_failed
current_assertions_failed="$(state::get_assertions_failed)"
local current_assertions_snapshot
Expand Down
4 changes: 2 additions & 2 deletions src/skip_todo.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/bin/bash

function skip() {
local reason=$1
local reason=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand All @@ -11,7 +11,7 @@ function skip() {
}

function todo() {
local pending=$1
local pending=${1-}
local label
label="$(helper::normalize_test_function_name "${FUNCNAME[1]}")"

Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/bashunit.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up_before_script() {
TEST_ENV_FILE="tests/acceptance/fixtures/.env.default"
Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/bashunit_execution_error_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up_before_script() {
TEST_ENV_FILE="tests/acceptance/fixtures/.env.default"
Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/bashunit_fail_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up_before_script() {
TEST_ENV_FILE="tests/acceptance/fixtures/.env.default"
Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/bashunit_find_tests_command_line_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up_before_script() {
TEST_ENV_FILE="tests/acceptance/fixtures/.env.default"
Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/bashunit_pass_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up_before_script() {
TEST_ENV_FILE="tests/acceptance/fixtures/.env.default"
Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/bashunit_path_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up_before_script() {
TEST_ENV_FILE="tests/acceptance/fixtures/.env.default"
Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/bashunit_stop_on_failure_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up_before_script() {
TEST_ENV_FILE="tests/acceptance/fixtures/.env.default"
Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/bashunit_upgrade_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up() {
./build.sh >/dev/null
Expand Down
1 change: 1 addition & 0 deletions tests/acceptance/install_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function set_up_before_script() {
TEST_ENV_FILE="./tests/acceptance/fixtures/.env.default"
Expand Down
1 change: 1 addition & 0 deletions tests/functional/logic_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

ROOT_DIR="$(dirname "${BASH_SOURCE[0]}")"

Expand Down
1 change: 1 addition & 0 deletions tests/functional/provider_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

_TEST_GET_DATA_FROM_PROVIDER_ITERATION_FILE=""

Expand Down
1 change: 1 addition & 0 deletions tests/unit/assert_snapshot_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function test_successful_assert_match_snapshot() {
assert_empty "$(assert_match_snapshot "Hello World!")"
Expand Down
1 change: 1 addition & 0 deletions tests/unit/assert_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function test_successful_assert_equals() {
assert_empty "$(assert_equals "1" "1")"
Expand Down
1 change: 1 addition & 0 deletions tests/unit/console_results_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function mock_all_state_getters() {
mock state::is_duplicated_test_functions_found echo false
Expand Down
5 changes: 3 additions & 2 deletions tests/unit/directory_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function test_successful_assert_directory_exists() {
local a_directory
Expand Down Expand Up @@ -260,8 +261,8 @@ function test_unsuccessful_assert_is_directory_not_writable() {
assert_equals\
"$(console_results::print_failed_test\
"Unsuccessful assert is directory not writable" \
"$a_file" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_file")"
"$a_directory" "to be not writable" "but is writable")"\
"$(assert_is_directory_not_writable "$a_directory")"

rmdir "$a_directory"
}
1 change: 1 addition & 0 deletions tests/unit/file_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function test_successful_assert_file_exists() {
local a_file
Expand Down
1 change: 1 addition & 0 deletions tests/unit/helpers_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function tear_down() {
helper::unset_if_exists fake_function
Expand Down
1 change: 1 addition & 0 deletions tests/unit/setup_teardown_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

TEST_COUNTER=1

Expand Down
1 change: 1 addition & 0 deletions tests/unit/skip_todo_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function test_skip_output() {
assert_equals\
Expand Down
1 change: 1 addition & 0 deletions tests/unit/state_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

# shellcheck disable=SC2034

Expand Down
1 change: 1 addition & 0 deletions tests/unit/test_doubles_test.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
set -euo pipefail

function tear_down() {
unset code
Expand Down