name: E2E Test ALL
run-name: E2E Test All  origin--${{ inputs.origin }}
on:
  workflow_dispatch:
    inputs:
      origin:
        description: |
          输入需要测试的域名地址,包括微服务路径,如果不输入则采用本地启动服务测试,
          例如: `https://opentiny.github.io/tiny-vue-web-doc`.
        required: false
        type: string
concurrency:
  group: ${{ github.workflow }}-${{ github.sha }}
  cancel-in-progress: true

jobs:
  dispatch-test-all:
    name: Dispatch All Test
    timeout-minutes: 60
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        shard: [1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8, 8/8]
    steps:
      - uses: actions/checkout@v3
      - name: Setup pnpm
        uses: pnpm/action-setup@v2

      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: 20

      - name: Get pnpm store directory
        id: pnpm-cache
        run: |
          echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT

      - uses: actions/cache@v3
        name: Setup pnpm cache
        with:
          path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - name: Install dependencies
        run: pnpm i --no-frozen-lockfile

      - name: dev start
        if: contains(inputs.origin, 'http') == false
        run: pnpm site & sleep 5

      - name: Release E2E Config
        if: contains(inputs.origin, 'http') == true
        run: pnpm release:e2eConfig -o ${{ inputs.origin }} & sleep 5

      - name: update playwright
        run: pnpm recursive update @playwright/test

      - name: Install Playwright browsers
        run: pnpm install:browser --with-deps chromium

      - name: Run Playwright tests
        run: pnpm test:e2e3 --shard=${{ matrix.shard }} --reporter=blob

      - name: Upload blob report to GitHub Actions Artifacts
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: all-blob-reports-${{ strategy.job-index }}
          path: examples/vue3/blob-report
          retention-days: 0.5

  dispatch-test-all-merge-reports:
    name: 'Merge Reports After Dispatch All Test'
    # Merge reports after playwright-tests, even if some shards have failed
    if: always()
    needs: [dispatch-test-all]

    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-node@v3
        with:
          node-version: 20
      - name: Install dependencies
        run: |
          npm install -g @playwright/test

      - name: Download blob reports from GitHub Actions Artifacts
        uses: actions/download-artifact@v4
        with:
          pattern: all-blob-reports-*
          merge-multiple: true
          path: all-blob-reports

      - name: Merge into HTML Report
        run: playwright merge-reports --reporter html ./all-blob-reports

      - name: Upload HTML report
        uses: actions/upload-artifact@v4
        with:
          name: html-report--attempt-${{ github.run_attempt }}
          path: playwright-report
          retention-days: 7