name: Tests on: pull_request: {} merge_group: types: [checks_requested] push: branches: [develop, master] workflow_call: inputs: disable_coverage: type: boolean required: false description: "Specify true to skip generating and uploading coverage for tests" matrix-js-sdk-sha: type: string required: false description: "The matrix-js-sdk SHA to use" concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} cancel-in-progress: true env: ENABLE_COVERAGE: ${{ github.event_name != 'merge_group' && inputs.disable_coverage != 'true' }} # fetchdep.sh needs to know our PR number PR_NUMBER: ${{ github.event.pull_request.number }} NX_DEFAULT_OUTPUT_STYLE: stream-without-prefixes permissions: {} jobs: jest_ew: name: Jest (Element Web) runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: # Run multiple instances in parallel to speed up the tests runner: [1, 2] steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: repository: ${{ inputs.matrix-js-sdk-sha && 'element-hq/element-web' || github.repository }} persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5 - name: pnpm cache uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6 with: node-version: "lts/*" cache: "pnpm" - name: Install Deps run: "./scripts/layered.sh" env: JS_SDK_GITHUB_BASE_REF: ${{ inputs.matrix-js-sdk-sha }} - name: Jest Cache uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5 with: path: /tmp/jest_cache key: ${{ hashFiles('**/pnpm-lock.yaml') }} - name: Get number of CPU cores id: cpu-cores uses: SimenB/github-actions-cpu-cores@97ba232459a8e02ff6121db9362b09661c875ab8 # v2 - name: Run tests working-directory: apps/web run: | pnpm test \ --coverage=$ENABLE_COVERAGE \ --ci \ --max-workers $MAX_WORKERS \ --shard "$SHARD" \ --cacheDirectory /tmp/jest_cache env: JEST_SONAR_UNIQUE_OUTPUT_NAME: true # tell jest to use coloured output FORCE_COLOR: true MAX_WORKERS: ${{ steps.cpu-cores.outputs.count }} SHARD: ${{ format('{0}/{1}', matrix.runner, strategy.job-total) }} - name: Move coverage files into place if: env.ENABLE_COVERAGE == 'true' working-directory: apps/web run: mv coverage/lcov.info coverage/$NODE_VERSION-${{ matrix.runner }}.lcov.info env: NODE_VERSION: ${{ steps.setupNode.outputs.node-version }} - name: Upload Artifact if: env.ENABLE_COVERAGE == 'true' uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: name: coverage-${{ matrix.runner }} path: | apps/web/coverage !apps/web/coverage/lcov-report complete: name: jest-tests needs: [jest_ew, vitest] if: always() runs-on: ubuntu-24.04 permissions: statuses: write steps: - if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') run: exit 1 - name: Skip SonarCloud in merge queue if: github.event_name == 'merge_group' || inputs.disable_coverage == 'true' uses: guibranco/github-status-action-v2@9bfa8773cdbdc6c185747fd43cd7faa9d7c32f09 with: authToken: ${{ secrets.GITHUB_TOKEN }} state: success description: SonarCloud skipped context: SonarCloud Code Analysis sha: ${{ github.sha }} target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} vitest: name: Vitest strategy: matrix: package: - shared-components - module-api runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: repository: ${{ inputs.matrix-js-sdk-sha && 'element-hq/element-web' || github.repository }} persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5 - name: pnpm cache uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6 with: node-version: "lts/*" cache: "pnpm" - name: Install Deps run: "pnpm install" - name: Cache storybook & vitest uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5 with: path: | packages/${{ matrix.package }}/node_modules/.cache packages/${{ matrix.package }}/node_modules/.vite/vitest key: ${{ hashFiles('pnpm-lock.yaml') }} - name: Setup playwright uses: ./.github/actions/setup-playwright if: matrix.package == 'shared-components' with: write-cache: ${{ github.event_name != 'merge_group' }} - name: Run tests working-directory: "packages/${{ matrix.package }}" run: pnpm test:unit --coverage=$ENABLE_COVERAGE - name: Upload Artifact if: env.ENABLE_COVERAGE == 'true' uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: name: coverage-${{ matrix.package }} path: | packages/${{ matrix.package }}/coverage !packages/${{ matrix.package }}/coverage/lcov-report