name: JavaScript Tests

on:
  # JavaScript testing was introduced in WordPress 3.8.
  push:
    branches:
      - trunk
      - '3.[89]'
      - '[4-9].[0-9]'
    tags:
      - '[0-9]+.[0-9]'
      - '[0-9]+.[0-9].[0-9]+'
      - '!3.7.[0-9]+'
  pull_request:
    branches:
      - trunk
      - '3.[89]'
      - '[4-9].[0-9]'
    paths:
      # Any change to a JavaScript file should run tests.
      - '**.js'
      # These files configure npm. Changes could affect the outcome.
      - 'package*.json'
      # This file configures ESLint. Changes could affect the outcome.
      - '.eslintignore'
      # This file configures JSHint. Changes could affect the outcome.
      - '.jshintrc'
      # Any change to the QUnit directory should run tests.
      - 'tests/qunit/**'
      # Changes to workflow files should always verify all workflows are successful.
      - '.github/workflows/*.yml'
  workflow_dispatch:

# Cancels all previous workflow runs for pull requests that have not completed.
concurrency:
  # The concurrency group contains the workflow name and the branch name for pull requests
  # or the commit hash for any other events.
  group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }}
  cancel-in-progress: true

# Disable permissions for all available scopes by default.
# Any needed permissions should be configured at the job level.
permissions: {}

jobs:
  # Runs the WordPress Core JavaScript tests.
  test-js:
    name: QUnit Tests
    uses: WordPress/wordpress-develop/.github/workflows/reusable-javascript-tests.yml@trunk
    permissions:
      contents: read
    if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }}

  slack-notifications:
    name: Slack Notifications
    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
    permissions:
      actions: read
      contents: read
    needs: [ test-js ]
    if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
    with:
      calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }}
    secrets:
      SLACK_GHA_SUCCESS_WEBHOOK: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }}
      SLACK_GHA_CANCELLED_WEBHOOK: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }}
      SLACK_GHA_FIXED_WEBHOOK: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }}
      SLACK_GHA_FAILURE_WEBHOOK: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }}

  failed-workflow:
    name: Failed workflow tasks
    runs-on: ubuntu-latest
    permissions:
      actions: write
    needs: [ slack-notifications ]
    if: |
      always() &&
      github.repository == 'WordPress/wordpress-develop' &&
      github.event_name != 'pull_request' &&
      github.run_attempt < 2 &&
      (
        contains( needs.*.result, 'cancelled' ) ||
        contains( needs.*.result, 'failure' )
      )

    steps:
      - name: Dispatch workflow run
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
        with:
          retries: 2
          retry-exempt-status-codes: 418
          script: |
            github.rest.actions.createWorkflowDispatch({
              owner: context.repo.owner,
              repo: context.repo.repo,
              workflow_id: 'failed-workflow.yml',
              ref: 'trunk',
              inputs: {
                run_id: '${{ github.run_id }}'
              }
            });