diff --git a/.dockerignore b/.dockerignore index beca6373..e3aff686 100644 --- a/.dockerignore +++ b/.dockerignore @@ -19,7 +19,6 @@ indocker docker-* phpstan.neon php*xml* -infection* **/test* build* **/.* diff --git a/.github/workflows/ci-mutation-tests.yml b/.github/workflows/ci-mutation-tests.yml deleted file mode 100644 index c34902d3..00000000 --- a/.github/workflows/ci-mutation-tests.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Mutation tests - -on: - workflow_call: - inputs: - test-group: - type: string - required: true - description: One of unit, db, api or cli - -jobs: - mutation-tests: - runs-on: ubuntu-22.04 - strategy: - matrix: - php-version: ['8.2', '8.3'] - steps: - - uses: actions/checkout@v4 - - uses: './.github/actions/ci-setup' - with: - php-version: ${{ matrix.php-version }} - extensions-cache-key: mutation-tests-extensions-${{ matrix.php-version }}-${{ inputs.test-group }} - - uses: actions/download-artifact@v4 - with: - name: coverage-${{ inputs.test-group }} - path: build - - name: Resolve infection args - id: infection_args - run: echo "args=--logger-github=false" >> $GITHUB_OUTPUT -# TODO Try to filter mutation tests to improve execution times. Investigate why --git-diff-lines --git-diff-base=develop does not work -# run: | -# BRANCH="${GITHUB_REF#refs/heads/}" | -# if [[ $BRANCH == 'main' || $BRANCH == 'develop' ]]; then -# echo "args=--logger-github=false" >> $GITHUB_OUTPUT -# else -# echo "args=--logger-github=false --git-diff-lines --git-diff-base=develop" >> $GITHUB_OUTPUT -# fi; - shell: bash - - if: ${{ inputs.test-group == 'unit' }} - run: composer infect:ci:unit -- ${{ steps.infection_args.outputs.args }} - env: - INFECTION_BADGE_API_KEY: ${{ secrets.INFECTION_BADGE_API_KEY }} - - if: ${{ inputs.test-group != 'unit' }} - run: composer infect:ci:${{ inputs.test-group }} -- ${{ steps.infection_args.outputs.args }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2eef1afc..64612bb0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,6 @@ on: - '*.md' - '*.xml' - '*.yml*' - - '*.json5' - '*.neon' push: branches: @@ -21,7 +20,6 @@ on: - '*.md' - '*.xml' - '*.yml*' - - '*.json5' - '*.neon' jobs: @@ -79,34 +77,6 @@ jobs: with: platform: 'ms' - unit-mutation-tests: - needs: - - unit-tests - uses: './.github/workflows/ci-mutation-tests.yml' - with: - test-group: unit - - db-mutation-tests: - needs: - - sqlite-db-tests - uses: './.github/workflows/ci-mutation-tests.yml' - with: - test-group: db - - api-mutation-tests: - needs: - - api-tests - uses: './.github/workflows/ci-mutation-tests.yml' - with: - test-group: api - - cli-mutation-tests: - needs: - - cli-tests - uses: './.github/workflows/ci-mutation-tests.yml' - with: - test-group: cli - upload-coverage: needs: - unit-tests @@ -140,10 +110,6 @@ jobs: delete-artifacts: needs: - - unit-mutation-tests - - db-mutation-tests - - api-mutation-tests - - cli-mutation-tests - upload-coverage runs-on: ubuntu-22.04 steps: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e9a77964..4ee94c70 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -124,7 +124,6 @@ Depending on the kind of contribution, maybe not all kinds of tests are needed, * Run `./indocker composer test:api` to run API E2E tests. For these, the Postgres database engine is used. * Run `./indocker composer test:cli` to run CLI E2E tests. For these, the Maria DB database engine is used. -* Run `./indocker composer infect:test` to run both unit and database tests (over sqlite) and then apply mutations to them with [infection](https://infection.github.io/). * Run `./indocker composer ci` to run all previous commands together, parallelizing non-conflicting tasks as much as possible. ## Testing endpoints diff --git a/README.md b/README.md index 2a2d3f6c..21ea1aa2 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,13 @@ [![Build Status](https://img.shields.io/github/actions/workflow/status/shlinkio/shlink/ci.yml?branch=develop&logo=github&style=flat-square)](https://github.com/shlinkio/shlink/actions/workflows/ci.yml?query=workflow%3A%22Continuous+integration%22) [![Code Coverage](https://img.shields.io/codecov/c/gh/shlinkio/shlink/develop?style=flat-square)](https://app.codecov.io/gh/shlinkio/shlink) -[![Infection MSI](https://img.shields.io/endpoint?style=flat-square&url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2Fshlinkio%2Fshlink%2Fdevelop)](https://dashboard.stryker-mutator.io/reports/github.com/shlinkio/shlink/develop) [![Latest Stable Version](https://img.shields.io/github/release/shlinkio/shlink.svg?style=flat-square)](https://packagist.org/packages/shlinkio/shlink) [![Docker pulls](https://img.shields.io/docker/pulls/shlinkio/shlink.svg?logo=docker&style=flat-square)](https://hub.docker.com/r/shlinkio/shlink/) [![License](https://img.shields.io/github/license/shlinkio/shlink.svg?style=flat-square)](https://github.com/shlinkio/shlink/blob/main/LICENSE) + [![Twitter](https://img.shields.io/badge/follow-shlinkio-blue.svg?style=flat-square&logo=x&color=black)](https://twitter.com/shlinkio) [![Mastodon](https://img.shields.io/mastodon/follow/109329425426175098?color=%236364ff&domain=https%3A%2F%2Ffosstodon.org&label=follow&logo=mastodon&logoColor=white&style=flat-square)](https://fosstodon.org/@shlinkio) +[![Bluesky](https://img.shields.io/badge/follow-shlinkio-0285FF.svg?style=flat-square&logo=bluesky&logoColor=white)](https://bsky.app/profile/shlinkio.bsky.social) [![Paypal donate](https://img.shields.io/badge/Donate-paypal-blue.svg?style=flat-square&logo=paypal&colorA=aaaaaa)](https://slnk.to/donate) A PHP-based self-hosted URL shortener that can be used to serve shortened URLs under your own domain. diff --git a/bin/test/run-api-tests.sh b/bin/test/run-api-tests.sh index 27fb1ae2..003d3a8f 100755 --- a/bin/test/run-api-tests.sh +++ b/bin/test/run-api-tests.sh @@ -22,7 +22,7 @@ echo 'Starting server...' -o=logs.channels.server.output="${PWD}/${OUTPUT_LOGS}" & sleep 2 # Let's give the server a couple of seconds to start -vendor/bin/phpunit --order-by=random -c phpunit-api.xml --testdox --colors=always --log-junit=build/coverage-api/junit.xml $* +vendor/bin/phpunit --order-by=random -c phpunit-api.xml --testdox --colors=always $* TESTS_EXIT_CODE=$? [ "$TEST_RUNTIME" = 'rr' ] && bin/rr stop -c=config/roadrunner/.rr.dev.yml -w . -o=http.address=0.0.0.0:9999 diff --git a/composer.json b/composer.json index d17c0631..15e7ab89 100644 --- a/composer.json +++ b/composer.json @@ -62,7 +62,6 @@ "require-dev": { "devizzent/cebe-php-openapi": "^1.0.1", "devster/ubench": "^2.1", - "infection/infection": "^0.27", "phpstan/phpstan": "^1.10", "phpstan/phpstan-doctrine": "^1.3", "phpstan/phpstan-phpunit": "^1.3", @@ -108,8 +107,8 @@ }, "scripts": { "ci": [ - "@parallel cs stan swagger:validate test:unit:ci test:db:sqlite:ci test:db:mysql test:db:maria test:db:postgres test:db:ms", - "@parallel infect:test:api infect:test:cli infect:ci:unit infect:ci:db" + "@parallel cs stan swagger:validate test:unit:ci test:db:sqlite:ci test:db:postgres test:db:mysql test:db:maria test:db:ms", + "@parallel test:api:ci test:cli:ci" ], "cs": "phpcs -s", "cs:fix": "phpcbf", @@ -119,53 +118,27 @@ "@parallel test:api test:cli" ], "test:unit": "@php vendor/bin/phpunit --order-by=random --colors=always --testdox", - "test:unit:ci": "@test:unit --coverage-php=build/coverage-unit.cov --coverage-xml=build/coverage-unit/coverage-xml --log-junit=build/coverage-unit/junit.xml", + "test:unit:ci": "@test:unit --coverage-php=build/coverage-unit.cov", "test:unit:pretty": "@test:unit --coverage-html build/coverage-unit/coverage-html", "test:db": "@parallel test:db:sqlite:ci test:db:mysql test:db:maria test:db:postgres test:db:ms", "test:db:sqlite": "APP_ENV=test php vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-db.xml", - "test:db:sqlite:ci": "@test:db:sqlite --coverage-php build/coverage-db.cov --coverage-xml=build/coverage-db/coverage-xml --log-junit=build/coverage-db/junit.xml", + "test:db:sqlite:ci": "@test:db:sqlite --coverage-php build/coverage-db.cov", "test:db:mysql": "DB_DRIVER=mysql composer test:db:sqlite", "test:db:maria": "DB_DRIVER=maria composer test:db:sqlite", "test:db:postgres": "DB_DRIVER=postgres composer test:db:sqlite", "test:db:ms": "DB_DRIVER=mssql composer test:db:sqlite", "test:api": "bin/test/run-api-tests.sh", - "test:api:ci": "GENERATE_COVERAGE=yes composer test:api && vendor/bin/phpcov merge build/coverage-api --xml build/coverage-api/coverage-xml --php build/coverage-api.cov && rm build/coverage-api/*.cov", + "test:api:ci": "GENERATE_COVERAGE=yes composer test:api && vendor/bin/phpcov merge build/coverage-api --php build/coverage-api.cov && rm build/coverage-api/*.cov", "test:api:pretty": "GENERATE_COVERAGE=yes composer test:api && vendor/bin/phpcov merge build/coverage-api --html build/coverage-api/coverage-html && rm build/coverage-api/*.cov", - "test:cli": "APP_ENV=test DB_DRIVER=maria TEST_ENV=cli php vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-cli.xml --log-junit=build/coverage-cli/junit.xml", - "test:cli:ci": "GENERATE_COVERAGE=yes composer test:cli && vendor/bin/phpcov merge build/coverage-cli --xml build/coverage-cli/coverage-xml --php build/coverage-cli.cov && rm build/coverage-cli/*.cov", + "test:cli": "APP_ENV=test DB_DRIVER=maria TEST_ENV=cli php vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-cli.xml", + "test:cli:ci": "GENERATE_COVERAGE=yes composer test:cli && vendor/bin/phpcov merge build/coverage-cli --php build/coverage-cli.cov && rm build/coverage-cli/*.cov", "test:cli:pretty": "GENERATE_COVERAGE=yes composer test:cli && vendor/bin/phpcov merge build/coverage-cli --html build/coverage-cli/coverage-html && rm build/coverage-cli/*.cov", - "infect:ci:base": "infection --threads=max --only-covered --skip-initial-tests", - "infect:ci:unit": "@infect:ci:base --coverage=build/coverage-unit --min-msi=80", - "infect:ci:db": "@infect:ci:base --coverage=build/coverage-db --min-msi=95 --configuration=infection-db.json5", - "infect:ci:api": "@infect:ci:base --coverage=build/coverage-api --min-msi=95 --configuration=infection-api.json5", - "infect:ci:cli": "@infect:ci:base --coverage=build/coverage-cli --min-msi=90 --configuration=infection-cli.json5", - "infect:ci": "@parallel infect:ci:unit infect:ci:db infect:ci:api infect:ci:cli", - "infect:test": [ - "@parallel test:unit:ci test:db:sqlite:ci test:api:ci", - "@infect:ci" - ], - "infect:test:unit": [ - "@test:unit:ci", - "@infect:ci:unit" - ], - "infect:test:db": [ - "@test:db:sqlite:ci", - "@infect:ci:db" - ], - "infect:test:api": [ - "@test:api:ci", - "@infect:ci:api" - ], - "infect:test:cli": [ - "@test:cli:ci", - "@infect:ci:cli" - ], "swagger:validate": "php-openapi validate docs/swagger/swagger.json", "swagger:inline": "php-openapi inline docs/swagger/swagger.json docs/swagger/swagger-inlined.json", "clean:dev": "rm -f data/database.sqlite && rm -f config/params/generated_config.php" }, "scripts-descriptions": { - "ci": "Alias for \"cs\", \"stan\", \"swagger:validate\", \"test:ci\" and \"infect:ci\"", + "ci": "Alias for \"cs\", \"stan\", \"swagger:validate\" and \"test:ci\"", "cs": "Checks coding styles", "cs:fix": "Fixes coding styles, when possible", "stan": "Inspects code with phpstan", @@ -186,10 +159,6 @@ "test:cli": "Runs CLI test suites", "test:cli:ci": "Runs CLI test suites, and generates code coverage for CI", "test:cli:pretty": "Runs CLI test suites, and generates code coverage in HTML format", - "infect:ci": "Checks unit and db tests quality applying mutation testing with existing reports and logs", - "infect:ci:unit": "Checks unit tests quality applying mutation testing with existing reports and logs", - "infect:ci:db": "Checks db tests quality applying mutation testing with existing reports and logs", - "infect:test": "Runs unit and db tests, then checks tests quality applying mutation testing", "swagger:validate": "Validates the swagger docs, making sure they fulfil the spec", "swagger:inline": "Inlines swagger docs in a single file", "clean:dev": "Deletes artifacts which are gitignored and could affect dev env" @@ -200,7 +169,6 @@ "allow-plugins": { "composer/package-versions-deprecated": true, "dealerdirect/phpcodesniffer-composer-installer": true, - "infection/extension-installer": true, "veewee/composer-run-parallel": true } } diff --git a/infection-api.json5 b/infection-api.json5 deleted file mode 100644 index e2cd08dc..00000000 --- a/infection-api.json5 +++ /dev/null @@ -1,24 +0,0 @@ -{ - source: { - directories: [ - 'module/*/src' - ] - }, - timeout: 5, - logs: { - text: 'build/infection-api/infection-log.txt', - html: 'build/infection-api/infection-log.html', - summary: 'build/infection-api/summary-log.txt', - debug: 'build/infection-api/debug-log.txt' - }, - tmpDir: 'build/infection-api/temp', - phpUnit: { - configDir: '.' - }, - testFrameworkOptions: '--configuration=phpunit-api.xml', - mutators: { - '@default': true, - IdenticalEqual: false, - NotIdenticalNotEqual: false - } -} diff --git a/infection-cli.json5 b/infection-cli.json5 deleted file mode 100644 index cc809fba..00000000 --- a/infection-cli.json5 +++ /dev/null @@ -1,24 +0,0 @@ -{ - source: { - directories: [ - 'module/*/src' - ] - }, - timeout: 5, - logs: { - text: 'build/infection-cli/infection-log.txt', - html: 'build/infection-cli/infection-log.html', - summary: 'build/infection-cli/summary-log.txt', - debug: 'build/infection-cli/debug-log.txt' - }, - tmpDir: 'build/infection-cli/temp', - phpUnit: { - configDir: '.' - }, - testFrameworkOptions: '--configuration=phpunit-cli.xml', - mutators: { - '@default': true, - IdenticalEqual: false, - NotIdenticalNotEqual: false - } -} diff --git a/infection-db.json5 b/infection-db.json5 deleted file mode 100644 index 1f484343..00000000 --- a/infection-db.json5 +++ /dev/null @@ -1,24 +0,0 @@ -{ - source: { - directories: [ - 'module/*/src' - ] - }, - timeout: 5, - logs: { - text: 'build/infection-db/infection-log.txt', - html: 'build/infection-db/infection-log.html', - summary: 'build/infection-db/summary-log.txt', - debug: 'build/infection-db/debug-log.txt' - }, - tmpDir: 'build/infection-db/temp', - phpUnit: { - configDir: '.' - }, - testFrameworkOptions: '--configuration=phpunit-db.xml', - mutators: { - '@default': true, - IdenticalEqual: false, - NotIdenticalNotEqual: false - } -} diff --git a/infection.json5 b/infection.json5 deleted file mode 100644 index 050a08e3..00000000 --- a/infection.json5 +++ /dev/null @@ -1,26 +0,0 @@ -{ - source: { - directories: [ - 'module/*/src' - ] - }, - timeout: 5, - logs: { - text: 'build/infection-unit/infection-log.txt', - html: 'build/infection-unit/infection-log.html', - summary: 'build/infection-unit/summary-log.txt', - debug: 'build/infection-unit/debug-log.txt', - stryker: { - report: 'develop' - } - }, - tmpDir: 'build/infection-unit/temp', - phpUnit: { - configDir: '.' - }, - mutators: { - '@default': true, - IdenticalEqual: false, - NotIdenticalNotEqual: false - } -}