name: test

on:
  pull_request:
  workflow_dispatch:
jobs:
  test:
    name: test (${{ matrix.settings.name }})
    strategy:
      fail-fast: false
      matrix:
        settings:
          - name: linux
            host: blacksmith-4vcpu-ubuntu-2404
            playwright: bunx playwright install --with-deps
            workdir: .
            command: |
              git config --global user.email "bot@opencode.ai"
              git config --global user.name "opencode"
              bun turbo test
          - name: windows
            host: windows-latest
            playwright: bunx playwright install
            workdir: packages/app
            command: bun test:e2e:local
    runs-on: ${{ matrix.settings.host }}
    defaults:
      run:
        shell: bash
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Setup Bun
        uses: ./.github/actions/setup-bun

      - name: Install Playwright browsers
        working-directory: packages/app
        run: ${{ matrix.settings.playwright }}

      - name: Set OS-specific paths
        run: |
          if [ "${{ runner.os }}" = "Windows" ]; then
            printf '%s\n' "OPENCODE_E2E_ROOT=${{ runner.temp }}\\opencode-e2e" >> "$GITHUB_ENV"
            printf '%s\n' "OPENCODE_TEST_HOME=${{ runner.temp }}\\opencode-e2e\\home" >> "$GITHUB_ENV"
            printf '%s\n' "XDG_DATA_HOME=${{ runner.temp }}\\opencode-e2e\\share" >> "$GITHUB_ENV"
            printf '%s\n' "XDG_CACHE_HOME=${{ runner.temp }}\\opencode-e2e\\cache" >> "$GITHUB_ENV"
            printf '%s\n' "XDG_CONFIG_HOME=${{ runner.temp }}\\opencode-e2e\\config" >> "$GITHUB_ENV"
            printf '%s\n' "XDG_STATE_HOME=${{ runner.temp }}\\opencode-e2e\\state" >> "$GITHUB_ENV"
          else
            printf '%s\n' "OPENCODE_E2E_ROOT=${{ runner.temp }}/opencode-e2e" >> "$GITHUB_ENV"
            printf '%s\n' "OPENCODE_TEST_HOME=${{ runner.temp }}/opencode-e2e/home" >> "$GITHUB_ENV"
            printf '%s\n' "XDG_DATA_HOME=${{ runner.temp }}/opencode-e2e/share" >> "$GITHUB_ENV"
            printf '%s\n' "XDG_CACHE_HOME=${{ runner.temp }}/opencode-e2e/cache" >> "$GITHUB_ENV"
            printf '%s\n' "XDG_CONFIG_HOME=${{ runner.temp }}/opencode-e2e/config" >> "$GITHUB_ENV"
            printf '%s\n' "XDG_STATE_HOME=${{ runner.temp }}/opencode-e2e/state" >> "$GITHUB_ENV"
          fi

      - name: Seed opencode data
        if: matrix.settings.name != 'windows'
        working-directory: packages/opencode
        run: bun script/seed-e2e.ts
        env:
          OPENCODE_DISABLE_SHARE: "true"
          OPENCODE_DISABLE_LSP_DOWNLOAD: "true"
          OPENCODE_DISABLE_DEFAULT_PLUGINS: "true"
          OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: "true"
          OPENCODE_TEST_HOME: ${{ env.OPENCODE_TEST_HOME }}
          XDG_DATA_HOME: ${{ env.XDG_DATA_HOME }}
          XDG_CACHE_HOME: ${{ env.XDG_CACHE_HOME }}
          XDG_CONFIG_HOME: ${{ env.XDG_CONFIG_HOME }}
          XDG_STATE_HOME: ${{ env.XDG_STATE_HOME }}
          OPENCODE_E2E_PROJECT_DIR: ${{ github.workspace }}
          OPENCODE_E2E_SESSION_TITLE: "E2E Session"
          OPENCODE_E2E_MESSAGE: "Seeded for UI e2e"
          OPENCODE_E2E_MODEL: "opencode/gpt-5-nano"

      - name: Run opencode server
        if: matrix.settings.name != 'windows'
        working-directory: packages/opencode
        run: bun dev -- --print-logs --log-level WARN serve --port 4096 --hostname 127.0.0.1 &
        env:
          OPENCODE_DISABLE_SHARE: "true"
          OPENCODE_DISABLE_LSP_DOWNLOAD: "true"
          OPENCODE_DISABLE_DEFAULT_PLUGINS: "true"
          OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: "true"
          OPENCODE_TEST_HOME: ${{ env.OPENCODE_TEST_HOME }}
          XDG_DATA_HOME: ${{ env.XDG_DATA_HOME }}
          XDG_CACHE_HOME: ${{ env.XDG_CACHE_HOME }}
          XDG_CONFIG_HOME: ${{ env.XDG_CONFIG_HOME }}
          XDG_STATE_HOME: ${{ env.XDG_STATE_HOME }}
          OPENCODE_CLIENT: "app"

      - name: Wait for opencode server
        if: matrix.settings.name != 'windows'
        run: |
          for i in {1..120}; do
            curl -fsS "http://127.0.0.1:4096/global/health" > /dev/null && exit 0
            sleep 1
          done
          exit 1

      - name: run
        working-directory: ${{ matrix.settings.workdir }}
        run: ${{ matrix.settings.command }}
        env:
          CI: true
          OPENCODE_DISABLE_SHARE: "true"
          OPENCODE_DISABLE_LSP_DOWNLOAD: "true"
          OPENCODE_DISABLE_DEFAULT_PLUGINS: "true"
          OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: "true"
          OPENCODE_TEST_HOME: ${{ env.OPENCODE_TEST_HOME }}
          XDG_DATA_HOME: ${{ env.XDG_DATA_HOME }}
          XDG_CACHE_HOME: ${{ env.XDG_CACHE_HOME }}
          XDG_CONFIG_HOME: ${{ env.XDG_CONFIG_HOME }}
          XDG_STATE_HOME: ${{ env.XDG_STATE_HOME }}
          PLAYWRIGHT_SERVER_HOST: "127.0.0.1"
          PLAYWRIGHT_SERVER_PORT: "4096"
          VITE_OPENCODE_SERVER_HOST: "127.0.0.1"
          VITE_OPENCODE_SERVER_PORT: "4096"
          OPENCODE_CLIENT: "app"
        timeout-minutes: 30

      - name: Upload Playwright artifacts
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-${{ matrix.settings.name }}-${{ github.run_attempt }}
          if-no-files-found: ignore
          retention-days: 7
          path: |
            packages/app/e2e/test-results
            packages/app/e2e/playwright-report
