#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" MATRIX_ROOT="${FRONTEND_MATRIX_ROOT:-$ROOT_DIR/artifacts/frontend-acceptance-matrix}" TS="${TS:-$(date +%s)}" MATRIX_DIR="${MATRIX_DIR:-$MATRIX_ROOT/${TS}_frontend_matrix}" BROWSER_SMOKE_SCRIPT="${BROWSER_SMOKE_SCRIPT:-$ROOT_DIR/scripts/test/verify_frontend_smoke.sh}" PORTAL_ACCEPTANCE_SCRIPT="${PORTAL_ACCEPTANCE_SCRIPT:-$ROOT_DIR/scripts/acceptance/verify_portal_catalog_ui.sh}" PUBLIC_PORTAL_BROWSER_SCRIPT="${PUBLIC_PORTAL_BROWSER_SCRIPT:-$ROOT_DIR/scripts/acceptance/verify_public_portal_browser.sh}" ACCOUNTS_ACCEPTANCE_SCRIPT="${ACCOUNTS_ACCEPTANCE_SCRIPT:-$ROOT_DIR/scripts/acceptance/verify_accounts_admin_ui.sh}" ROUTE_MATRIX_SCRIPT="${ROUTE_MATRIX_SCRIPT:-$ROOT_DIR/scripts/acceptance/verify_route_acceptance_matrix.sh}" PROVIDER_ADMIN_SCRIPT="${PROVIDER_ADMIN_SCRIPT:-$ROOT_DIR/scripts/acceptance/verify_provider_admin_actions.sh}" RUN_PUBLIC_PORTAL_BROWSER="${RUN_PUBLIC_PORTAL_BROWSER:-0}" mkdir -p "$MATRIX_DIR" run_step() { local name="$1" shift echo "==> $name" ARTIFACT_DIR="$MATRIX_DIR/$name" "$@" >"$MATRIX_DIR/$name.stdout.txt" 2>"$MATRIX_DIR/$name.stderr.txt" } mark_skip() { local name="$1" local reason="$2" printf '%s\n' "$reason" >"$MATRIX_DIR/$name.skip.txt" } has_crm_auth() { [[ -n "${CRM_ADMIN_TOKEN:-}" ]] || { [[ -n "${CRM_ADMIN_USERNAME:-}" ]] && [[ -n "${CRM_ADMIN_PASSWORD:-}" ]]; } } run_step browser_smoke bash "$BROWSER_SMOKE_SCRIPT" run_step portal_catalog bash "$PORTAL_ACCEPTANCE_SCRIPT" if [[ "$RUN_PUBLIC_PORTAL_BROWSER" == "1" ]]; then run_step portal_public_browser bash "$PUBLIC_PORTAL_BROWSER_SCRIPT" else mark_skip portal_public_browser "set RUN_PUBLIC_PORTAL_BROWSER=1 to execute public portal browser verification" fi if [[ -n "${CRM_BASE:-}" ]] && has_crm_auth; then run_step accounts_admin bash "$ACCOUNTS_ACCEPTANCE_SCRIPT" else mark_skip accounts_admin "missing CRM_BASE or CRM auth; set CRM_BASE with CRM_ADMIN_TOKEN or CRM_ADMIN_USERNAME/CRM_ADMIN_PASSWORD" fi if [[ -n "${CRM_BASE:-}" ]] && has_crm_auth && [[ -n "${SHADOW_HOST_ID:-}" ]] && [[ -n "${SHADOW_GROUP_ID:-}" ]] && { [[ -n "${SUBSCRIPTION_USER_ID:-}" ]] || [[ -n "${GATEWAY_API_KEY:-}" ]]; }; then run_step route_matrix bash "$ROUTE_MATRIX_SCRIPT" else mark_skip route_matrix "missing CRM auth or route data-plane env; require CRM_BASE, auth, SHADOW_HOST_ID, SHADOW_GROUP_ID, and SUBSCRIPTION_USER_ID or GATEWAY_API_KEY" fi if [[ -n "${CRM_BASE:-}" ]] && has_crm_auth && [[ -n "${ACCESS_API_KEY:-}" ]] && [[ -n "${PROVIDER_KEYS:-}" ]]; then run_step provider_admin bash "$PROVIDER_ADMIN_SCRIPT" else mark_skip provider_admin "missing provider admin env; require CRM_BASE, auth, ACCESS_API_KEY, and PROVIDER_KEYS" fi python3 - "$MATRIX_DIR" >"$MATRIX_DIR/summary.json" <<'PY' import json import sys from pathlib import Path matrix_dir = Path(sys.argv[1]) def load_json(path): return json.loads(path.read_text(encoding="utf-8")) def step_result(name, summary_file): step_dir = matrix_dir / name if step_dir.exists(): return {"status": "ok", "artifact_dir": str(step_dir), "summary": load_json(step_dir / summary_file)} skip_file = matrix_dir / f"{name}.skip.txt" if skip_file.exists(): return {"status": "skipped", "reason": skip_file.read_text(encoding="utf-8").strip()} return {"status": "missing"} browser = step_result("browser_smoke", "99-summary.json") portal = step_result("portal_catalog", "99-summary.json") portal_public_browser = step_result("portal_public_browser", "99-summary.json") accounts = step_result("accounts_admin", "99-summary.json") route = step_result("route_matrix", "summary.json") provider = step_result("provider_admin", "99-summary.json") summary = { "matrix_dir": str(matrix_dir), "steps": { "browser_smoke": browser, "portal_catalog": portal, "portal_public_browser": portal_public_browser, "accounts_admin": accounts, "route_matrix": route, "provider_admin": provider, }, "page_mapping": { "portal": ["browser_smoke", "portal_catalog", "portal_public_browser"], "admin_index": ["browser_smoke"], "logical_groups": ["browser_smoke", "route_matrix"], "route_health": ["browser_smoke", "route_matrix"], "accounts": ["browser_smoke", "accounts_admin"], "providers": ["browser_smoke", "provider_admin"], "batch_import": ["browser_smoke"], }, } print(json.dumps(summary, ensure_ascii=False, indent=2)) PY cat "$MATRIX_DIR/summary.json"