-
-
Notifications
You must be signed in to change notification settings - Fork 165
/
Copy pathtest-helper.bash
153 lines (134 loc) · 3.01 KB
/
test-helper.bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/bash
# This is a series of helper functions copy/pasted from many other repos that use BATS for testing. The code isn't
# pretty, and doesn't follow many of our conventions, but it's useful.
flunk() {
{ if [ "$#" -eq 0 ]; then cat -
else echo "$@"
fi
} >&2
return 1
}
# Adapted from https://unix.stackexchange.com/a/230676/215969
unique_id() {
local -r length="$1"
head /dev/urandom | tr -dc A-Za-z0-9 | head -c "$length" ; echo ''
}
assert_success() {
if [ "$status" -ne 0 ]; then
flunk "command failed with exit status $status"
elif [ "$#" -gt 0 ]; then
assert_output "$1"
fi
}
assert_failure() {
if [ "$status" -eq 0 ]; then
flunk "expected failed exit status"
elif [ "$#" -gt 0 ]; then
assert_output "$1"
fi
}
assert_equal() {
if [ "$1" != "$2" ]; then
{ echo "expected: $1"
echo "actual: $2"
} | flunk
fi
}
assert_equal_regex() {
if [[ ! "$2" =~ $1 ]]; then
{ echo "expected: $1"
echo "actual: $2"
} | flunk
fi
}
assert_equal_json() {
local -r expected="$1"
local -r actual="$2"
# To avoid false negatives resulting from unordered keys, we do the equality check in python.
local -r checker_py=$(cat <<END_HEREDOC
import json
expected_raw = '''
$expected
'''
expected_json = json.loads(expected_raw)
actual_raw = '''
$actual
'''
actual_json = json.loads(actual_raw)
print(expected_json == actual_json)
END_HEREDOC
)
local result
result="$(python3 -c "$checker_py")"
if [[ "$result" != 'True' ]]; then
{ echo "expected: $expected"
echo "actual: $actual"
} | flunk
fi
}
assert_greater_than() {
if [ ! "$1" -gt "$2" ]; then
echo "expected $1 to be greater than $2" | flunk
fi
}
assert_output() {
local expected
if [ $# -eq 0 ]; then expected="$(cat -)"
else expected="$1"
fi
assert_equal "$expected" "$output"
}
assert_output_regex() {
local expected
if [ $# -eq 0 ]; then expected="$(cat -)"
else expected="$1"
fi
assert_equal_regex "$expected" "$output"
}
assert_output_json() {
local expected
if [ $# -eq 0 ]; then expected="$(cat -)"
else expected="$1"
fi
assert_equal_json "$expected" "$output"
}
assert_line() {
if [ "$1" -ge 0 ] 2>/dev/null; then
assert_equal "$2" "${lines[$1]}"
else
local line
for line in "${lines[@]}"; do
if [ "$line" = "$1" ]; then return 0; fi
done
flunk "expected line \`$1'"
fi
}
refute_line() {
if [ "$1" -ge 0 ] 2>/dev/null; then
local num_lines="${#lines[@]}"
if [ "$1" -lt "$num_lines" ]; then
flunk "output has $num_lines lines"
fi
else
local line
for line in "${lines[@]}"; do
if [ "$line" = "$1" ]; then
flunk "expected to not find line \`$line'"
fi
done
fi
}
assert() {
if ! "$@"; then
flunk "failed: $@"
fi
}
stub() {
[ -d "$BATS_TEST_DIRNAME/stub" ] || mkdir "$BATS_TEST_DIRNAME/stub"
#touch "$BATS_TEST_DIRNAME/stub/$1"
echo "$2" > "$BATS_TEST_DIRNAME/stub/$1"
chmod +x "$BATS_TEST_DIRNAME/stub/$1"
}
rm_stubs() {
rm -rf "$BATS_TEST_DIRNAME/stub"
}