]> git.corax.cc Git - toolbox/commitdiff
test/conf: Add test cases for the conf module
authorMatthias Kruk <m@m10k.eu>
Mon, 9 Jan 2023 04:14:34 +0000 (13:14 +0900)
committerMatthias Kruk <m@m10k.eu>
Mon, 9 Jan 2023 04:19:06 +0000 (13:19 +0900)
There are no test cases for the conf module, making it impossible to
verify if the module works as intended, and to make sure that commits
do not introduce regressions.

This commit adds a spec file with test cases for the conf module,
adding tests for basic properties of the module's public API.

test/conf_spec.sh [new file with mode: 0644]

diff --git a/test/conf_spec.sh b/test/conf_spec.sh
new file mode 100644 (file)
index 0000000..83bb578
--- /dev/null
@@ -0,0 +1,460 @@
+#!/bin/bash
+
+# conf_spec.sh - Test cases for the toolbox conf module
+# Copyright (C) 2023 Matthias Kruk
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+. toolbox.sh
+include "conf" "array"
+
+Describe "conf_get()"
+  It "prints the value of a valid configuration entry"
+    _test_conf_get_valid() {
+           local key
+           local value
+           local saved_value
+
+           key="unlikely_to_exist_$RANDOM"
+           value="some_$RANDOM_value_$RANDOM"
+
+           if ! conf_set "$key" "$value"; then
+                   return 1
+           fi
+
+           if ! saved_value=$(conf_get "$key"); then
+                   return 2
+           fi
+
+           if [[ "$value" != "$saved_value" ]]; then
+                   return 3
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_get_valid
+    The status should equal 0
+  End
+
+  It "defaults to the default configuration domain"
+    _test_conf_get_valid_default() {
+           local key
+           local value
+           local saved_value
+
+           key="unlikely_to_exist_$RANDOM"
+           value="some.$RANDOM.value.$RANDOM"
+
+           if ! conf_set "$key" "$value" "default"; then
+                   return 1
+           fi
+
+           if ! saved_value=$(conf_get "$key"); then
+                   return 2
+           fi
+
+           if [[ "$value" != "$saved_value" ]]; then
+                   return 3
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_get_valid_default
+    The status should equal 0
+  End
+
+  It "retrieves entries from user domains"
+    _test_conf_get_valid_user_domain() {
+           local key
+           local value
+           local domain
+           local saved_value
+
+           key="unlikely_to_exist_$RANDOM"
+           value="some.$RANDOM.value.$RANDOM"
+           domain="$RANDOM.domain"
+
+           if ! conf_set "$key" "$value" "$domain"; then
+                   return 1
+           fi
+
+           if ! saved_value=$(conf_get "$key" "$domain"); then
+                   return 2
+           fi
+
+           if [[ "$value" != "$saved_value" ]]; then
+                   return 3
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_get_valid_user_domain
+    The status should equal 0
+  End
+
+  It "returns an error if the requested entry does not exist"
+    When call conf_get "unlikely.to.exist.$RANDOM.$RANDOM"
+    The status should not equal 0
+  End
+
+  It "returns an error if the requested domain does not exist"
+    When call conf_get "dontcare" "unlikely.to.exist.$RANDOM.$RANDOM"
+    The status should not equal 0
+  End
+End
+
+Describe "conf_unset()"
+  It "removes an existing entry"
+    _test_conf_unset_remove_existing() {
+           local key
+
+           key="unlikely.to.exist.$RANDOM.$RANDOM"
+
+           if ! conf_set "$key" "$RANDOM"; then
+                   return 1
+           fi
+
+           # Retrieving an existing entry should work
+           if ! conf_get "$key" > /dev/null; then
+                   return 2
+           fi
+
+           if ! conf_unset "$key"; then
+                   return 3
+           fi
+
+           # This should fail now
+           if conf_get "$key" > /dev/null; then
+                   return 4
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_unset_remove_existing
+    The status should equal 0
+  End
+
+  It "defaults to the default configuration domain"
+    _test_conf_unset_default() {
+           local key
+
+           key="unlikely.to.exist.$RANDOM.$RANDOM"
+
+           if ! conf_set "$key" "$RANDOM" "default"; then
+                   return 1
+           fi
+
+           if ! conf_unset "$key"; then
+                   return 2
+           fi
+
+           if conf_get "$key" "default" > /dev/null; then
+                   return 3
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_unset_default
+    The status should equal 0
+  End
+
+  It "removes entries from user domains"
+    _test_conf_unset_user_domain() {
+           local key
+           local domain
+
+           key="unlikely.to.exist.$RANDOM.$RANDOM"
+           domain="unlikely.to.exist.$RANDOM.$RANDOM"
+
+           if ! conf_set "$key" "$RANDOM" "$domain"; then
+                   return 1
+           fi
+
+           if ! conf_unset "$key" "$domain"; then
+                   return 2
+           fi
+
+           if conf_get "$key" "$domain" > /dev/null; then
+                   return 3
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_unset_user_domain
+    The status should equal 0
+  End
+End
+
+Describe "conf_set()"
+  It "creates an entry"
+    _test_conf_set_create() {
+           local key
+           local value
+           local stored_value
+
+           key="unlikely_to_exist.$RANDOM"
+           value="$RANDOM"
+
+           if ! conf_set "$key" "$value"; then
+                   return 1
+           fi
+
+           if ! stored_value=$(conf_get "$key"); then
+                   return 2
+           fi
+
+           if [[ "$stored_value" != "$value" ]]; then
+                   return 3
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_set_create
+    The status should equal 0
+  End
+
+  It "defaults to the default configuration domain"
+    _test_conf_set_create_default() {
+           local key
+           local value
+           local stored_value
+
+           key="unlikely_to_exist.$RANDOM"
+           value="$RANDOM"
+
+           if ! conf_set "$key" "$value"; then
+                   return 1
+           fi
+
+           if ! stored_value=$(conf_get "$key" "default"); then
+                   return 2
+           fi
+
+           if [[ "$stored_value" != "$value" ]]; then
+                   return 3
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_set_create_default
+    The status should equal 0
+  End
+
+  It "creates entries in user domains"
+    _test_conf_set_create_user_domain() {
+           local key
+           local value
+           local domain
+           local stored_value
+
+           key="unlikely_to_exist.$RANDOM"
+           value="$RANDOM"
+           domain="unlikely_to_exist.$RANDOM"
+
+           if ! conf_set "$key" "$value" "$domain"; then
+                   return 1
+           fi
+
+           if ! stored_value=$(conf_get "$key" "$domain"); then
+                   return 2
+           fi
+
+           if [[ "$stored_value" != "$value" ]]; then
+                   return 3
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_set_create_user_domain
+    The status should equal 0
+  End
+End
+
+Describe "conf_get_domains()"
+  It "returns the names of all configuration domains"
+    _test_conf_get_domains() {
+           local before
+           local after
+           local new_domain
+           local -i lines_before
+           local -i lines_after
+
+           if ! readarray -t before < <(conf_get_domains); then
+                   return 1
+           fi
+
+           new_domain="likely_new_domain.$RANDOM"
+           if ! conf_set "dontcare" "dontcare" "$new_domain"; then
+                   return 2
+           fi
+
+           if ! readarray -t after < <(conf_get_domains); then
+                   return 3
+           fi
+
+           lines_before=$(array_to_lines "${before[@]}" | wc -l)
+           lines_after=$(array_to_lines "${after[@]}" | wc -l)
+
+           if (( lines_after - lines_before != 1 )); then
+                   return 4
+           fi
+
+           if ! array_contains "$new_domain" "${after[@]}"; then
+                   return 5
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_get_domains
+    The status should equal 0
+  End
+End
+
+Describe "conf_get_names()"
+  It "returns the names of all configuration entries"
+    _test_conf_get_names() {
+           local before
+           local after
+           local new_entry
+           local -i lines_before
+           local -i lines_after
+
+           if ! readarray -t before < <(conf_get_names); then
+                   return 1
+           fi
+
+           new_entry="unlikely_to_exist.$RANDOM.$RANDOM"
+
+           if ! conf_set "$new_entry" "$RANDOM"; then
+                   return 2
+           fi
+
+           if ! readarray -t after < <(conf_get_names); then
+                   return 3
+           fi
+
+           lines_before=$(array_to_lines "${before[@]}" | wc -l)
+           lines_after=$(array_to_lines "${after[@]}" | wc -l)
+
+           if (( lines_after - lines_before != 1 )); then
+                   return 1
+           fi
+
+           if ! array_contains "$new_entry" "${after[@]}"; then
+                   return 1
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_get_names
+    The status should equal 0
+  End
+
+  It "defaults to the default configuration domain"
+    _test_conf_get_names_default() {
+           local before
+           local after
+           local new_entry
+           local -i lines_before
+           local -i lines_after
+
+           if ! readarray -t before < <(conf_get_names); then
+                   return 1
+           fi
+
+           new_entry="unlikely_to_exist.$RANDOM.$RANDOM"
+
+           if ! conf_set "$new_entry" "$RANDOM" "default"; then
+                   return 2
+           fi
+
+           if ! readarray -t after < <(conf_get_names); then
+                   return 3
+           fi
+
+           lines_before=$(array_to_lines "${before[@]}" | wc -l)
+           lines_after=$(array_to_lines "${after[@]}" | wc -l)
+
+           if (( (lines_after - lines_before) != 1 )); then
+                   return 1
+           fi
+
+           if ! array_contains "$new_entry" "${after[@]}"; then
+                   return 1
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_get_names_default
+    The status should equal 0
+  End
+
+  It "lists entries in user domains"
+    _test_conf_get_names_user_domain() {
+           local before
+           local after
+           local new_entry
+           local domain
+           local -i lines_before
+           local -i lines_after
+
+           domain="unlikely_to_exist.$RANDOM.$RANDOM"
+           new_entry="unlikely_to_exist.$RANDOM.$RANDOM"
+
+           if ! conf_set "dontcare" "$RANDOM" "$domain"; then
+                   return 1
+           fi
+
+           if ! readarray -t before < <(conf_get_names "$domain"); then
+                   return 2
+           fi
+
+           if ! conf_set "$new_entry" "$RANDOM" "$domain"; then
+                   return 3
+           fi
+
+           if ! readarray -t after < <(conf_get_names "$domain"); then
+                   return 4
+           fi
+
+           lines_before=$(array_to_lines "${before[@]}" | wc -l)
+           lines_after=$(array_to_lines "${after[@]}" | wc -l)
+
+           if (( (lines_after - lines_before) != 1 )); then
+                   return 5
+           fi
+
+           if ! array_contains "$new_entry" "${after[@]}"; then
+                   return 6
+           fi
+
+           return 0
+    }
+
+    When call _test_conf_get_names_user_domain
+    The status should equal 0
+  End
+End