#!/usr/bin/env sh set -eu ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) cd "$ROOT_DIR" COMPOSE_FILE="dev/docker-compose.e2e.yaml" CONTROLLER_HOST="${COMPOSIA_E2E_CONTROLLER_HOST:-127.0.0.1}" ACCESS_TOKEN="dev-admin-token" SUITE="${1:-all}" case "$SUITE" in all | cli | controller | web) ;; *) echo "usage: $0 [all|cli|controller|web]" >&2 exit 2 ;; esac cleanup() { status=$? if [ "$status" -ne 0 ]; then docker compose -f "$COMPOSE_FILE" logs --no-color controller-dev agent-dev || true fi docker compose -f "$COMPOSE_FILE" down -v exit "$status" } trap cleanup EXIT if [ "$SUITE" = "all" ] || [ "$SUITE" = "web" ]; then deno install --frozen deno task --cwd web e2e:install fi docker compose -f "$COMPOSE_FILE" up -d --build controller-dev agent-dev CONTROLLER_PORT=$(docker compose -f "$COMPOSE_FILE" port controller-dev 7001 | awk -F: 'END { print $NF }') CONTROLLER_ADDR="http://$CONTROLLER_HOST:$CONTROLLER_PORT" for attempt in $(seq 1 60); do if curl -fsS \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H 'Connect-Protocol-Version: 1' \ -H 'Content-Type: application/json' \ -H 'X-Composia-Source: local-e2e' \ --data '{}' \ "$CONTROLLER_ADDR/api/controller/composia.controller.v1.SystemService/GetSystemStatus" >/dev/null; then break fi if [ "$attempt" = "60" ]; then exit 1 fi sleep 2 done if [ "$SUITE" = "all" ] || [ "$SUITE" = "cli" ]; then COMPOSIA_E2E_CONTROLLER_ADDR="$CONTROLLER_ADDR" \ COMPOSIA_E2E_ACCESS_TOKEN="$ACCESS_TOKEN" \ go test -tags=e2e ./test/e2e fi if [ "$SUITE" = "all" ] || [ "$SUITE" = "controller" ]; then COMPOSIA_E2E_CONTROLLER_ADDR="$CONTROLLER_ADDR" \ COMPOSIA_E2E_ACCESS_TOKEN="$ACCESS_TOKEN" \ go test -tags=e2e ./test/controller_e2e fi if [ "$SUITE" = "all" ] || [ "$SUITE" = "web" ]; then WEB_CONTROLLER_ADDR="$CONTROLLER_ADDR" \ WEB_BROWSER_CONTROLLER_ADDR="$CONTROLLER_ADDR" \ WEB_CONTROLLER_ACCESS_TOKEN="$ACCESS_TOKEN" \ WEB_LOGIN_USERNAME="admin" \ WEB_LOGIN_PASSWORD_HASH='$argon2id$v=19$m=65536,t=3,p=4$/wh05hbH5ipiT42CK+GxVA$2unNmHbsRe5ZkFgIkHNekBGk6KH+79sZAPB9qmRrUlQ' \ WEB_SESSION_SECRET="e2e-session-secret" \ ORIGIN="http://127.0.0.1:4173" \ HOST="127.0.0.1" \ PORT="4173" \ deno task web:e2e fi