aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/test_config.bats
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-04-12 23:48:14 -0400
committerCraig Jennings <c@cjennings.net>2026-04-12 23:48:14 -0400
commit863ceeac8fdb10258a58d35bcee6874097fffc88 (patch)
tree37180f7a5393784beb0c8bbb35870558f0a02fb5 /tests/unit/test_config.bats
parent33ff55507895af2c29a20ec7e7e707d317cb8ef1 (diff)
downloadarchangel-863ceeac8fdb10258a58d35bcee6874097fffc88.tar.gz
archangel-863ceeac8fdb10258a58d35bcee6874097fffc88.zip
test: add bats unit tests for common.sh and config.sh
23 bats tests covering the pure logic in installer/lib/common.sh (command_exists, require_command, info/warn/error, enable_color, require_root, log) and installer/lib/config.sh (parse_args, load_config, validate_config, check_config). Makefile adds a 'bats' target; 'test' now runs lint + bats (VM integration tests remain under test-install).
Diffstat (limited to 'tests/unit/test_config.bats')
-rw-r--r--tests/unit/test_config.bats111
1 files changed, 111 insertions, 0 deletions
diff --git a/tests/unit/test_config.bats b/tests/unit/test_config.bats
new file mode 100644
index 0000000..c659fdc
--- /dev/null
+++ b/tests/unit/test_config.bats
@@ -0,0 +1,111 @@
+#!/usr/bin/env bats
+# Unit tests for installer/lib/config.sh
+
+setup() {
+ # shellcheck disable=SC1091
+ source "${BATS_TEST_DIRNAME}/../../installer/lib/common.sh"
+ # shellcheck disable=SC1091
+ source "${BATS_TEST_DIRNAME}/../../installer/lib/config.sh"
+}
+
+@test "parse_args stores --config-file path" {
+ parse_args --config-file /tmp/foo.conf
+ [ "$CONFIG_FILE" = "/tmp/foo.conf" ]
+}
+
+@test "parse_args rejects --config-file with no argument" {
+ run parse_args --config-file
+ [ "$status" -eq 1 ]
+ [[ "$output" == *"requires a path"* ]]
+}
+
+@test "parse_args rejects --config-file when value looks like a flag" {
+ run parse_args --config-file --help
+ [ "$status" -eq 1 ]
+ [[ "$output" == *"requires a path"* ]]
+}
+
+@test "parse_args --color enables color vars" {
+ [ -z "$RED" ]
+ parse_args --color
+ [ -n "$RED" ]
+}
+
+@test "parse_args --help shows usage and exits 0" {
+ run parse_args --help
+ [ "$status" -eq 0 ]
+ [[ "$output" == *"Usage:"* ]]
+ [[ "$output" == *"--config-file"* ]]
+}
+
+@test "parse_args rejects unknown option" {
+ run parse_args --not-a-real-flag
+ [ "$status" -eq 1 ]
+ [[ "$output" == *"Unknown option"* ]]
+}
+
+@test "load_config errors on missing file" {
+ run load_config /nonexistent/path/archangel.conf
+ [ "$status" -eq 1 ]
+ [[ "$output" == *"Config file not found"* ]]
+}
+
+@test "load_config parses a minimal config and sets UNATTENDED" {
+ local tmp
+ tmp=$(mktemp)
+ cat >"$tmp" <<'EOF'
+HOSTNAME=testhost
+TIMEZONE=UTC
+DISKS=/dev/sda,/dev/sdb
+ROOT_PASSWORD=secret
+EOF
+ load_config "$tmp"
+ [ "$HOSTNAME" = "testhost" ]
+ [ "$TIMEZONE" = "UTC" ]
+ [ "$ROOT_PASSWORD" = "secret" ]
+ [ "${SELECTED_DISKS[0]}" = "/dev/sda" ]
+ [ "${SELECTED_DISKS[1]}" = "/dev/sdb" ]
+ [ "$UNATTENDED" = "true" ]
+ rm -f "$tmp"
+}
+
+@test "load_config parses a single-disk config into 1-element array" {
+ local tmp
+ tmp=$(mktemp)
+ echo "DISKS=/dev/nvme0n1" >"$tmp"
+ load_config "$tmp"
+ [ "${#SELECTED_DISKS[@]}" -eq 1 ]
+ [ "${SELECTED_DISKS[0]}" = "/dev/nvme0n1" ]
+ rm -f "$tmp"
+}
+
+@test "validate_config fails and lists every missing required field" {
+ HOSTNAME=""
+ TIMEZONE=""
+ SELECTED_DISKS=()
+ ROOT_PASSWORD=""
+ run validate_config
+ [ "$status" -eq 1 ]
+ [[ "$output" == *"HOSTNAME not set"* ]]
+ [[ "$output" == *"TIMEZONE not set"* ]]
+ [[ "$output" == *"No disks selected"* ]]
+ [[ "$output" == *"ROOT_PASSWORD not set"* ]]
+ [[ "$output" == *"4 error"* ]]
+}
+
+@test "validate_config rejects an invalid timezone" {
+ HOSTNAME="h"
+ TIMEZONE="Not/A_Real_Zone_xyz"
+ SELECTED_DISKS=()
+ ROOT_PASSWORD="x"
+ run validate_config
+ [ "$status" -eq 1 ]
+ [[ "$output" == *"Invalid timezone"* ]]
+}
+
+@test "check_config is a no-op when CONFIG_FILE is unset" {
+ CONFIG_FILE=""
+ run check_config
+ [ "$status" -eq 0 ]
+ [ -z "$output" ]
+}