name: Test all plugins

on:
  # To run this workflow, trigger it manually, or add the label 'test-all-plugins' to a pull request
  pull_request:
    types: [ labeled ]
  workflow_dispatch:

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

jobs:
  get-plugins:
    if: github.event.label.name == 'test-all-plugins' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    steps:
      - id: plugin_names
        # Query npe2api for index of all plugins, select the keys, turn them into an array, select 10 random
        # names from that array, convert the "one per line" output back into a string array
        # save the string array of 10 plugins into the output from this step
        run: |
          set -eux
          DATA=$(echo $(curl -s https://npe2api.vercel.app/api/plugins | jq -c 'keys' | jq -r '.[]' | shuf -n 10 | jq -R -s 'split("\n") | map(select(. != ""))'))
          echo "plugins=$DATA" >> "$GITHUB_OUTPUT"
    outputs:
      plugins: ${{ steps.plugin_names.outputs.plugins }}

  test_all:
    needs: get-plugins
    name: ${{ matrix.plugin }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        plugin: ${{ fromJson(needs.get-plugins.outputs.plugins) }}
    defaults:
      run:
        shell: bash -l {0}

    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - uses: tlambert03/setup-qt-libs@19e4ef2d781d81f5f067182e228b54ec90d23b76 # v1.8

      - uses: conda-incubator/setup-miniconda@fc2d68f6413eb2d87b895e92f8584b5b94a10167 # v3.3.0
        with:
          python-version: '3.10'
          miniforge-variant: Miniforge3
          conda-remove-defaults: "true"
          miniforge-version: latest
          use-mamba: true

      - name: Install npe2
        run: pip install -e .[testing]

      - run: sudo apt-get install -y xvfb
      - name: Run tests
        run: xvfb-run --auto-servernum pytest tests/test_all_plugins.py -s -v --color=yes
        env:
          TEST_PACKAGE_NAME: ${{ matrix.plugin }}
