name: E2E
on:
  push:
    branches: [ main, next ]
  merge_group:
  pull_request:

env:
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
  TURBO_TEAM: ${{ vars.TURBO_TEAM || github.repository_owner }}
  BETTER_AUTH_TELEMETRY_ENDPOINT: ${{ vars.BETTER_AUTH_TELEMETRY_ENDPOINT }}

permissions: {}

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.merge_group.head_ref || github.ref }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  smoke:
    name: Smoke test
    timeout-minutes: 30
    runs-on: starsling-ubuntu-24.04
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
          persist-credentials: false

      - name: Cache turbo build setup
        uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1
        with:
          path: .turbo
          key: ${{ runner.os }}-turbo-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-turbo-

      - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0

      - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
        with:
          node-version-file: '.nvmrc'
          registry-url: 'https://registry.npmjs.org'
          cache: pnpm

      - name: Install
        run: pnpm install

      - name: Build
        run: pnpm build

      - name: Start Docker Containers
        run: docker compose up -d --wait --wait-timeout 60

      - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0

      - uses: denoland/setup-deno@e95548e56dfa95d4e1a28d6f422fafe75c4c26fb # v2.0.3
        with:
          deno-version: 2.6.4

      - name: Smoke
        run: pnpm e2e:smoke

      - name: Stop Docker Containers
        run: docker compose down
  integration:
    name: Integration test
    timeout-minutes: 60
    runs-on: starsling-ubuntu-24.04
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
          persist-credentials: false

      - name: Cache turbo build setup
        uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1
        with:
          path: .turbo
          key: ${{ runner.os }}-turbo-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-turbo-

      - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0

      - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
        with:
          node-version-file: '.nvmrc'
          registry-url: 'https://registry.npmjs.org'
          cache: pnpm

      - name: Install
        run: pnpm install

      - name: Install Playwright Browsers
        uses: ./.github/actions/setup-playwright

      - name: Start Docker Containers
        run: docker compose up -d --wait --wait-timeout 60

      - name: Integration
        run: pnpm e2e:integration --filter=./e2e/integration

      - name: Stop Docker Containers
        run: docker compose down
  adapter-integration:
    name: ${{ matrix.packages }} Integration Test
    runs-on: starsling-ubuntu-24.04
    permissions:
      contents: read
    strategy:
      fail-fast: false
      matrix:
        packages: [ "@better-auth-test/adapter-factory", "@better-auth-test/drizzle-adapter", "@better-auth-test/kysely-prisma-adapter", "@better-auth-test/memory-adapter", "@better-auth-test/mongo-adapter", "@better-auth-test/prisma-adapter" ]
    steps:
      - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
        with:
          fetch-depth: 0
          persist-credentials: false

      - name: Cache turbo build setup
        uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1
        with:
          path: .turbo
          key: ${{ runner.os }}-turbo-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-turbo-

      - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0

      - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
        with:
          node-version-file: '.nvmrc'
          registry-url: 'https://registry.npmjs.org'
          cache: pnpm

      - name: Install
        run: pnpm install

      - name: Start Docker Containers
        run: docker compose up -d --wait --wait-timeout 60

      - name: Adapter Integration
        env:
          FILTER: ${{ matrix.packages }}
        run: pnpm e2e:integration --filter="$FILTER"

      - name: Stop Docker Containers
        run: docker compose down

  e2e:
    runs-on: ubuntu-latest
    needs: [smoke, integration, adapter-integration]
    if: always()
    steps:
      - uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
        with:
          jobs: ${{ toJSON(needs) }}
