name: Tests
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  unit-test:
    name: Unit Tests
    timeout-minutes: 60
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
          cache: 'npm'
          cache-dependency-path: './package-lock.json'
      - name: Install dependencies
        run: npm ci --legacy-peer-deps

      # build libraries
      - name: Build libraries
        run: |
          npm run build --workspace=packages/bruno-common
          npm run build --workspace=packages/bruno-query
          npm run sandbox:bundle-libraries --workspace=packages/bruno-js
          npm run build --workspace=packages/bruno-converters
          npm run build --workspace=packages/bruno-requests

      - name: Lint Check
        run: npm run lint

      # tests
      - name: Test Package bruno-js
        run: npm run test --workspace=packages/bruno-js
      - name: Test Package bruno-cli
        run: npm run test --workspace=packages/bruno-cli

      - name: Test Package bruno-query
        run: npm run test --workspace=packages/bruno-query
      - name: Test Package bruno-lang
        run: npm run test --workspace=packages/bruno-lang
      - name: Test Package bruno-schema
        run: npm run test --workspace=packages/bruno-schema
      - name: Test Package bruno-app
        run: npm run test --workspace=packages/bruno-app
      - name: Test Package bruno-common
        run: npm run test --workspace=packages/bruno-common
      - name: Test Package bruno-converters
        run: npm run test --workspace=packages/bruno-converters
      - name: Test Package bruno-electron
        run: npm run test --workspace=packages/bruno-electron

  cli-test:
    name: CLI Tests
    runs-on: ubuntu-latest
    permissions:
      checks: write
      pull-requests: write
      contents: read
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version-file: '.nvmrc'
          cache: 'npm'
          cache-dependency-path: './package-lock.json'

      - name: Install dependencies
        run: npm ci --legacy-peer-deps

      - name: Build Libraries
        run: |
          npm run build --workspace=packages/bruno-query
          npm run build --workspace=packages/bruno-common
          npm run sandbox:bundle-libraries --workspace=packages/bruno-js
          npm run build --workspace=packages/bruno-converters
          npm run build --workspace=packages/bruno-requests

      - name: Run tests
        run: |
          cd packages/bruno-tests/collection
          npm install
          node ../../bruno-cli/bin/bru.js run --env Prod --output junit.xml --format junit

      - name: Publish Test Report
        uses: EnricoMi/publish-unit-test-result-action@v2
        if: always()
        with:
          check_name: CLI Test Results
          files: packages/bruno-tests/collection/junit.xml
          comment_mode: always
  e2e-test:
    name: Playwright E2E Tests
    timeout-minutes: 60
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: v22.11.x
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get --no-install-recommends install -y \
          libglib2.0-0 libnss3 libdbus-1-3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libgtk-3-0 libasound2t64 \
          xvfb
        npm ci --legacy-peer-deps
        sudo chown root /home/runner/work/bruno/bruno/node_modules/electron/dist/chrome-sandbox
        sudo chmod 4755 /home/runner/work/bruno/bruno/node_modules/electron/dist/chrome-sandbox

    - name: Install dependencies for test collection environment
      run: |
        npm ci --prefix packages/bruno-tests/collection

    - name: Build libraries
      run: |
        npm run build:graphql-docs
        npm run build:bruno-query
        npm run build:bruno-common
        npm run sandbox:bundle-libraries --workspace=packages/bruno-js
        npm run build:bruno-converters
        npm run build:bruno-requests

    - name: Run Playwright tests
      run: |
        xvfb-run npm run test:e2e
    - uses: actions/upload-artifact@v4
      if: ${{ !cancelled() }}
      with:
        name: playwright-report
        path: playwright-report/
        retention-days: 30
