3 Commits

Author SHA1 Message Date
efb9140329 Bump version to 0.2.0 2014-03-16 02:00:26 +00:00
0c4a5d11ee Ensure stub can be used multiple times on the same command
Ensures that the original bash function is preserved even if it is
stubbed multiple times before a restore.
2014-03-16 01:57:58 +00:00
ef231e420a Default stub to not echoing anything unless specified 2014-03-16 01:57:34 +00:00
3 changed files with 70 additions and 17 deletions

25
stub.sh
View File

@@ -1,5 +1,5 @@
# !/usr/bin/env bash # !/usr/bin/env bash
# stub.sh 0.1.0 - stubbing helpers for simplifying bash script tests. # stub.sh 0.2.0 - stubbing helpers for simplifying bash script tests.
# Copyright (c) 2014 Jim Myhrberg. # Copyright (c) 2014 Jim Myhrberg.
# #
# https://github.com/jimeh/stub.sh # https://github.com/jimeh/stub.sh
@@ -29,10 +29,15 @@
# Arguments: # Arguments:
# - $1: Name of command to stub. # - $1: Name of command to stub.
# - $2: When set to "STDERR", echo to STDERR instead of STDOUT. # - $2: When set to "STDERR", echo to STDERR instead of STDOUT.
# When set to "null", all output is redirected to /dev/null.
# #
# #
stub() { stub() {
stub_and_echo "$1" "$1 stub: \$@" "$2" local redirect="null"
if [ "$2" == "stdout" ] || [ "$2" == "STDOUT" ]; then redirect=""; fi
if [ "$2" == "stderr" ] || [ "$2" == "STDERR" ]; then redirect="stderr"; fi
stub_and_echo "$1" "$1 stub: \$@" "$redirect"
} }
@@ -42,9 +47,13 @@ stub() {
# - $1: Name of command to stub. # - $1: Name of command to stub.
# - $2: String to echo when stub is called. # - $2: String to echo when stub is called.
# - $3: When set to "STDERR", echo to STDERR instead of STDOUT. # - $3: When set to "STDERR", echo to STDERR instead of STDOUT.
# When set to "null", all output is redirected to /dev/null.
# #
stub_and_echo() { stub_and_echo() {
if [ "$3" == "STDERR" ]; then local redirect=" 1>&2"; fi local redirect=""
if [ "$3" == "stderr" ] || [ "$3" == "STDERR" ]; then redirect=" 1>&2"; fi
if [ "$3" == "null" ]; then redirect=" &>/dev/null"; fi
stub_and_eval "$1" "echo \"$2\"$redirect" stub_and_eval "$1" "echo \"$2\"$redirect"
} }
@@ -60,10 +69,12 @@ stub_and_eval() {
# If stubbing a function, store non-stubbed copy of it required for restore. # If stubbing a function, store non-stubbed copy of it required for restore.
if [ -n "$(command -v "$cmd")" ]; then if [ -n "$(command -v "$cmd")" ]; then
if [[ "$(type "$cmd" | head -1)" == *"is a function" ]]; then if [ -z "$(command -v "non_stubbed_${cmd}")" ]; then
local source="$(type "$cmd" | tail -n +2)" if [[ "$(type "$cmd" | head -1)" == *"is a function" ]]; then
source="${source/$cmd/non_stubbed_${cmd}}" local source="$(type "$cmd" | tail -n +2)"
eval "$source" source="${source/$cmd/non_stubbed_${cmd}}"
eval "$source"
fi
fi fi
fi fi

View File

@@ -10,16 +10,16 @@ source "test-helper.sh"
my-name-is() { echo "My name is $@."; } my-name-is() { echo "My name is $@."; }
assert "my-name-is Edward Elric" "My name is Edward Elric." assert "my-name-is Edward Elric" "My name is Edward Elric."
stub "my-name-is" stub "my-name-is" stdout
assert "my-name-is Edward Elric" "my-name-is stub: Edward Elric" assert "my-name-is Edward Elric" "my-name-is stub: Edward Elric"
restore "my-name-is" restore "my-name-is" stdout
assert "my-name-is Edward Elric" "My name is Edward Elric." assert "my-name-is Edward Elric" "My name is Edward Elric."
# Stubbing and restoring a executable file. # Stubbing and restoring a executable file.
actual_uname="$(uname)" actual_uname="$(uname)"
stub "uname" stub "uname" stdout
assert "uname" "uname stub: " assert "uname" "uname stub: "
assert "uname -a" "uname stub: -a" assert "uname -a" "uname stub: -a"
@@ -43,5 +43,17 @@ restore "my-name-is"
assert "my-name-is Edward Elric" "My name is Edward Elric." assert "my-name-is Edward Elric" "My name is Edward Elric."
# Stubbing the same function multiple times and then restoring it.
my-name-is() { echo "My name is $@."; }
stub "my-name-is"
assert "my-name-is Edward Elric" ""
stub "my-name-is" stdout
assert "my-name-is Edward Elric" "my-name-is stub: Edward Elric"
restore "my-name-is"
assert "my-name-is Edward Elric" "My name is Edward Elric."
# End of tests. # End of tests.
assert_end "restore()" assert_end "restore()"

View File

@@ -9,22 +9,34 @@ source "test-helper.sh"
# Stubbing a bash function. # Stubbing a bash function.
my-name-is() { echo "My name is $@."; } my-name-is() { echo "My name is $@."; }
assert "my-name-is Edward Elric" "My name is Edward Elric." assert "my-name-is Edward Elric" "My name is Edward Elric."
stub "my-name-is" stub "my-name-is"
assert "my-name-is" ""
unset -f my-name-is
# Stubbing a executable file.
stub "uname"
assert "uname" ""
unset -f uname
# Redirect stub of bash function output to STDOUT.
my-name-is() { echo "My name is $@."; }
stub "my-name-is" STDOUT
assert "my-name-is" "my-name-is stub: " assert "my-name-is" "my-name-is stub: "
assert "my-name-is Edward" "my-name-is stub: Edward" assert "my-name-is Edward" "my-name-is stub: Edward"
assert "my-name-is Edward Elric" "my-name-is stub: Edward Elric" assert "my-name-is Edward Elric" "my-name-is stub: Edward Elric"
unset -f my-name-is unset -f my-name-is
# Stubbing a executable file. # Redirect stub of executable file output to STDOUT.
stub "uname" stub "uname" STDOUT
assert "uname" "uname stub: " assert "uname" "uname stub: "
assert "uname -h" "uname stub: -h" assert "uname -r" "uname stub: -r"
unset -f uname unset -f my-name-is
# Redirect stub output to STDERR. # Redirect stub of bash function output to STDERR.
my-name-is() { echo "My name is $@."; } my-name-is() { echo "My name is $@."; }
stub "my-name-is" STDERR stub "my-name-is" STDERR
assert "my-name-is Edward" "" assert "my-name-is Edward" ""
@@ -32,8 +44,26 @@ assert "my-name-is Edward 2>&1" "my-name-is stub: Edward"
unset -f my-name-is unset -f my-name-is
# Redirect stub of executable output to STDERR.
stub "uname" STDERR
assert "uname -r" ""
assert "uname 2>&1" "uname stub: "
assert "uname -r 2>&1" "uname stub: -r"
unset -f my-name-is
# Redirect stub of bash function output to /dev/null.
my-name-is() { echo "My name is $@."; }
stub "my-name-is" null
assert "my-name-is Edward" ""
assert "my-name-is Edward 2>&1" ""
unset -f my-name-is
# Stubbing something that doesn't exist. # Stubbing something that doesn't exist.
stub "cowabunga-dude" assert_raises "cowabunga-dude" 127
stub "cowabunga-dude" stdout
assert_raises "cowabunga-dude" 0
assert "cowabunga-dude yeah dude" "cowabunga-dude stub: yeah dude" assert "cowabunga-dude yeah dude" "cowabunga-dude stub: yeah dude"
unset -f cowabunga-dude unset -f cowabunga-dude