12c0bc4b69
ci-arm64-advisory / fast-checks (pull_request) Waiting to run
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Successful in 9s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 13s
CI / Detect changes (pull_request) Successful in 15s
CI / Python Lint & Test (pull_request) Successful in 6s
E2E API Smoke Test / detect-changes (pull_request) Successful in 11s
E2E Chat / detect-changes (pull_request) Successful in 44s
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 43s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 10s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 18s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 14s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 22s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 1m36s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 1m50s
lint-required-workflows-docker-host-pinned / Lint docker-host pin on docker-touching workflows (pull_request) Successful in 15s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 1m49s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 22s
gate-check-v3 / gate-check (pull_request) Successful in 20s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m23s
sop-checklist / na-declarations (pull_request) N/A: (none)
security-review / approved (pull_request) Successful in 10s
sop-checklist / all-items-acked (pull_request) Successful in 7s
qa-review / approved (pull_request) Successful in 10s
sop-checklist / review-refire (pull_request) Has been skipped
CI / Platform (Go) (pull_request) Successful in 7s
sop-tier-check / tier-check (pull_request) Successful in 11s
CI / Canvas (Next.js) (pull_request) Successful in 5s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 26s
E2E Chat / E2E Chat (pull_request) Successful in 14s
CI / all-required (pull_request) Successful in 5m56s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m36s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 6s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 4s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 1m47s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
audit-force-merge / audit (pull_request) Successful in 9s
144 lines
5.2 KiB
Bash
Executable File
144 lines
5.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# E2E regression suite for the local-dev escape hatches added in
|
|
# fix/quickstart-bugless. These cover the exact user-facing breakages
|
|
# that dropped out of the partial squash-merge of PR #1871:
|
|
#
|
|
# 1. GET /workspaces returns 200 with no bearer after tokens exist in
|
|
# the DB — exercises the AdminAuth Tier-1b dev-mode hatch
|
|
# (middleware/devmode.go::isDevModeFailOpen).
|
|
# 2. GET /workspaces/:id/activity returns 200 with no bearer — the
|
|
# same hatch applied to WorkspaceAuth.
|
|
# 3. POST /workspaces/:id/a2a doesn't 502-SSRF on a loopback workspace
|
|
# URL — exercises handlers/ssrf.go::devModeAllowsLoopback.
|
|
# 4. GET /org/templates returns the curated set populated by
|
|
# clone-manifest.sh — exercises infra/scripts/setup.sh + the
|
|
# ListTemplates failure logging in handlers/org.go.
|
|
#
|
|
# Requires: platform running on :8080 with MOLECULE_ENV=development and
|
|
# ADMIN_TOKEN unset. Matches the README quickstart env.
|
|
#
|
|
# Usage:
|
|
# bash tests/e2e/test_dev_mode.sh
|
|
set -euo pipefail
|
|
|
|
# shellcheck source=_lib.sh
|
|
source "$(dirname "$0")/_lib.sh"
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
fail() {
|
|
echo "FAIL: $1"
|
|
FAIL=$((FAIL + 1))
|
|
}
|
|
|
|
pass() {
|
|
echo "PASS: $1"
|
|
PASS=$((PASS + 1))
|
|
}
|
|
|
|
check_http() {
|
|
local desc="$1" expected="$2" actual="$3"
|
|
if [ "$actual" = "$expected" ]; then
|
|
pass "$desc (HTTP $actual)"
|
|
else
|
|
fail "$desc — expected HTTP $expected, got $actual"
|
|
fi
|
|
}
|
|
|
|
echo "=== Dev-mode escape-hatch regression tests ==="
|
|
echo ""
|
|
|
|
# Pre-test: ensure MOLECULE_ENV=development and no ADMIN_TOKEN are in the
|
|
# platform's env. The request path doesn't let us read the platform's
|
|
# env directly, but we can verify the hatch is active by confirming the
|
|
# expected behaviour under the conditions the test otherwise sets up.
|
|
|
|
e2e_cleanup_all_workspaces
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Section 1 — AdminAuth dev-mode hatch
|
|
# ----------------------------------------------------------------------
|
|
# Before fix: once any workspace had tokens in the DB, GET /workspaces
|
|
# closed to unauthenticated callers and the Canvas broke. The hatch
|
|
# keeps it open specifically in dev mode.
|
|
|
|
echo "--- Section 1: AdminAuth dev-mode hatch ---"
|
|
|
|
R=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/workspaces")
|
|
check_http "GET /workspaces (empty DB)" "200" "$R"
|
|
|
|
# Create a workspace so tokens land in the DB.
|
|
R=$(curl -s -w "\n%{http_code}" -X POST "$BASE/workspaces" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"name":"Dev-Mode-Test","tier":1,"runtime":"external","external":true}')
|
|
CODE=$(echo "$R" | tail -n1)
|
|
BODY=$(echo "$R" | sed '$d')
|
|
check_http "POST /workspaces (create)" "201" "$CODE"
|
|
|
|
WS_ID=$(echo "$BODY" | python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))" 2>/dev/null || true)
|
|
if [ -z "$WS_ID" ]; then
|
|
fail "Could not extract workspace ID from create response"
|
|
echo "=== Results: $PASS passed, $FAIL failed ==="
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure a real workspace token exists so AdminAuth now sees a live token. On
|
|
# pre-fix builds the next /workspaces call would 401 — on post-fix it
|
|
# must stay 200 because MOLECULE_ENV=development + ADMIN_TOKEN unset.
|
|
TOKEN=$(echo "$BODY" | e2e_extract_token)
|
|
if [ -z "$TOKEN" ]; then
|
|
e2e_mint_workspace_token "$WS_ID" >/dev/null
|
|
fi
|
|
|
|
R=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/workspaces")
|
|
check_http "GET /workspaces (after token minted, no bearer)" "200" "$R"
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Section 2 — WorkspaceAuth dev-mode hatch
|
|
# ----------------------------------------------------------------------
|
|
# Before fix: /workspaces/:id/activity 401'd once tokens existed —
|
|
# the Canvas side panel's chat history load broke.
|
|
|
|
echo ""
|
|
echo "--- Section 2: WorkspaceAuth dev-mode hatch ---"
|
|
|
|
R=$(curl -s -o /dev/null -w "%{http_code}" \
|
|
"$BASE/workspaces/$WS_ID/activity?type=a2a_receive&limit=50")
|
|
check_http "GET /workspaces/:id/activity (no bearer)" "200" "$R"
|
|
|
|
R=$(curl -s -o /dev/null -w "%{http_code}" \
|
|
"$BASE/workspaces/$WS_ID/delegations")
|
|
check_http "GET /workspaces/:id/delegations (no bearer)" "200" "$R"
|
|
|
|
R=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/approvals/pending")
|
|
check_http "GET /approvals/pending (no bearer)" "200" "$R"
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Section 3 — Template registry populated by setup.sh
|
|
# ----------------------------------------------------------------------
|
|
# Before fix: setup.sh didn't run clone-manifest.sh so the template
|
|
# palette was empty and the molecule-dev in-tree copy was broken.
|
|
|
|
echo ""
|
|
echo "--- Section 3: Template registry ---"
|
|
|
|
R=$(curl -s "$BASE/org/templates")
|
|
COUNT=$(echo "$R" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))" 2>/dev/null || echo "0")
|
|
if [ "$COUNT" -gt 0 ]; then
|
|
pass "GET /org/templates returns $COUNT template(s)"
|
|
else
|
|
fail "GET /org/templates returned empty list — is clone-manifest.sh run? (bash scripts/clone-manifest.sh manifest.json workspace-configs-templates/ org-templates/ plugins/)"
|
|
fi
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Cleanup
|
|
# ----------------------------------------------------------------------
|
|
e2e_delete_workspace "$WS_ID" "Dev-Mode-Test"
|
|
|
|
echo ""
|
|
echo "=== Results: $PASS passed, $FAIL failed ==="
|
|
if [ "$FAIL" -gt 0 ]; then
|
|
exit 1
|
|
fi
|