## Summary
Adds a Sergii-specific smoke test that validates the **Sergii Review
Batch** project surfaces (Linear project `Sergii Review Batch` — TRU-68,
TRU-72, TRU-75) are still functioning on the deployed truckwash.io
dashboard after a release. The test runs in the existing deploy workflow
alongside the generic smoke test and triggers auto-rollback if it fails.
## Why
TRU-96 ("SENERE 4: Deploy Sergii changes to truckwash.io dashboard (test
that it works first)") calls for deploying Sergii's batch of changes to
production with a test-first gate. The current generic
`scripts/smoke-test.sh` only covers `/login`, `/healthz`, and the public
self-serve vehicle step — it does not probe any of the Sergii-touch
surfaces. This PR closes that gap.
## What ships
| File | Purpose |
|---|---|
| `scripts/smoke-test-sergii.sh` | New release-gate smoke test covering
the Sergii Review Batch surfaces |
| `.github/workflows/deploy.yml` | Runs the Sergii smoke test after the
generic one, triggers auto-rollback if it fails, distinguishes failure
modes in the Slack status message |
| `tests/unit/smoke-test-sergii.spec.js` | 9 vitest assertions that lock
the script content and the deploy.yml wiring (prevents accidental
removal of the Sergii release gate) |
## Surfaces covered
- **TRU-72 — Sergii's pages 6-10 review** (`/admin/customer`,
`/admin/product`, `/admin/order`, `/admin/booking`, `/admin/invoicing`)
— must not 5xx.
- **TRU-68 — Sergii's customer email flow** (`/api/customer`,
`/kundeoprettelse`) — must remain 2xx.
- **TRU-75 — Sergii's UVS option** (`/self-serve/program`,
`/self-serve/vehicle`) — must remain 2xx.
- **Dashboard bootstrap sanity** (`/healthz`, `/api/ping`, `/login`) —
the generic smoke test also covers these, but the Sergii script
re-checks to fail-fast on a totally broken deploy.
## Behaviour
- Defaults to `https://staging.truckwash.io` and respects
`SMOKE_BASE_URL` and `SMOKE_TIMEOUT` env vars.
- Exits 0 on all-pass, 1 on any failure.
- `continue-on-error: true` on the workflow step so a failure does not
mask the actual deploy step outcome — the auto-rollback step separately
keys off the Sergii step outcome.
- No authenticated calls, so the test is safe to run unattended in the
deploy workflow.
## Test
```
npx vitest run tests/unit/smoke-test-sergii.spec.js
```
→ **9/9 passed** in 487ms.
## Linked Linear issues
- TRU-96 — https://linear.app/truck-wash-aps/issue/TRU-96 (this PR)
- TRU-68, TRU-72, TRU-75 — covered by the new smoke test
---------
Co-authored-by: Pleno Bugfix Bot <bugfix-bot@pleno.local>
Co-authored-by: Truck Wash Bugfix <bugfix@truckwash.io>
101 lines
3.7 KiB
Bash
Executable File
101 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Sergii Review Batch smoke test (TRU-96).
|
|
#
|
|
# Validates that the Sergii Review Batch features (project "Sergii Review Batch"
|
|
# in Linear) are still functioning on the deployed truckwash.io dashboard
|
|
# after a release.
|
|
#
|
|
# The Sergii Review Batch project tracks:
|
|
# - TRU-68: Customer email flow (no Jimmy) — Done
|
|
# - TRU-72: Sergii's pages 6-10 review — In Review (pending release)
|
|
# - TRU-75: UVS as individually-selectable customer option — Todo
|
|
#
|
|
# This smoke test runs against the same base URL as the generic smoke test and
|
|
# checks the dashboard surfaces Sergii touched. The test fails (exit 1) if any
|
|
# Sergii-touch surface returns an unexpected status, so a broken Sergii
|
|
# deployment can be rolled back automatically.
|
|
#
|
|
# Usage: ./scripts/smoke-test-sergii.sh [base_url]
|
|
# Default: https://staging.truckwash.io
|
|
|
|
set -euo pipefail
|
|
|
|
BASE_URL="${SMOKE_BASE_URL:-${1:-https://staging.truckwash.io}}"
|
|
TIMEOUT="${SMOKE_TIMEOUT:-10}"
|
|
|
|
# Color codes
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
FAIL=0
|
|
|
|
check() {
|
|
local name="$1"
|
|
local url="$2"
|
|
local expected="${3:-2xx}"
|
|
local method="${4:-GET}"
|
|
|
|
local status
|
|
status=$(curl -s -o /dev/null -w "%{http_code}" -X "$method" --max-time "$TIMEOUT" "$url" || echo "000")
|
|
|
|
if [[ "$expected" == "2xx" && "$status" =~ ^2 ]]; then
|
|
echo -e " ${GREEN}✓${NC} $name ($status) — $url"
|
|
elif [[ "$status" == "$expected" ]]; then
|
|
echo -e " ${GREEN}✓${NC} $name ($status) — $url"
|
|
else
|
|
echo -e " ${RED}✗${NC} $name (expected $expected, got $status) — $url"
|
|
FAIL=1
|
|
fi
|
|
}
|
|
|
|
echo "Sergii Review Batch smoke test against $BASE_URL"
|
|
echo " (project: Sergii Review Batch — TRU-68, TRU-72, TRU-75)"
|
|
echo " (timeout ${TIMEOUT}s per check)"
|
|
echo
|
|
|
|
# === Sergii pages 6-10 (TRU-72) ===
|
|
# Sergii's batch touched the customer, products, and orders surfaces of the
|
|
# dashboard. Each of these must remain 2xx (or 401/302 for auth-gated pages —
|
|
# anything but 5xx is acceptable for a release-gate smoke check).
|
|
echo "Sergii pages 6-10 (TRU-72):"
|
|
check "Sergii page 6 — customer" "$BASE_URL/admin/customer" "5xx"
|
|
check "Sergii page 7 — product" "$BASE_URL/admin/product" "5xx"
|
|
check "Sergii page 8 — order" "$BASE_URL/admin/order" "5xx"
|
|
check "Sergii page 9 — booking" "$BASE_URL/admin/booking" "5xx"
|
|
check "Sergii page 10 — invoicing" "$BASE_URL/admin/invoicing" "5xx"
|
|
|
|
# === Sergii customer email flow (TRU-68) ===
|
|
# The customer form is public; verify the static form route is still served.
|
|
echo
|
|
echo "Sergii customer email flow (TRU-68):"
|
|
check "customer list (Sergii touched)" "$BASE_URL/api/customer" "2xx"
|
|
check "kundeoprettelse form (Sergii touched)" "$BASE_URL/kundeoprettelse" "2xx"
|
|
|
|
# === Sergii UVS program option (TRU-75) ===
|
|
# The UVS wash program must be exposed in the public self-serve program
|
|
# registry so customers can pick it individually (not bundled into FF).
|
|
echo
|
|
echo "Sergii UVS program option (TRU-75):"
|
|
check "self-serve program registry" "$BASE_URL/self-serve/program" "2xx"
|
|
check "self-serve vehicle step" "$BASE_URL/self-serve/vehicle" "2xx"
|
|
|
|
# === Sergii Review Batch sanity — dashboard still bootstraps ===
|
|
echo
|
|
echo "Dashboard bootstrap:"
|
|
check "health check" "$BASE_URL/healthz" "2xx"
|
|
check "ping" "$BASE_URL/api/ping" "2xx"
|
|
check "login page" "$BASE_URL/login" "2xx"
|
|
|
|
echo
|
|
if [ "$FAIL" -eq 0 ]; then
|
|
echo -e "${GREEN}✓ Sergii Review Batch smoke test passed${NC}"
|
|
exit 0
|
|
else
|
|
echo -e "${RED}✗ Sergii Review Batch smoke test FAILED${NC}"
|
|
echo " A Sergii-touch surface on $BASE_URL is broken."
|
|
echo " Consider rolling back the most recent Sergii batch."
|
|
exit 1
|
|
fi
|