name: e2e tests

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

env:
  WASP_TELEMETRY_DISABLE: 1
  WASP_VERSION: 0.13.2

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout the repo
        uses: actions/checkout@v4

      - name: Setup Node.js
        id: setup-node
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Wasp
        run: curl -sSL https://get.wasp-lang.dev/installer.sh | sh -s -- -v ${{ env.WASP_VERSION }}

      - name: Docker setup
        uses: docker/setup-buildx-action@v3

      # In order for the app to run in the dev mode we need to set the required env vars even if
      # they aren't actually used by the app. This step sets mock env vars in order to pass the
      # validation steps so the app can run in the CI environment. For env vars that are actually
      # used in tests and therefore need real values, we set them in the GitHub secrets settings and
      # access them in a step below.
      - name: Set required wasp app env vars to mock values
        working-directory: ./template
        run: |
          cd app
          cp .env.server.example .env.server && cp .env.client.example .env.client

      - name: Cache global node modules
        uses: actions/cache@v4
        with:
          path: ~/.npm
          key: node-modules-${{ runner.os }}-${{ hashFiles('template/app/package-lock.json') }}-${{ hashFiles('template/e2e-tests/package-lock.json') }}-wasp${{ env.WASP_VERSION }}-node${{ steps.setup-node.outputs.node-version }}
          restore-keys: |
            node-modules-${{ runner.os }}-

      - name: Install Node.js dependencies for Playwright tests
        if: steps.cache-e2e-tests.outputs.cache-hit != 'true'
        working-directory: ./template
        run: |
          cd e2e-tests
          npm ci

      - name: Store Playwright's Version
        working-directory: ./template
        run: |
          cd e2e-tests
          PLAYWRIGHT_VERSION=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//')
          echo "Playwright's Version: $PLAYWRIGHT_VERSION"
          echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV

      - name: Cache Playwright Browsers for Playwright's Version
        id: cache-playwright-browsers
        uses: actions/cache@v4
        with:
          path: ~/.cache/ms-playwright
          key: playwright-browsers-${{ env.PLAYWRIGHT_VERSION }}-${{ runner.os }}

      - name: Set up Playwright
        if: steps.cache-playwright-browsers.outputs.cache-hit != 'true'
        working-directory: ./template
        run: |
          cd e2e-tests
          npx playwright install --with-deps

      - name: Install Stripe CLI
        run: |
          curl -s https://packages.stripe.dev/api/security/keypair/stripe-cli-gpg/public | gpg --dearmor | sudo tee /usr/share/keyrings/stripe.gpg
          echo "deb [signed-by=/usr/share/keyrings/stripe.gpg] https://packages.stripe.dev/stripe-cli-debian-local stable main" | sudo tee -a /etc/apt/sources.list.d/stripe.list
          sudo apt update
          sudo apt install stripe

      # For Stripe webhooks to work in development, we need to run the Stripe CLI to listen for webhook events.
      # The Stripe CLI will receive the webhook events from Stripe test payments and
      # forward them to our local server so that we can test the payment flow in our e2e tests.
      - name: Run Stripe CLI to listen for webhooks
        env:
          STRIPE_DEVICE_NAME: ${{ secrets.STRIPE_DEVICE_NAME }}
        run: |
          stripe listen --api-key ${{ secrets.STRIPE_KEY }} --forward-to localhost:3001/stripe-webhook &

      - name: Run Playwright tests
        env:
          # The e2e tests are testing parts of the app that need certain env vars, so we need to access them here.
          # These secretes can be set in your GitHub repo settings, e.g. https://github.com/<account>/<repo>/settings/secrets/actions
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          STRIPE_KEY: ${{ secrets.STRIPE_KEY }}
          STRIPE_WEBHOOK_SECRET: ${{ secrets.STRIPE_WEBHOOK_SECRET }}
          STRIPE_HOBBY_SUBSCRIPTION_PRICE_ID: ${{ secrets.STRIPE_HOBBY_SUBSCRIPTION_PRICE_ID }}
          STRIPE_PRO_SUBSCRIPTION_PRICE_ID: ${{ secrets.STRIPE_PRO_SUBSCRIPTION_PRICE_ID }}
          STRIPE_CREDITS_PRICE_ID: ${{ secrets.STRIPE_CREDITS_PRICE_ID }}
          SKIP_EMAIL_VERIFICATION_IN_DEV: true
          # Client-side env vars
          REACT_APP_GOOGLE_ANALYTICS_ID: G-H3LSJCK95H
        working-directory: ./template
        run: |
          cd e2e-tests
          npm run e2e:playwright
