name: Update Integration Tests

on:
  pull_request:
    paths:
      # Trigger on changes to update-related code
      - 'internal/updates/**'
      - 'internal/api/updates.go'
      - 'internal/api/rate_limit*.go'
      - 'frontend-modern/src/components/Update*.tsx'
      - 'frontend-modern/src/api/updates.ts'
      - 'frontend-modern/src/stores/updates.ts'
      - 'tests/integration/**'
      - '.github/workflows/test-updates.yml'
  push:
    branches:
      - main
      - master
    paths:
      - 'internal/updates/**'
      - 'internal/api/updates.go'
      - 'frontend-modern/src/components/Update*.tsx'
      - 'tests/integration/**'
  workflow_dispatch: # Allow manual triggering

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  integration-tests:
    name: Update Flow Integration Tests
    runs-on: ubuntu-latest
    timeout-minutes: 30

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.23'
          cache: true

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
          cache-dependency-path: tests/integration/package-lock.json

      - name: Install Playwright dependencies
        working-directory: tests/integration
        run: |
          npm ci
          npx playwright install --with-deps chromium

      - name: Install frontend dependencies
        working-directory: frontend-modern
        run: npm ci

      - name: Build Pulse for testing
        run: |
          make build || go build -o pulse ./cmd/pulse

      - name: Build Docker images for test environment
        working-directory: tests/integration
        run: |
          # Build mock GitHub server
          docker build -t pulse-mock-github:test ./mock-github-server

          # Build Pulse test image
          cd ../../
          docker build -t pulse:test -f Dockerfile .

      - name: Run diagnostic smoke test
        working-directory: tests/integration
        env:
          MOCK_CHECKSUM_ERROR: "false"
          MOCK_NETWORK_ERROR: "false"
          MOCK_RATE_LIMIT: "false"
          MOCK_STALE_RELEASE: "false"
        run: |
          docker compose -f docker-compose.test.yml up -d
          sleep 15  # Wait for services to be ready
          npx playwright test tests/00-diagnostic.spec.ts --reporter=list,html
          UPDATE_API_BASE_URL=http://localhost:7655 go test ../../tests/integration/api -run TestUpdateFlowIntegration -count=1
          docker compose -f docker-compose.test.yml down -v

      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-report
          path: tests/integration/playwright-report/
          retention-days: 30

      - name: Upload test videos and screenshots
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: test-failures
          path: |
            tests/integration/test-results/
          retention-days: 7

      - name: Cleanup Docker resources
        if: always()
        working-directory: tests/integration
        run: |
          docker compose -f docker-compose.test.yml down -v || true
          docker system prune -f || true

      - name: Comment PR with test results
        if: github.event_name == 'pull_request' && failure()
        uses: actions/github-script@v7
        with:
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: '❌ Update integration tests failed. Please check the [workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.'
            })
