Files
TA-Deployment-Broker/tests/test-deployment-scripts.sh
T
2026-07-30 22:17:31 -05:00

128 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
TEST_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P)"
test_dir="$(mktemp -d)"
trap 'rm -rf "$test_dir"' EXIT
deployment="${test_dir}/deployment"
mock_bin="${test_dir}/bin"
mkdir -p "$deployment" "$mock_bin"
cp -R \
"${TEST_ROOT}/install.sh" \
"${TEST_ROOT}/manage.sh" \
"${TEST_ROOT}/compose.yaml" \
"${TEST_ROOT}/compose.http.yaml" \
"${TEST_ROOT}/compose.tls.yaml" \
"${TEST_ROOT}/compose.direct.yaml" \
"${TEST_ROOT}/deploy" \
"$deployment/"
mv "${deployment}/deploy/nginx/templates/http.conf.template" \
"${deployment}/deploy/nginx/templates/http.conf.template.saved"
mkdir "${deployment}/deploy/nginx/templates/http.conf.template"
if (
cd "$deployment"
printf '%s\n' \
'broker.test' \
'git.test' \
'8780' \
'8743' \
'' |
./install.sh >/dev/null 2>&1
); then
printf 'FAIL: installer accepted a template path that was a directory\n' >&2
exit 1
fi
rmdir "${deployment}/deploy/nginx/templates/http.conf.template"
mv "${deployment}/deploy/nginx/templates/http.conf.template.saved" \
"${deployment}/deploy/nginx/templates/http.conf.template"
cat >"${mock_bin}/docker" <<'MOCK'
#!/usr/bin/env bash
printf '%s\n' "$*" >>"$MOCK_DOCKER_LOG"
case "$*" in
"compose version" | "info" | "network inspect tapm-edge")
exit 0
;;
esac
exit 0
MOCK
chmod +x "${mock_bin}/docker"
export MOCK_DOCKER_LOG="${test_dir}/docker.log"
export PATH="${mock_bin}:${PATH}"
if grep -R '^[[:space:]]*keepalive_timeout[[:space:]]' \
"${TEST_ROOT}/deploy/nginx/templates/"*.template >/dev/null; then
printf 'FAIL: conf.d template duplicates nginx.conf keepalive_timeout\n' >&2
exit 1
fi
grep -F -- './config/letsencrypt/archive:/etc/archive:ro' \
"${TEST_ROOT}/compose.tls.yaml" >/dev/null || {
printf 'FAIL: TLS compose does not expose Certbot archive symlink targets\n' >&2
exit 1
}
printf '%s\n' \
'broker.test' \
'git.test' \
'8780' \
'8743' \
'' |
"${deployment}/install.sh" >/dev/null
assert_env() {
local expected="$1"
grep -Fx "$expected" "${deployment}/.env" >/dev/null || {
printf 'FAIL: missing environment line: %s\n' "$expected" >&2
exit 1
}
}
assert_env 'SSL_MODE=none'
assert_env 'TAPM_PUBLIC_URL=http://broker.test:8780'
assert_env 'TAPM_GITEA_URL=http://git.test:8780'
assert_env 'TAPM_GITEA_INTERNAL_URL=http://gitea:3000'
assert_env 'GITEA_PUBLIC_URL=http://git.test:8780/'
assert_env 'TAPM_DEFAULT_DURATION=7d'
grep -F -- '-f compose.yaml -f compose.http.yaml up -d gitea nginx' \
"$MOCK_DOCKER_LOG" >/dev/null || {
printf 'FAIL: HTTP bootstrap did not select compose.http.yaml\n' >&2
exit 1
}
if stat -c '%a' "${deployment}/.env" >/dev/null 2>&1; then
env_mode="$(stat -c '%a' "${deployment}/.env")"
else
env_mode="$(stat -f '%Lp' "${deployment}/.env")"
fi
[[ "$env_mode" == 600 ]] || {
printf 'FAIL: .env mode is %s, want 600\n' "$env_mode" >&2
exit 1
}
if "${deployment}/manage.sh" start >/dev/null 2>&1; then
printf 'FAIL: broker started without Git credentials\n' >&2
exit 1
fi
printf '%s\n' 'admin@example.test' |
"${deployment}/manage.sh" set-ssl letsencrypt >/dev/null
assert_env 'SSL_MODE=letsencrypt'
assert_env 'TAPM_PUBLIC_URL=https://broker.test'
assert_env 'GITEA_PUBLIC_URL=https://git.test/'
"${deployment}/manage.sh" set-ssl none >/dev/null
assert_env 'SSL_MODE=none'
assert_env 'TAPM_PUBLIC_URL=http://broker.test:8780'
"${deployment}/manage.sh" rotate-cookie-secret >/dev/null
rotated_secret="$(
sed -n 's/^TAPM_COOKIE_SECRET=//p' "${deployment}/.env"
)"
(( ${#rotated_secret} >= 32 )) || {
printf 'FAIL: cookie secret rotation produced a short value\n' >&2
exit 1
}
printf 'PASS: guided HTTP deployment and TLS transition\n'