test: ListObjectVersions query tests

This commit is contained in:
Luke McCrone
2026-06-11 09:47:50 -03:00
parent f0dc14b1fa
commit 2fa0a2df89
12 changed files with 534 additions and 68 deletions
+20
View File
@@ -350,6 +350,26 @@ create_test_files_with_prefix() {
return 0
}
create_test_files_with_random_names() {
if ! check_param_count_v2 "number of files" 1 $#; then
return 1
fi
local file_name error file_names=()
for ((i=0;i<$1;i++)); do
if ! file_name=$(get_file_name 2>&1); then
log 2 "error getting file name: $file_name"
return 1
fi
if ! error=$(create_test_file "$file_name" 2>&1); then
log 2 "error creating test file: $error"
return 1
fi
file_names+=("$file_name")
done
echo "${file_names[*]}"
return 0
}
# Combined function to setup environment and create test files
# Params: filename1 [filename2 ...]
# Note: Uses $FILE_SIZE if set, otherwise defaults to 10 bytes. Requires $TEST_FILE_FOLDER.
@@ -68,7 +68,13 @@ check_for_empty_tagset() {
if ! check_param_count_v2 "data file" 1 $#; then
return 1
fi
if ! check_for_empty_element "$1" "Tagging" "TagSet"; then
if ! get_element "$1" "Tagging"; then
log 2 "error getting Tagging element"
return 1
fi
if ! check_for_empty_or_nonexistent_element "$1" "Tagging" "TagSet"; then
log 2 "error checking for empty XML element"
return 1
fi
@@ -115,7 +115,7 @@ check_object_versions_after_deletion() {
return 1
fi
local response
local response xml_data
if ! response=$(check_validity_and_or_parse_xml_data "$1" 2>&1); then
log 2 "error getting XML data: $response"
return 1
@@ -184,3 +184,92 @@ parse_latest_version_id() {
echo "$version_id"
return 0
}
check_page_with_two_different_keys() {
if ! check_param_count_ge_le "data file, version ID marker, version ID, next version ID marker (optional)" 3 4 $#; then
return 1
fi
if ! check_version_page_order "$1" "KeyMarker" "Key" "NextKeyMarker" "$2" "$3" "$4"; then
log 2 "error checking pages for different keys"
return 1
fi
return 0
}
parse_version_ids_with_same_key() {
if ! check_param_count_v2 "data file" 1 $#; then
return 1
fi
local response versions version_id
if ! response=$(get_element "$1" "ListVersionsResult" "Version" 2>&1); then
log 2 "error getting version: $response"
return 1
fi
log 5 "versions: $response"
mapfile -t versions <<< "$response"
for version in "${versions[@]}"; do
if ! response=$(get_element_text_inside_string "$version" "VersionId" 2>&1); then
log 2 "error getting VersionId element: $response"
return 1
fi
version_id="$response"
echo "$version_id"
done
return 0
}
check_page_order_of_version_ids_with_same_key() {
if ! check_param_count_ge_le "data file, version ID marker, version ID, next version ID marker (optional)" 3 4 $#; then
return 1
fi
if ! check_version_page_order "$1" "VersionIdMarker" "VersionId" "NextVersionIdMarker" "$2" "$3" "$4"; then
log 2 "error checking pages for same key, different version IDs"
return 1
fi
return 0
}
check_version_page_order() {
if ! check_param_count_ge_le "data file, previous marker name, value name, next marker name, prev value, value, next value" 6 7 $#; then
return 1
fi
if ! response=$(check_validity_and_or_parse_xml_data "$1" 2>&1); then
log 2 "error getting XML data: $response"
return 1
fi
xml_data="$response"
if ! check_xml_element "$xml_data" "$5" "ListVersionsResult" "$2"; then
log 2 "error checking KeyMarker element"
return 1
fi
if ! check_xml_element "$xml_data" "$6" "ListVersionsResult" "Version" "$3"; then
log 2 "error checking Key element"
return 1
fi
if [ $# -lt 7 ]; then
if ! check_for_empty_element "$xml_data" "ListVersionsResult" "$4"; then
log 2 "error checking for empty NextKeyMarker"
return 1
fi
else
if ! check_xml_element "$xml_data" "$7" "ListVersionsResult" "$4"; then
log 2 "error checking NextKeyMarker element"
return 1
fi
fi
return 0
}
list_object_versions_with_prefix_and_delimiter_check_results() {
if ! check_param_count_gt "bucket name, prefix, delimiter, expected common prefixes, --, expected keys" 6 $#; then
return 1
fi
if ! send_rest_go_command_callback "200" "check_prefixes_delimiters_and_keys" "-bucketName" "$1" "-query" "versions&delimiter=$3&prefix=$2" "--" "ListVersionsResult" "Version" "${@:2}"; then
log 2 "error sending command to list objects or receiving response"
return 1
fi
return 0
}
@@ -99,7 +99,7 @@ list_objects_with_prefix_and_delimiter_check_results() {
}
list_objects_check_key() {
if ! check_param_count_v2 "bucket name, key, encoding type" 3 $#; then
if ! check_param_count_v2 "bucket name, key, encoding type and additional query if desired" 3 $#; then
return 1
fi
query=()
+144
View File
@@ -0,0 +1,144 @@
#!/usr/bin/env bats
# Copyright 2026 Versity Software
# This file is licensed under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
objects_versions_invalid_encoding() {
if ! check_param_count_v2 "base query" 1 $#; then
return 1
fi
local response bucket_name file_name query=""
if [ "$1" != "" ]; then
query="$1&"
fi
if ! response=$(setup_bucket_and_file_v3 "$BUCKET_ONE_NAME" 2>&1); then
log 2 "error setting up bucket and file: $response"
return 1
fi
read -r bucket_name file_name <<< "$response"
if ! response=$(send_rest_go_command "200" "-method" PUT "-bucketName" "$bucket_name" "-payloadFile" "$TEST_FILE_FOLDER/$file_name" "-objectKey" "$file_name" 2>&1); then
log 2 "error sending put object command: $response"
return 1
fi
local bad_encoding="jdfkllaj"
if ! response=$(send_rest_go_command_expect_error_with_arg_name_value "400" "InvalidArgument" "Invalid Encoding Method specified in Request" \
"encoding-type" "$bad_encoding" "-bucketName" "$bucket_name" "-query" "${query}encoding-type=$bad_encoding" 2>&1); then
log 2 "error checking for invalid encoding"
return 1
fi
return 0
}
objects_versions_encoding_success() {
if ! check_param_count_v2 "base query, base element, object element" 3 $#; then
return 1
fi
local response bucket_name file_name expected_encoding payload_file
if ! response=$(setup_bucket_v3 "$BUCKET_ONE_NAME" 2>&1); then
log 2 "error setting up bucket: $response"
return 1
fi
bucket_name="$response"
file_name="a+ b.txt"
expected_encoding="a%2B+b.txt"
if ! create_test_file "$file_name"; then
log 2 "error creating test file"
return 1
fi
payload_file="$TEST_FILE_FOLDER/$file_name"
if ! send_rest_go_command "200" "-method" "PUT" "-payloadFile" "$payload_file" "-bucketName" "$bucket_name" "-objectKey" "$file_name"; then
log 2 "error sending PutObject command"
return 1
fi
if ! list_objects_check_key "$bucket_name" "$expected_encoding" "url" "$1" "$2" "$3"; then
log 2 "error checking object matches expected encoding"
return 1
fi
if ! list_objects_check_key "$bucket_name" "$file_name" "" "$1" "$2" "$3"; then
log 2 "error checking that object isn't encoded without url param"
return 1
fi
return 0
}
list_objects_check_key() {
if ! check_param_count_v2 "bucket name, key, encoding type, additional query, main element, object element" 6 $#; then
return 1
fi
local query_params=() query
if [ "$3" != "" ]; then
query="encoding-type=$3"
if [ "$4" != "" ]; then
query+="&$4"
fi
elif [ "$4" != "" ]; then
query="$4"
fi
if [ "$query" != "" ]; then
query_params=("-query" "$query")
fi
if ! send_rest_go_command_callback "200" "check_if_key_exists" "-bucketName" "$1" "${query_params[@]}" "--" "$2" "$5" "$6"; then
log 2 "error sending rest command"
return 1
fi
return 0
}
check_if_key_exists() {
if ! check_param_count_v2 "data file, key, main element, object element" 4 $#; then
return 1
fi
if ! check_if_element_exists "$1" "$2" "$3" "$4" "Key"; then
log 2 "error checking if Key '$2' exists"
return 1
fi
return 0
}
setup_delimiter_test() {
local response bucket_name file_names=() prefix
if ! response=$(setup_bucket_v3 "$BUCKET_ONE_NAME" 2>&1); then
log 2 "error setting up bucket: $response"
return 1
fi
bucket_name="$response"
file_names=("a-b-1.txt" "a-b-2.txt" "a-b/c-1.txt" "a-b/c-2.txt" "a-b/d.txt" "a/c.txt")
prefix="a-"
if ! create_test_files_and_folders "${file_names[@]}"; then
log 2 "error creating test files and folders"
return 1
fi
for file_name in "${file_names[@]}"; do
if ! put_object "rest" "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"; then
log 2 "error putting object '$file_name'"
return 1
fi
done
echo "$bucket_name"
echo "$prefix"
return 0
}
@@ -100,6 +100,35 @@ setup_bucket_and_add_file_v3() {
return 0
}
setup_bucket_and_add_files_v3() {
if ! check_param_count_v2 "bucket prefix, number of files" 2 $#; then
return 1
fi
local response bucket_name files
if ! response=$(setup_bucket_v3 "$1" 2>&1); then
log 2 "error setting up bucket: $response"
return 1
fi
bucket_name="$response"
if ! response=$(create_test_files_with_random_names "$2" 2>&1); then
log 2 "error creating test files"
return 1
fi
read -r -a files <<< "$response"
for file in "${files[@]}"; do
if ! put_object_rest "$TEST_FILE_FOLDER/$file" "$bucket_name" "$file"; then
log 2 "error putting object '$file'"
return 1
fi
done
echo "$bucket_name ${files[*]}"
return 0
}
send_openssl_go_command_chunked_no_content_length() {
if ! check_param_count_gt "bucket name, key" 2 $#; then
return 1
+47 -13
View File
@@ -55,7 +55,6 @@ build_xpath_string_for_element() {
xpath+='/'
fi
done
log 5 "xpath: $xpath"
echo "$xpath"
return 0
}
@@ -79,24 +78,28 @@ get_inner_xpath_string_for_element() {
return 0
}
check_for_empty_element() {
check_for_empty_or_nonexistent_element() {
if ! check_param_count_gt "data file, XML tree" 2 $#; then
return 1
fi
local response
# shellcheck disable=SC2068
if ! xpath=$(build_xpath_string_for_element ${@:2} 2>&1); then
if ! xpath=$(build_xpath_string_for_element "${@:2}" 2>&1); then
log 2 "error building XPath search string: $xpath"
return 1
return 2
fi
if ! get_xml_data "$1" "$1.xml"; then
log 2 "error getting XML data"
return 1
return 2
fi
if grep -q '<[^/ ?>].*>' "$1.xml"; then
if xmllint --xpath "${xpath}[not(normalize-space())]" "$1.xml" 1>/dev/null 2>&1; then
if ! response=$(get_element "$1.xml" "${@:2}" 2>&1); then
if [[ "$response" == *"XPath set is empty"* ]]; then
return 0
fi
log 2 "error checking for empty or nonexistent param: $response"
return 2
elif xmllint --xpath "${xpath}[not(normalize-space())]" "$1.xml" 1>/dev/null 2>&1; then
return 0
fi
return 1
}
@@ -115,6 +118,7 @@ get_element() {
return 1
fi
echo "$xml_val"
return 0
}
get_element_text() {
@@ -144,15 +148,15 @@ get_element_text() {
return 0
fi
echo "$xml_val"
return 0
}
check_xml_element() {
if [ $# -lt 3 ]; then
log 2 "'check_xml_element' requires data source, expected value, XML tree"
if ! check_param_count_gt "data source, expected value, XML tree" 3 $#; then
return 1
fi
if ! xml_val=$(get_element_text "$1" "${@:3}"); then
log 2 "error getting element text"
if ! xml_val=$(get_element_text "$1" "${@:3}" 2>&1); then
log 2 "error getting element text: $xml_val"
return 1
fi
log 5 "expect: '$2', actual: '$xml_val'"
@@ -179,13 +183,43 @@ check_xml_element_inside_string() {
return 0
}
get_element_text_inside_string() {
if ! check_param_count_gt "string, XML tree" 2 $#; then
return 1
fi
local response xpath result
if ! response=$(build_xpath_string_for_element "${@:2}" 2>&1); then
log 2 "error building XPath search string: $response"
return 1
fi
xpath="$response"
result=$(echo "$1" | xmllint --xpath "boolean($xpath)" - 2>&1)
if [ "$result" == "false" ]; then
log 2 "element matching '$xpath' doesn't exist"
return 1
fi
if ! response=$(echo "$1" | xmllint --xpath "${xpath}/text()" - 2>&1); then
if [[ "$response" == *"XPath set is empty"* ]]; then
echo ""
return 0
fi
log 2 "error getting element text: $response"
return 1
fi
echo "$response"
return 0
}
check_xml_element_contains() {
if [ $# -lt 3 ]; then
log 2 "'check_xml_element_contains' requires data source, expected value, XML tree"
return 1
fi
if [ "$2" == "" ]; then
if ! check_for_empty_element "$1" "${@:3}"; then
if ! check_xml_element "$1" "" "${@:3}"; then
log 2 "Message value not empty"
return 1
fi
-4
View File
@@ -83,10 +83,6 @@ setup() {
return 1
fi
if [ -n "$TEST_LOG_FILE" ]; then
printf "\n%s\n\n" "**** $TEST_ID ****" >> "$TEST_LOG_FILE.$TEST_ID"
fi
if [ "$RUN_USERS" == "true" ] && [ "$DIRECT" != "true" ] && [ "$CREATE_STATIC_USERS_IF_NONEXISTENT" == "true" ]; then
if ! static_user_versitygw_setup; then
log 2 "error setting up static versitygw users"
+1 -1
View File
@@ -171,7 +171,7 @@ source ./tests/setup.sh
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run send_rest_go_command_callback "200" "check_for_empty_element" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
run send_rest_go_command_callback "200" "check_for_empty_or_nonexistent_element" "-bucketName" "$bucket_name" "-commandType" "deleteObjects" \
"-contentMD5" "-objectsToDelete" "key=${file_name}" "-deleteObjectsQuietMode" "--" "DeleteResult"
assert_success
+104
View File
@@ -20,6 +20,7 @@ load ./bats-assert/load
source ./tests/setup.sh
source ./tests/drivers/create_bucket/create_bucket_rest.sh
source ./tests/drivers/list_object_versions/list_object_versions_rest.sh
source ./tests/drivers/objects_and_versions.sh
source ./tests/util/util_time.sh
# tags: curl,ListObjectVersions,versions,invalid-query
@@ -67,3 +68,106 @@ source ./tests/util/util_time.sh
run list_object_versions_before_and_after_retention_deletion "$bucket_name" "$test_file"
assert_success
}
@test "ListObjectVersions - invalid encoding" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2169"
fi
run objects_versions_invalid_encoding "versions"
assert_success
}
@test "ListObjectVersions - encoding success" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2169"
fi
run objects_versions_encoding_success "versions" "ListVersionsResult" "Version"
assert_success
}
@test "ListObjectVersions - version ID marker w/o key marker" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2174"
fi
run setup_bucket_and_add_files_v3 "$BUCKET_ONE_NAME" "2"
assert_success
read -r bucket_name file_one file_two <<< "$output"
run send_rest_go_command_expect_error_with_arg_name_value "400" "InvalidArgument" "A version-id marker cannot be specified without a key marker" \
"version-id-marker" "null" "-bucketName" "$bucket_name" "-query" "versions&max-keys=1&version-id-marker=null"
assert_success
}
@test "ListObjectVersions - key-marker set to first key returns proper values" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2178"
fi
run setup_bucket_and_add_files_v3 "$BUCKET_ONE_NAME" "2"
assert_success
read -r bucket_name file_one file_two <<< "$output"
local first_file second_file
if [[ "$file_one" < "$file_two" ]]; then
first_file="$file_one"
second_file="$file_two"
else
first_file="$file_two"
second_file="$file_one"
fi
run send_rest_go_command_callback "200" "check_page_with_two_different_keys" \
"-bucketName" "$bucket_name" "-query" "versions&max-keys=1" "--" "" "$first_file" "$first_file"
assert_success
run send_rest_go_command_callback "200" "check_page_with_two_different_keys" \
"-bucketName" "$bucket_name" "-query" "versions&max-keys=1&key-marker=$first_file" "--" "$first_file" "$second_file"
assert_success
}
@test "ListObjectVersions - same key, different versions" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/2178"
fi
run setup_bucket_and_add_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run put_bucket_versioning_rest "$bucket_name" "Enabled"
assert_success
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run put_object_rest "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
run send_rest_go_command_callback "200" "parse_version_ids_with_same_key" \
"-bucketName" "$bucket_name" "-query" "versions"
assert_success
mapfile -t version_ids <<< "$output"
run send_rest_go_command_callback "200" "check_page_order_of_version_ids_with_same_key" \
"-bucketName" "$bucket_name" "-query" "versions&max-keys=1" "--" "" "${version_ids[0]}" "${version_ids[0]}"
assert_success
run send_rest_go_command_callback "200" "check_page_order_of_version_ids_with_same_key" \
"-bucketName" "$bucket_name" "-query" "versions&max-keys=1&key-marker=$file_name&version-id-marker=${version_ids[0]}" \
"--" "${version_ids[0]}" "${version_ids[1]}" "${version_ids[1]}"
assert_success
run send_rest_go_command_callback "200" "check_page_order_of_version_ids_with_same_key" \
"-bucketName" "$bucket_name" "-query" "versions&max-keys=1&key-marker=$file_name&version-id-marker=${version_ids[1]}" \
"--" "${version_ids[1]}" "${version_ids[2]}"
assert_success
}
@test "REST - ListObjectVersions - prefix/delimiter" {
run setup_delimiter_test
assert_success
mapfile -t test_info <<< "$output"
bucket_name="${test_info[0]}"
prefix="${test_info[1]}"
run list_object_versions_with_prefix_and_delimiter_check_results "$bucket_name" "$prefix" "/" "a-b/" "--" "a-b-1.txt" "a-b-2.txt"
assert_success
}
+9 -47
View File
@@ -22,6 +22,7 @@ source ./tests/drivers/create_bucket/create_bucket_rest.sh
source ./tests/drivers/list_objects/list_objects.sh
source ./tests/drivers/list_objects/list_objects_rest.sh
source ./tests/drivers/list_objects/list_objects_s3api.sh
source ./tests/drivers/objects_and_versions.sh
# tags: curl,ListObjects,minimal-request
@test "test_rest_list_objects" {
@@ -169,18 +170,9 @@ source ./tests/drivers/list_objects/list_objects_s3api.sh
# tags: curl,ListObjects,encoding-type,invalid-query
@test "REST - ListObjects - invalid encoding" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1984"
skip "https://github.com/versity/versitygw/issues/1985"
fi
run setup_bucket_and_file_v3 "$BUCKET_ONE_NAME"
assert_success
read -r bucket_name file_name <<< "$output"
run send_rest_go_command "200" "-method" PUT "-bucketName" "$bucket_name" "-payloadFile" "$TEST_FILE_FOLDER/$file_name" "-objectKey" "$file_name"
assert_success
local bad_encoding="jdfkllaj"
run send_rest_go_command_expect_error_with_arg_name_value "400" "InvalidArgument" "Invalid Encoding Method specified in Request" \
"encoding-type" "$bad_encoding" "-bucketName" "$bucket_name" "-query" "encoding-type=$bad_encoding"
run objects_versions_invalid_encoding ""
assert_success
}
@@ -189,23 +181,8 @@ source ./tests/drivers/list_objects/list_objects_s3api.sh
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1985"
fi
run setup_bucket_v3 "$BUCKET_ONE_NAME"
assert_success
bucket_name=$output
file_name="a+ b.txt"
expected_encoding="a%2B+b.txt"
run create_test_file "$file_name"
assert_success
payload_file="$TEST_FILE_FOLDER/$file_name"
run send_rest_go_command "200" "-method" "PUT" "-payloadFile" "$payload_file" "-bucketName" "$bucket_name" "-objectKey" "$file_name"
assert_success
run list_objects_check_key "$bucket_name" "$expected_encoding" "url"
assert_success
run list_objects_check_key "$bucket_name" "$file_name" ""
run objects_versions_encoding_success "" "ListBucketResult" "Contents"
assert_success
}
@@ -361,27 +338,12 @@ source ./tests/drivers/list_objects/list_objects_s3api.sh
}
list_objects_delimiter() {
run assert_param_count "ListObjects version" 1 $#
run setup_delimiter_test
assert_success
mapfile -t test_info <<< "$output"
bucket_name="${test_info[0]}"
prefix="${test_info[1]}"
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
# shellcheck disable=SC2031
local bucket_name="$output"
file_names=("a-b-1.txt" "a-b-2.txt" "a-b/c-1.txt" "a-b/c-2.txt" "a-b/d.txt" "a/c.txt")
local prefix="a-"
run create_test_files_and_folders "${file_names[@]}"
assert_success
run setup_bucket_v2 "$bucket_name"
assert_success
for file_name in "${file_names[@]}"; do
run put_object "rest" "$TEST_FILE_FOLDER/$file_name" "$bucket_name" "$file_name"
assert_success
done
run list_objects_with_prefix_and_delimiter_check_results "$bucket_name" "2" "$prefix" "/" "a-b/" "--" "a-b-1.txt" "a-b-2.txt"
run list_objects_with_prefix_and_delimiter_check_results "$bucket_name" "$1" "$prefix" "/" "a-b/" "--" "a-b-1.txt" "a-b-2.txt"
assert_success
}
+82
View File
@@ -92,3 +92,85 @@ source ./tests/setup_unit.sh
run compare_data_with_xml_file "$TEST_FILE_FOLDER/$input" "<?xml version=\"1.0\"?>\n<Value>AgainOK</Value>"
assert_success
}
@test "check_for_empty_or_nonexistent_element" {
run get_file_names 6
assert_success
read -r file_one file_two file_three file_four file_five <<< "$output"
printf '<Outer><Inner></Inner></Outer>' > "$TEST_FILE_FOLDER/$file_one"
printf '<Outer><Inner/></Outer>' > "$TEST_FILE_FOLDER/$file_two"
printf '<Outer><Inner>a</Inner></Outer>' > "$TEST_FILE_FOLDER/$file_three"
printf '<Outer></Outer>' > "$TEST_FILE_FOLDER/$file_four"
printf '<Invalid XML><Inner></Inner></Invalid XML>' > "$TEST_FILE_FOLDER/$file_five"
run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_one" "Outer" "Inner"
assert_success
run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_two" "Outer" "Inner"
assert_success
run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_three" "Outer" "Inner"
assert_failure 1
run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_four" "Outer" "Inner"
assert_success
run check_for_empty_or_nonexistent_element "$TEST_FILE_FOLDER/$file_five" "Invalid XML" "Inner"
assert_failure 2
}
@test "get_element_text_inside_string" {
local string_one='<Outer><Inner>text</Inner></Outer>'
local string_two='<Outer><Inner></Inner></Outer>'
local string_three='<Outer><Inner/></Outer>'
local string_four='<Outer></Outer>'
run get_element_text_inside_string "$string_one" "Inner"
assert_success
assert_output "text"
run get_element_text_inside_string "$string_two" "Inner"
assert_success
assert_output ""
run get_element_text_inside_string "$string_three" "Inner"
assert_success
assert_output ""
run get_element_text_inside_string "$string_four" "Inner"
assert_failure
assert_output -p "element matching"
}
@test "check_xml_element" {
run get_file_names 4
assert_success
read -r file_one file_two file_three file_four <<< "$output"
printf '<Outer><Inner>text</Inner></Outer>' > "$TEST_FILE_FOLDER/$file_one"
printf '<Outer><Inner/></Outer>' > "$TEST_FILE_FOLDER/$file_two"
printf '<Outer><Inner></Inner></Outer>' > "$TEST_FILE_FOLDER/$file_three"
printf '<Outer></Outer>' > "$TEST_FILE_FOLDER/$file_four"
run check_xml_element "$TEST_FILE_FOLDER/$file_one" "tex" "Outer" "Inner"
assert_failure
assert_output -p "expected 'tex', actual 'text'"
run check_xml_element "$TEST_FILE_FOLDER/$file_one" "text" "Outer" "Inner"
assert_success
run check_xml_element "$TEST_FILE_FOLDER/$file_two" "a" "Outer" "Inner"
assert_failure
assert_output -p "expected 'a', actual ''"
run check_xml_element "$TEST_FILE_FOLDER/$file_two" "" "Outer" "Inner"
assert_success
run check_xml_element "$TEST_FILE_FOLDER/$file_three" "" "Outer" "Inner"
assert_success
run check_xml_element "$TEST_FILE_FOLDER/$file_four" "" "Outer" "Inner"
assert_failure
assert_output -p "element matching"
}