#!/bin/bash set -euo pipefail ROOT="$(dirname "$(realpath "$0")")/.." pass=0 fail=0 gomplate="${GOMPLATE_BIN:-gomplate}" require_gomplate() { if ! command -v "$gomplate" &>/dev/null; then echo "gomplate not found. Install it from https://github.com/hairyhenderson/gomplate" echo "or set GOMPLATE_BIN env var." exit 1 fi } render() { local tmpl=$1 envfile=$2 "$gomplate" \ --template t="$tmpl" \ --context "_=fmt:%s" \ --datasource "env=env://?$envfile" \ -f "$tmpl" 2>/dev/null } # Render by exporting env vars directly (avoids gomplate datasource quirks) render_via_env() { local tmpl=$1 envfile=$2 # shellcheck disable=2046 env $(xargs < "$envfile") "$gomplate" -f "$tmpl" 2>/dev/null } # --- entrypoint.sh.tmpl tests --- test_entrypoint_default() { local envfile=$1 local output output=$(render_via_env "entrypoint.sh.tmpl" "$envfile") # Should NOT have multisite config if echo "$output" | grep -q "WP_ALLOW_MULTISITE"; then echo " FAIL entrypoint default: unexpected WP_ALLOW_MULTISITE" return 1 fi # Should have uploads .htaccess guard if ! echo "$output" | grep -q "Prevent PHP execution in uploads"; then echo " FAIL entrypoint default: missing uploads htaccess" return 1 fi # Should use --from=root:root on chown if ! echo "$output" | grep -q "chown -R --from=root:root"; then echo " FAIL entrypoint default: missing --from=root:root on chown" return 1 fi # Should have wp-cli download if ! echo "$output" | grep -q "wp-cli.phar"; then echo " FAIL entrypoint default: missing wp-cli download" return 1 fi echo " PASS entrypoint default" } test_entrypoint_multisite_enable() { local envfile=$1 local output output=$(render_via_env "entrypoint.sh.tmpl" "$envfile") if ! echo "$output" | grep -q "WP_ALLOW_MULTISITE"; then echo " FAIL entrypoint multisite enable: missing WP_ALLOW_MULTISITE" return 1 fi echo " PASS entrypoint multisite enable" } test_entrypoint_multisite_subdomain() { local envfile=$1 local output output=$(render_via_env "entrypoint.sh.tmpl" "$envfile") if ! echo "$output" | grep -q "MULTISITE"; then echo " FAIL entrypoint multisite subdomain: missing MULTISITE" return 1 fi if ! echo "$output" | grep -q "SUBDOMAIN_INSTALL"; then echo " FAIL entrypoint multisite subdomain: missing SUBDOMAIN_INSTALL" return 1 fi if ! echo "$output" | grep -q "DOMAIN_CURRENT_SITE"; then echo " FAIL entrypoint multisite subdomain: missing DOMAIN_CURRENT_SITE" return 1 fi echo " PASS entrypoint multisite subdomain" } test_entrypoint_multisite_subfolder() { local envfile=$1 local output output=$(render_via_env "entrypoint.sh.tmpl" "$envfile") if ! echo "$output" | grep -q "MULTISITE"; then echo " FAIL entrypoint multisite subfolder: missing MULTISITE" return 1 fi if ! echo "$output" | grep -q "SUBDOMAIN_INSTALL"; then echo " FAIL entrypoint multisite subfolder: missing SUBDOMAIN_INSTALL" return 1 fi echo " PASS entrypoint multisite subfolder" } test_entrypoint_cors() { local envfile=$1 local output output=$(render_via_env "entrypoint.sh.tmpl" "$envfile") if ! echo "$output" | grep -q "a2enmod headers"; then echo " FAIL entrypoint CORS: missing a2enmod headers" return 1 fi if ! echo "$output" | grep -q "Access-Control-Allow-Origin"; then echo " FAIL entrypoint CORS: missing Access-Control-Allow-Origin" return 1 fi echo " PASS entrypoint CORS" } test_entrypoint_php_extensions() { local envfile=$1 local output output=$(render_via_env "entrypoint.sh.tmpl" "$envfile") if ! echo "$output" | grep -q "docker-php-ext-install calendar"; then echo " FAIL entrypoint PHP extensions: missing docker-php-ext-install calendar" return 1 fi echo " PASS entrypoint PHP extensions" } test_entrypoint_composer() { local envfile=$1 local output output=$(render_via_env "entrypoint.sh.tmpl" "$envfile") if ! echo "$output" | grep -q "getcomposer.org"; then echo " FAIL entrypoint composer: missing composer download" return 1 fi echo " PASS entrypoint composer" } # --- htaccess.tmpl tests --- test_htaccess_default() { local envfile=$1 local output output=$(render_via_env "htaccess.tmpl" "$envfile") if ! echo "$output" | grep -q "RewriteRule . /index.php"; then echo " FAIL htaccess default: missing standard rewrite rule" return 1 fi if echo "$output" | grep -q "WordPress Multisite"; then echo " FAIL htaccess default: unexpected multisite section" return 1 fi echo " PASS htaccess default" } test_htaccess_multisite() { local envfile=$1 mode=$2 local output output=$(render_via_env "htaccess.tmpl" "$envfile") if ! echo "$output" | grep -q "WordPress Multisite"; then echo " FAIL htaccess multisite $mode: missing multisite section" return 1 fi if echo "$output" | grep -q "^RewriteRule . /index.php"; then echo " FAIL htaccess multisite $mode: has non-multisite rewrite rule" return 1 fi echo " PASS htaccess multisite $mode" } # --- uploads.ini.tmpl tests --- test_uploads_default() { local output output=$(render_via_env "uploads.ini.tmpl" "tests/fixtures/default.env") if ! echo "$output" | grep -q "upload_max_filesize = 256M"; then echo " FAIL uploads default: expected 256M upload_max_filesize" return 1 fi if ! echo "$output" | grep -q "max_execution_time = 30"; then echo " FAIL uploads default: expected 30 max_execution_time" return 1 fi echo " PASS uploads default" } test_uploads_custom() { local envfile=$1 local output output=$(render_via_env "uploads.ini.tmpl" "$envfile") if ! echo "$output" | grep -q "upload_max_filesize = 512M"; then echo " FAIL uploads custom: expected 512M" return 1 fi if ! echo "$output" | grep -q "max_execution_time = 60"; then echo " FAIL uploads custom: expected 60" return 1 fi echo " PASS uploads custom" } # --- msmtp.conf.tmpl tests --- test_msmtp_default() { local output output=$(render_via_env "msmtp.conf.tmpl" "tests/fixtures/smtp-full.env") if ! echo "$output" | grep -q "host mail.example.com"; then echo " FAIL msmtp default: missing host" return 1 fi if ! echo "$output" | grep -q "from wordpress@example.com"; then echo " FAIL msmtp default: missing from" return 1 fi if ! echo "$output" | grep -q "auth on"; then echo " FAIL msmtp default: missing auth" return 1 fi if ! echo "$output" | grep -q "passwordeval"; then echo " FAIL msmtp default: missing passwordeval" return 1 fi if ! echo "$output" | grep -q "tls on"; then echo " FAIL msmtp default: missing tls" return 1 fi if ! echo "$output" | grep -q "set_from_header on"; then echo " FAIL msmtp default: missing set_from_header" return 1 fi echo " PASS msmtp full config" } # --- Run all template tests --- echo "=== Template Rendering Tests ===" cd "$ROOT" echo "--- entrypoint.sh.tmpl ---" require_gomplate test_entrypoint_default "tests/fixtures/default.env" && pass=$((pass+1)) || fail=$((fail+1)) test_entrypoint_multisite_enable "tests/fixtures/multisite-enable.env" && pass=$((pass+1)) || fail=$((fail+1)) test_entrypoint_multisite_subdomain "tests/fixtures/multisite-subdomain.env" && pass=$((pass+1)) || fail=$((fail+1)) test_entrypoint_multisite_subfolder "tests/fixtures/multisite-subfolder.env" && pass=$((pass+1)) || fail=$((fail+1)) test_entrypoint_cors "tests/fixtures/cors.env" && pass=$((pass+1)) || fail=$((fail+1)) test_entrypoint_php_extensions "tests/fixtures/php-extensions.env" && pass=$((pass+1)) || fail=$((fail+1)) test_entrypoint_composer "tests/fixtures/composer.env" && pass=$((pass+1)) || fail=$((fail+1)) echo "--- htaccess.tmpl ---" test_htaccess_default "tests/fixtures/default.env" && pass=$((pass+1)) || fail=$((fail+1)) test_htaccess_multisite "tests/fixtures/multisite-subfolder.env" "subfolder" && pass=$((pass+1)) || fail=$((fail+1)) test_htaccess_multisite "tests/fixtures/multisite-subdomain.env" "subdomain" && pass=$((pass+1)) || fail=$((fail+1)) echo "--- uploads.ini.tmpl ---" test_uploads_default && pass=$((pass+1)) || fail=$((fail+1)) test_uploads_custom "tests/fixtures/upload-sizes.env" && pass=$((pass+1)) || fail=$((fail+1)) echo "--- msmtp.conf.tmpl ---" test_msmtp_default && pass=$((pass+1)) || fail=$((fail+1)) echo "---" echo "Passed: $pass Failed: $fail" [ "$fail" -eq 0 ]