# approvals.bash v0.3.3 # # Interactive approval testing for Bash. # github.com/DannyBen/approvals.bash approve() {
local expected approval approval_file actual cmd approvals_dir=${APPROVALS_DIR:=approvals} cmd=$1 last_exit_code=0 actual=$(eval "$cmd" 2>&1) || last_exit_code=$? approval=$(printf "%b" "$cmd" | tr -s -c "[:alnum:]" _) approval_file="$approvals_dir/${2:-"$approval"}" [[ -d "$approvals_dir" ]] || mkdir "$approvals_dir" if [[ -f "$approval_file" ]]; then expected=$(cat "$approval_file") else echo "--- [$(blue "new: $cmd")] ---" printf "%b\n" "$actual" echo "--- [$(blue "new: $cmd")] ---" expected="$actual" user_approval "$cmd" "$actual" "$approval_file" return fi if [[ "$(printf "%b" "$actual")" = "$(printf "%b" "$expected")" ]]; then pass "$cmd" else echo "--- [$(blue "diff: $cmd")] ---" $diff_cmd <(printf "%b" "$expected\n") <(printf "%b" "$actual\n") | tail -n +4 echo "--- [$(blue "diff: $cmd")] ---" user_approval "$cmd" "$actual" "$approval_file" fi
}
describe() {
echo blue "= $*"
}
context() {
echo magenta "= $*"
}
fail() {
red " FAILED: $*" exit 1
}
pass() {
green " approved: $*" return 0
}
expect_exit_code() {
if [[ $last_exit_code == "$1" ]]; then pass "exit $last_exit_code" else fail "Expected exit code $1, got $last_exit_code" fi
}
red() { printf “e[31m%be[0mn” “$*”; } green() { printf “e[32m%be[0mn” “$*”; } blue() { printf “e[34m%be[0mn” “$*”; } magenta() { printf “e[35m%be[0mn” “$*”; } cyan() { printf “e[36m%be[0mn” “$*”; }
# Private
user_approval() {
local cmd="$1" local actual="$2" local approval_file="$3" if [[ -v CI || -v GITHUB_ACTIONS ]]; then fail "$cmd" fi echo printf "[A]pprove? \n" response=$(bash -c "read -n 1 key; echo \$key") printf "\r" if [[ $response =~ [Aa] ]]; then printf "%b\n" "$actual" >"$approval_file" pass "$cmd" else fail "$cmd" fi
}
onexit() {
exitcode=$? if [[ "$exitcode" == 0 ]]; then green "\nFinished successfully" else red "\nFinished with failures" fi exit $exitcode
}
onerror() {
fail "Caller: $(caller)"
}
set -e trap 'onexit' EXIT trap 'onerror' ERR
if diff –help | grep – –color >/dev/null 2>&1; then
diff_cmd="diff --unified --color=always"
else
diff_cmd="diff --unified"
fi