|
| 1 | +#!/usr/bin/env bash |
| 2 | +# Run E2E tests locally, replicating the GitHub Actions e2e-tests.yml workflow. |
| 3 | +# |
| 4 | +# Required env vars: |
| 5 | +# E2E_ROLE_ARN — IAM role ARN to assume (grants access to the test account) |
| 6 | +# E2E_SECRET_ARN — Secrets Manager ARN containing ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY |
| 7 | +# |
| 8 | +# Optional env vars: |
| 9 | +# AWS_REGION — defaults to us-east-1 |
| 10 | +# |
| 11 | +# Usage: |
| 12 | +# export E2E_ROLE_ARN=arn:aws:iam::<account>:role/<role> |
| 13 | +# export E2E_SECRET_ARN=arn:aws:secretsmanager:<region>:<account>:secret:<name> |
| 14 | +# ./scripts/run-e2e-local.sh # runs strands-bedrock.test.ts (CI default) |
| 15 | +# ./scripts/run-e2e-local.sh --all # runs the full e2e suite |
| 16 | +# ./scripts/run-e2e-local.sh e2e-tests/foo.test.ts # runs a specific test file |
| 17 | +# |
| 18 | +# Prerequisites: aws CLI, node >=20.19, npm, git, uv, jq |
| 19 | + |
| 20 | +set -euo pipefail |
| 21 | + |
| 22 | +ROLE_ARN="${E2E_ROLE_ARN:-}" |
| 23 | +SECRET_ARN="${E2E_SECRET_ARN:-}" |
| 24 | +AWS_REGION="${AWS_REGION:-us-east-1}" |
| 25 | + |
| 26 | +if [[ -z "$ROLE_ARN" ]]; then |
| 27 | + echo "❌ E2E_ROLE_ARN is not set. Export it before running this script:" |
| 28 | + echo " export E2E_ROLE_ARN=arn:aws:iam::<account>:role/<role-name>" |
| 29 | + exit 1 |
| 30 | +fi |
| 31 | + |
| 32 | +if [[ -z "$SECRET_ARN" ]]; then |
| 33 | + echo "❌ E2E_SECRET_ARN is not set. Export it before running this script:" |
| 34 | + echo " export E2E_SECRET_ARN=arn:aws:secretsmanager:<region>:<account>:secret:<name>" |
| 35 | + exit 1 |
| 36 | +fi |
| 37 | +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 38 | +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" |
| 39 | + |
| 40 | +# ── Parse arguments ──────────────────────────────────────────────────────────── |
| 41 | +RUN_ALL=false |
| 42 | +TEST_FILES=() |
| 43 | +for arg in "$@"; do |
| 44 | + if [[ "$arg" == "--all" ]]; then |
| 45 | + RUN_ALL=true |
| 46 | + else |
| 47 | + TEST_FILES+=("$arg") |
| 48 | + fi |
| 49 | +done |
| 50 | + |
| 51 | +echo "=== Assuming IAM role ===" |
| 52 | +CREDS=$(aws sts assume-role \ |
| 53 | + --role-arn "$ROLE_ARN" \ |
| 54 | + --role-session-name "local-e2e-$(date +%s)" \ |
| 55 | + --duration-seconds 3600 \ |
| 56 | + --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \ |
| 57 | + --output text) |
| 58 | + |
| 59 | +export AWS_ACCESS_KEY_ID=$(echo "$CREDS" | awk '{print $1}') |
| 60 | +export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS" | awk '{print $2}') |
| 61 | +export AWS_SESSION_TOKEN=$(echo "$CREDS" | awk '{print $3}') |
| 62 | +export AWS_REGION |
| 63 | + |
| 64 | +echo "✅ Assumed role successfully" |
| 65 | + |
| 66 | +echo "=== Fetching API keys from Secrets Manager ===" |
| 67 | +SECRET_JSON=$(aws secretsmanager get-secret-value \ |
| 68 | + --secret-id "$SECRET_ARN" \ |
| 69 | + --region "$AWS_REGION" \ |
| 70 | + --query SecretString \ |
| 71 | + --output text) |
| 72 | + |
| 73 | +# Mirror the GitHub workflow: parse-json-secrets maps keys to E2E_<KEY> then |
| 74 | +# the workflow maps them to the bare names the tests expect. |
| 75 | +export ANTHROPIC_API_KEY=$(echo "$SECRET_JSON" | jq -r '.ANTHROPIC_API_KEY // empty') |
| 76 | +export OPENAI_API_KEY=$(echo "$SECRET_JSON" | jq -r '.OPENAI_API_KEY // empty') |
| 77 | +export GEMINI_API_KEY=$(echo "$SECRET_JSON" | jq -r '.GEMINI_API_KEY // empty') |
| 78 | + |
| 79 | +echo "✅ Secrets loaded (keys present: $(echo "$SECRET_JSON" | jq -r 'keys | join(", ")')" |
| 80 | + |
| 81 | +echo "=== Setting AWS account env var ===" |
| 82 | +export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) |
| 83 | +echo "✅ AWS_ACCOUNT_ID=$AWS_ACCOUNT_ID AWS_REGION=$AWS_REGION" |
| 84 | + |
| 85 | +echo "=== Configuring git (required for agentcore create) ===" |
| 86 | +git config --global user.email "ci@local" 2>/dev/null || true |
| 87 | +git config --global user.name "Local E2E" 2>/dev/null || true |
| 88 | + |
| 89 | +cd "$REPO_ROOT" |
| 90 | + |
| 91 | +echo "=== Installing dependencies ===" |
| 92 | +npm ci |
| 93 | + |
| 94 | +echo "=== Building CLI ===" |
| 95 | +npm run build |
| 96 | + |
| 97 | +echo "=== Installing CLI globally ===" |
| 98 | +TARBALL=$(npm pack | tail -1) |
| 99 | +npm install -g "$TARBALL" |
| 100 | +echo "✅ Installed: $(agentcore --version)" |
| 101 | + |
| 102 | +echo "=== Running E2E tests ===" |
| 103 | +if [[ "$RUN_ALL" == "true" ]]; then |
| 104 | + echo "Running full e2e suite" |
| 105 | + npx vitest run --project e2e |
| 106 | +elif [[ ${#TEST_FILES[@]} -gt 0 ]]; then |
| 107 | + echo "Running: ${TEST_FILES[*]}" |
| 108 | + npx vitest run --project e2e "${TEST_FILES[@]}" |
| 109 | +else |
| 110 | + echo "Running default: e2e-tests/strands-bedrock.test.ts" |
| 111 | + npx vitest run --project e2e e2e-tests/strands-bedrock.test.ts |
| 112 | +fi |
0 commit comments