Skip to content

Commit c48d5bc

Browse files
committed
test: Correctly test traverse-get argument validation
1 parent 545ba94 commit c48d5bc

File tree

4 files changed

+86
-16
lines changed

4 files changed

+86
-16
lines changed

pkg/lib/traverse-get.sh

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,23 @@ bash_object.traverse-get() {
1212
local root_object_name="$2"
1313
local filter="$3"
1414

15+
# Ensure correct number of arguments have been passed
1516
if (( $# != 3)); then
16-
bash_object.util.die 'ERROR_INVALID_ARGS' "Incorrect arguments for subcommand 'get-$final_value_type'"
17+
bash_object.util.die 'ERROR_INVALID_ARGS' "Expected '3' arguments, but received '$#'"
18+
return
19+
fi
20+
21+
# Ensure parameters are not empty
22+
if [ -z "$final_value_type" ]; then
23+
bash_object.util.die 'ERROR_INVALID_ARGS' "Positional parameter '1' is empty. Please check passed parameters"
24+
return
25+
fi
26+
if [ -z "$root_object_name" ]; then
27+
bash_object.util.die 'ERROR_INVALID_ARGS' "Positional parameter '2' is empty. Please check passed parameters"
28+
return
29+
fi
30+
if [ -z "$filter" ]; then
31+
bash_object.util.die 'ERROR_INVALID_ARGS' "Positional parameter '3' is empty. Please check passed parameters"
1732
return
1833
fi
1934

pkg/lib/traverse-set.sh

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,31 @@ bash_object.traverse-set() {
77
fi
88

99
local flag_pass_by_what=''
10+
local -a args=()
1011

1112
for arg; do case "$arg" in
1213
--pass-by-ref) flag_pass_by_what='by-ref'; shift ;;
1314
--pass-by-value) flag_pass_by_what='by-value'; shift ;;
14-
--) break ;;
15+
--) shift; break ;;
16+
*) args+=("$arg") ;;
1517
esac done
1618

1719
if [ -z "$flag_pass_by_what" ]; then
1820
bash_object.util.die 'ERROR_INVALID_ARGS' "Must pass either the '--pass-by-ref' or '--pass-by-value' flag"
1921
return
2022
fi
2123

22-
local final_value_type="$1"
23-
local root_object_name="$2"
24-
local filter="$3"
25-
local final_value="$4"
24+
local final_value_type="${args[0]}"
25+
local root_object_name="${args[1]}"
26+
local filter="${args[2]}"
27+
local final_value="${args[3]}"
2628

27-
# We can only check the correct argument number under certain conditions
28-
if [ "$flag_pass_by_what" = 'by-ref' ] && (( $# != 4)); then
29-
bash_object.util.die 'ERROR_INVALID_ARGS' "Expected '4' arguments, but received '$#'"
29+
# Ensure correct number of arguments have been passed. Only do this
30+
# for circumstances in which we know the correct argument amount
31+
if [ "$flag_pass_by_what" = 'by-ref' ] && (( ${#args[@]} != 4)); then
32+
bash_object.util.die 'ERROR_INVALID_ARGS' "Expected '4' arguments, but received '${#args[@]}'"
3033
return
31-
elif [[ "$flag_pass_by_what" == 'by-value' && "$final_value_type" == 'string' ]] && (( $# != 4 )); then
34+
elif [[ "$flag_pass_by_what" == 'by-value' && "$final_value_type" == 'string' ]] && (( ${#args[@]} != 4 )); then
3235
bash_object.util.die 'ERROR_INVALID_ARGS' "Expected '4' arguments, but received '$#'"
3336
return
3437
fi
@@ -54,12 +57,6 @@ bash_object.traverse-set() {
5457
return
5558
fi
5659

57-
shift 4
58-
# Do not do 'shift 5', since 5 is greater than 4, the minimum amount of valid parameters
59-
if [ "$1" = -- ]; then
60-
shift
61-
fi
62-
6360
if [ -n "${VERIFY_BASH_OBJECT+x}" ]; then
6461
# Ensure the root object exists, and is an associative array
6562
local root_object_type=

tests/get-errors.bats

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!/usr/bin/env bats
2+
3+
# @file Contains tests that ensure the positional
4+
# parameters have been validated properly, when possible
5+
6+
load './util/init.sh'
7+
8+
@test "Error with \$# of 1" {
9+
run bash_object.traverse-get string
10+
11+
assert_failure
12+
assert_line -p "ERROR_INVALID_ARGS"
13+
assert_line -p ", but received '1'"
14+
}
15+
16+
@test "Error with \$# of 2" {
17+
run bash_object.traverse-get string 'OBJECT'
18+
19+
assert_failure
20+
assert_line -p "ERROR_INVALID_ARGS"
21+
assert_line -p ", but received '2'"
22+
}
23+
24+
@test "Error with \$# of 4" {
25+
run bash_object.traverse-get string 'OBJECT' '.obj' extraneous
26+
27+
assert_failure
28+
assert_line -p "ERROR_INVALID_ARGS"
29+
assert_line -p ", but received '4'"
30+
}
31+
32+
@test "Error on empty \$1" {
33+
run bash_object.traverse-get "" 'OBJECT' '.obj'
34+
35+
assert_failure
36+
assert_line -p "ERROR_INVALID_ARGS"
37+
assert_line -p "'1' is empty"
38+
}
39+
40+
@test "Error on empty \$2" {
41+
run bash_object.traverse-get string "" '.obj'
42+
43+
assert_failure
44+
assert_line -p "ERROR_INVALID_ARGS"
45+
assert_line -p "'2' is empty"
46+
}
47+
48+
@test "Error on empty \$3" {
49+
run bash_object.traverse-get string 'OBJECT' ""
50+
51+
assert_failure
52+
assert_line -p "ERROR_INVALID_ARGS"
53+
assert_line -p "'3' is empty"
54+
}

tests/set-errors.bats

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
#!/usr/bin/env bats
2+
3+
# @file Contains tests that ensure the positional
4+
# parameters have been validated properly, when possible
5+
26
load './util/init.sh'
37

48
@test "Error if neither '--pass-by-ref' nor '--pass-by-value' are passed" {

0 commit comments

Comments
 (0)