#!/usr/bin/env bash # End-to-end test: logs in, submits the post form, verifies entry is created on disk. # Requires GRAV_TEST_USER and GRAV_TEST_PASS (set in .env or environment). # Cleans up the test entry after the test. set -euo pipefail BASE_URL="${GRAV_BASE_URL:-http://localhost:8081}" USER="${GRAV_TEST_USER:-}" PASS="${GRAV_TEST_PASS:-}" TRACKER="user/pages/01.tracker" COOKIE_JAR="$(mktemp /tmp/grav-test-cookies.XXXXXX)" PASS_COUNT=0 FAIL_COUNT=0 TEST_SLUG="" cleanup() { rm -f "$COOKIE_JAR" if [ -n "$TEST_SLUG" ] && [ -d "$TRACKER/$TEST_SLUG" ]; then rm -rf "$TRACKER/$TEST_SLUG" echo " [cleanup] Removed test entry: $TEST_SLUG" fi } trap cleanup EXIT ok() { echo " ✓ $1"; PASS_COUNT=$((PASS_COUNT+1)); } fail() { echo " ✗ $1"; FAIL_COUNT=$((FAIL_COUNT+1)); } die() { echo ""; echo "FATAL: $1"; exit 1; } echo "" echo "Post form integration test — $BASE_URL" echo "────────────────────────────────────────" [ -n "$USER" ] || die "GRAV_TEST_USER not set. Add it to .env" [ -n "$PASS" ] || die "GRAV_TEST_PASS not set. Add it to .env" # ── Step 1: get login page + nonce ─────────────────────────────────────────── LOGIN_HTML=$(curl -sf -c "$COOKIE_JAR" -b "$COOKIE_JAR" "$BASE_URL/login") \ || die "Could not reach $BASE_URL/login" LOGIN_NONCE=$(echo "$LOGIN_HTML" | grep -o 'name="form-nonce" value="[^"]*"' | head -1 | sed 's/.*value="\([^"]*\)".*/\1/') [ -n "$LOGIN_NONCE" ] || die "Could not extract login form nonce — is the site running?" # ── Step 2: log in ─────────────────────────────────────────────────────────── LOGIN_STATUS=$(curl -sf -o /dev/null -w "%{http_code}" \ -c "$COOKIE_JAR" -b "$COOKIE_JAR" \ -L \ -d "username=${USER}&password=${PASS}&form-nonce=${LOGIN_NONCE}&task=login" \ "$BASE_URL/login") # After login, check we can access /post (302 → 200 means logged in) POST_STATUS=$(curl -sf -o /dev/null -w "%{http_code}" \ -c "$COOKIE_JAR" -b "$COOKIE_JAR" \ "$BASE_URL/post") [ "$POST_STATUS" = "200" ] && ok "Login succeeded and /post is accessible" \ || die "Login failed or /post returned $POST_STATUS — check GRAV_TEST_USER / GRAV_TEST_PASS" # ── Step 3: get post form + nonce ──────────────────────────────────────────── POST_HTML=$(curl -sf -c "$COOKIE_JAR" -b "$COOKIE_JAR" "$BASE_URL/post") \ || die "Could not fetch post form" POST_NONCE=$(echo "$POST_HTML" | grep -o 'name="form-nonce" value="[^"]*"' | head -1 | sed 's/.*value="\([^"]*\)".*/\1/') [ -n "$POST_NONCE" ] || die "Could not extract post form nonce" ok "Post form loaded and nonce extracted" # ── Step 4: submit test entry ──────────────────────────────────────────────── TEST_TITLE="Automated Test Entry" TEST_DATE=$(date "+%Y-%m-%d %H:%M") TEST_SLUG_EXPECTED=$(date "+%Y-%m-%d-%H%M")-automated-test-entry SUBMIT_BODY=$(curl -sf \ -c "$COOKIE_JAR" -b "$COOKIE_JAR" \ -d "data[title]=${TEST_TITLE}" \ -d "data[date]=${TEST_DATE}" \ -d "data[content]=This+is+an+automated+test+entry.+Safe+to+delete." \ -d "data[location_city]=Test+City" \ -d "data[location_country]=Test+Country" \ -d "form-nonce=${POST_NONCE}" \ -d "task=process" \ "$BASE_URL/post") ok "Form submitted" # ── Step 5: verify entry exists on disk ───────────────────────────────────── sleep 1 # give Grav a moment to write the file # Look for the entry — slug might have slight timestamp variation FOUND=$(find "$TRACKER" -name "entry.md" -newer "$TRACKER/2026-06-17.entry/entry.md" \ -not -path "*/2026-*" 2>/dev/null | head -1) # Also look for today's dated entries FOUND_TODAY=$(find "$TRACKER" -maxdepth 1 -type d -name "$(date '+%Y-%m-%d')*" 2>/dev/null | head -1) if [ -n "$FOUND_TODAY" ]; then TEST_SLUG=$(basename "$FOUND_TODAY") ok "Entry created on disk: $TEST_SLUG" # Verify it has an entry.md inside if [ -f "$TRACKER/$TEST_SLUG/entry.md" ]; then ok "entry.md exists inside the entry folder" else fail "Entry folder exists but entry.md is missing" fi # Verify the title is in the frontmatter if grep -q "$TEST_TITLE" "$TRACKER/$TEST_SLUG/entry.md"; then ok "Title appears in entry frontmatter" else fail "Title not found in entry.md — frontmatter may be malformed" fi else fail "No entry created on disk — form processing failed silently" echo " Expected a folder matching: $TRACKER/$(date '+%Y-%m-%d')-*/" fi # ── Result ─────────────────────────────────────────────────────────────────── echo "────────────────────────────────────────" echo " $PASS_COUNT passed, $FAIL_COUNT failed" echo "" [ $FAIL_COUNT -eq 0 ]