Skip to content

Unit Tests

Unit Tests #2049

Workflow file for this run

name: Unit Tests
on:
push:
branches: [ main ]
pull_request: ~
schedule:
# Do not make it the first of the month and/or midnight since it is a very busy time
- cron: "* 10 5 * *"
release:
types: [ created ]
# See https://stackoverflow.com/a/72408109
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
TERM: xterm
jobs:
unit-tests:
runs-on: ubuntu-latest
name: Unit-Tests (PHP ${{ matrix.php.version }}, ${{ matrix.php.dependency }}, ${{ matrix.tools }}) - PHAR ${{ matrix.phar-readonly && 'readonly' || 'writeable' }}${{ matrix.label }}
strategy:
fail-fast: false
matrix:
php:
- version: '8.2'
dependency: locked
composer-options: ''
- version: '8.2'
dependency: lowest
composer-options: ''
- version: '8.2'
dependency: highest
composer-options: ''
- version: '8.3'
dependency: highest
composer-options: --ignore-platform-req=php+
tools:
- 'composer:2.2'
- 'composer:2.3'
- 'composer:2.4'
- 'composer'
phar-readonly: [ true, false ]
php-extra-extensions: [ '' ]
label: [ '' ]
include:
- label: '; bz2 disabled'
php:
version: '8.2'
dependency: locked
composer-options: ''
tools: composer
phar-readonly: false
php-extra-extensions: ', :bz2'
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php.version }}
ini-values: ${{ matrix.phar-readonly && 'phar.readonly=1' || 'phar.readonly=0' }}, display_errors=On, error_reporting=-1
tools: ${{ matrix.tools }}
coverage: none
extensions: ctype, iconv, xml${{ matrix.php-extra-extensions }}
- name: Remove the configured platform on non-locked dependencies
if: ${{ matrix.php.dependency != 'locked' }}
run: composer config platform.php --unset
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
with:
dependency-versions: ${{ matrix.php.dependency }}
composer-options: ${{ matrix.php.composer-options }}
- name: Ensure that the make target is up to date
run: make _vendor_install
- run: make phpunit
infection:
runs-on: ubuntu-latest
name: Infection (PHP ${{ matrix.php }})
strategy:
fail-fast: false
matrix:
php: [ '8.2' ]
if: github.event_name == 'pull_request' || github.event_name == 'push'
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
# The phar.readonly value is adjusted in the Makefile command for
# better portability.
ini-values: phar.readonly=0, display_errors=On, error_reporting=-1
tools: composer
coverage: pcov
extensions: ctype, iconv, xml
- name: Configure the base ref (pull request)
if: github.event_name == 'pull_request'
run: echo "INFECTION_BASE_REF=$GITHUB_BASE_REF" >> $GITHUB_ENV
- name: Configure the base ref (push/release event)
if: github.event_name == 'push'
run: echo "INFECTION_BASE_REF=${{ github.event.before }}" >> $GITHUB_ENV
# Do this before using the Makefile just to avoid accidentally resolving the deferred variables using
# INFECTION_FLAGS.
- name: Configure Infection for the CI
run: |
git fetch origin $INFECTION_BASE_REF
echo "INFECTION_FLAGS=--git-diff-lines --git-diff-base=origin/$INFECTION_BASE_REF --ignore-msi-with-no-mutations --logger-github" >> "$GITHUB_ENV"
- name: Install Composer dependencies
uses: ramsey/composer-install@v3
- name: Ensure that the make target is up to date
run: make _vendor_install
- name: Install Infection
uses: ramsey/composer-install@v3
- name: Ensure that the Infection make target is up to date
run: make infection_install
- name: Run tests with coverage
run: make phpunit_coverage_infection --debug
- run: make _infection_ci --debug
# This is a "trick", a meta task which does not change, and we can use in
# the protected branch rules as opposed to the tests one above which
# may change regularly.
validate-tests:
name: Unit tests status
runs-on: ubuntu-latest
needs:
- unit-tests
- infection
if: always()
steps:
- name: Successful run
if: ${{ !(contains(needs.*.result, 'failure')) }}
run: exit 0
- name: Failing run
if: ${{ contains(needs.*.result, 'failure') }}
run: exit 1