From 849da8d471c0aef351762b0cc22fcd495c5380f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Thu, 1 Oct 2026 10:06:33 +0200 Subject: [PATCH] chore: upgrade phpunit to 12.5 --- .gitignore | 4 +- bin/phpunit | 16 +- composer.json | 2 +- composer.lock | 1229 ++++++++--------- phpunit.xml.dist | 28 +- tests/BusProNet/UserDataHandlerTest.php | 17 +- tests/Command/MyEpImportCommandTest.php | 9 +- tests/Config/SeasonCalendarTest.php | 16 +- tests/Config/SeasonTaskTest.php | 4 +- .../Destination/DestinationTraitTest.php | 4 +- .../Api/ApplicationFormControllerTest.php | 16 +- tests/Email/EmailTextMailRenderingTest.php | 10 +- tests/Email/EmailTextRendererTest.php | 6 +- .../DatevEmailSubscriberTest.php | 29 +- .../EmailNotificationSubscriberTest.php | 6 +- .../InvalidateApplicationsListenerTest.php | 31 +- .../StatisticsChangeSetListenerTest.php | 8 +- tests/Form/AutosizeTextareaTypeTest.php | 1 + tests/Logging/InjectUserProcessorTest.php | 2 +- tests/Logging/UserDataProcessorTest.php | 2 +- tests/Menu/TeamerMenuBackItemTest.php | 3 +- tests/Model/DestinationDtoTest.php | 7 +- tests/Saas/ApiClientTest.php | 3 +- tests/Security/BpnAuthenticatorTest.php | 15 +- tests/Security/MyEpAuthenticatorTest.php | 14 +- tests/Security/OAuth2/MyEpClientTest.php | 4 +- .../DriverLicenseRequiredCheckTest.php | 7 +- .../FinancialDataRequiredCheckTest.php | 12 +- .../MealPreferenceRequiredCheckTest.php | 6 +- ...sonalDataVerificationRequiredCheckTest.php | 6 +- tests/Security/Voter/DispositionVoterTest.php | 23 +- tests/Security/Voter/UploadVoterTest.php | 11 +- tests/Security/Voter/UserVoterTest.php | 11 +- .../Common/AbstractFilterHandlerTest.php | 6 +- .../Common/TeamerFilterHandlerTest.php | 2 +- .../Cron/DispositionStatusServiceTest.php | 8 +- .../Cron/SeasonTaskReminderServiceTest.php | 2 + .../Cron/UploadReminderServiceTest.php | 2 + .../Cron/WorkMonthReminderServiceTest.php | 2 + tests/Service/Pdf/InvoiceApproverTest.php | 19 +- tests/Service/Pdf/InvoiceRendererTest.php | 11 +- .../Saas/WorkHoursSynchronizerTest.php | 21 +- .../Season/SeasonChecklistBuilderTest.php | 4 +- .../Season/SeasonChecklistStatusTest.php | 2 +- .../Season/SeasonTaskSynchronizerTest.php | 7 +- .../Statistics/StatisticsRecorderTest.php | 7 +- .../Teamer/AccountDeletionHandlerTest.php | 4 +- .../Teamer/SeasonDispositionCounterTest.php | 6 +- .../Teamer/TeamerMailingServiceTest.php | 9 +- .../Service/Teamer/TeamerProvisionerTest.php | 4 +- tests/Service/Upload/UploadHandlerTest.php | 6 +- .../ResolvableHotelValidatorTest.php | 2 +- .../SeasonAssignmentValidatorTest.php | 2 + 53 files changed, 832 insertions(+), 856 deletions(-) diff --git a/.gitignore b/.gitignore index f83618e..fb18f95 100644 --- a/.gitignore +++ b/.gitignore @@ -12,11 +12,11 @@ ###> phpunit/phpunit ### /phpunit.xml -.phpunit.result.cache +/.phpunit.cache/ ###< phpunit/phpunit ### ###> symfony/phpunit-bridge ### -.phpunit.result.cache +/.phpunit.cache/ /phpunit.xml ###< symfony/phpunit-bridge ### diff --git a/bin/phpunit b/bin/phpunit index f26f2c7..f695a7b 100755 --- a/bin/phpunit +++ b/bin/phpunit @@ -5,15 +5,9 @@ if (!ini_get('date.timezone')) { ini_set('date.timezone', 'UTC'); } -if (is_file(dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit')) { - define('PHPUNIT_COMPOSER_INSTALL', dirname(__DIR__).'/vendor/autoload.php'); - require PHPUNIT_COMPOSER_INSTALL; - PHPUnit\TextUI\Command::main(); -} else { - if (!is_file(dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) { - echo "Unable to find the `simple-phpunit.php` script in `vendor/symfony/phpunit-bridge/bin/`.\n"; - exit(1); - } - - require dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php'; +if (!is_file(dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit')) { + echo "Unable to find PHPUnit in `vendor/phpunit/phpunit/`. Run `composer install`.\n"; + exit(1); } + +require dirname(__DIR__).'/vendor/phpunit/phpunit/phpunit'; diff --git a/composer.json b/composer.json index 249d254..5da0a30 100644 --- a/composer.json +++ b/composer.json @@ -138,7 +138,7 @@ "fakerphp/faker": "*", "friendsofphp/php-cs-fixer": "^3.84", "marcocesarato/php-conventional-changelog": "^1.17", - "phpunit/phpunit": "^9.5", + "phpunit/phpunit": "^12.5", "rector/rector": "^2.6", "symfony/browser-kit": "7.4.*", "symfony/css-selector": "7.4.*", diff --git a/composer.lock b/composer.lock index 02fbd83..fa7822d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3c22c1470cd1883d7c10f2e9800431e0", + "content-hash": "9ab730ec7f39bde0d54cc51610374d00", "packages": [ { "name": "beberlei/doctrineextensions", @@ -1074,16 +1074,16 @@ }, { "name": "doctrine/lexer", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "e96fe45e92a54233726014a7cc7340abf29bb14c" + "reference": "71d305eaa6480d3d3460c7d053d1da7749fa9cca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e96fe45e92a54233726014a7cc7340abf29bb14c", - "reference": "e96fe45e92a54233726014a7cc7340abf29bb14c", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/71d305eaa6480d3d3460c7d053d1da7749fa9cca", + "reference": "71d305eaa6480d3d3460c7d053d1da7749fa9cca", "shasum": "" }, "require": { @@ -1129,7 +1129,7 @@ ], "support": { "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/3.0.2" + "source": "https://github.com/doctrine/lexer/tree/3.0.3" }, "funding": [ { @@ -1145,7 +1145,7 @@ "type": "tidelift" } ], - "time": "2026-06-14T20:44:06+00:00" + "time": "2026-10-01T06:59:29+00:00" }, { "name": "doctrine/migrations", @@ -3529,16 +3529,16 @@ }, { "name": "monolog/monolog", - "version": "3.12.0", + "version": "3.12.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "72c534fc0ab181ef52d92a68382318631e301608" + "reference": "d7059e4c691d05ea1222b5124bed0f961be46e15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/72c534fc0ab181ef52d92a68382318631e301608", - "reference": "72c534fc0ab181ef52d92a68382318631e301608", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d7059e4c691d05ea1222b5124bed0f961be46e15", + "reference": "d7059e4c691d05ea1222b5124bed0f961be46e15", "shasum": "" }, "require": { @@ -3618,7 +3618,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.12.0" + "source": "https://github.com/Seldaek/monolog/tree/3.12.1" }, "funding": [ { @@ -3630,7 +3630,7 @@ "type": "tidelift" } ], - "time": "2026-09-09T08:34:20+00:00" + "time": "2026-09-29T19:21:12+00:00" }, { "name": "nelmio/security-bundle", @@ -5738,16 +5738,16 @@ }, { "name": "symfony/cache", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "e037fd41e9f8ec9ac270e2a4c76a1992d18d808c" + "reference": "e7e604eab58639503495a46f5c194cc69a9c80a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/e037fd41e9f8ec9ac270e2a4c76a1992d18d808c", - "reference": "e037fd41e9f8ec9ac270e2a4c76a1992d18d808c", + "url": "https://api.github.com/repos/symfony/cache/zipball/e7e604eab58639503495a46f5c194cc69a9c80a8", + "reference": "e7e604eab58639503495a46f5c194cc69a9c80a8", "shasum": "" }, "require": { @@ -5817,7 +5817,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.4.19" + "source": "https://github.com/symfony/cache/tree/v7.4.20" }, "funding": [ { @@ -5837,7 +5837,7 @@ "type": "tidelift" } ], - "time": "2026-09-08T13:28:43+00:00" + "time": "2026-09-29T12:35:16+00:00" }, { "name": "symfony/cache-contracts", @@ -6078,16 +6078,16 @@ }, { "name": "symfony/console", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3a1973458b153f566a8d7499bc06ece323d60063" + "reference": "d7bca2fe05241dc7732d0c8b6d551b879f5d0a7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3a1973458b153f566a8d7499bc06ece323d60063", - "reference": "3a1973458b153f566a8d7499bc06ece323d60063", + "url": "https://api.github.com/repos/symfony/console/zipball/d7bca2fe05241dc7732d0c8b6d551b879f5d0a7d", + "reference": "d7bca2fe05241dc7732d0c8b6d551b879f5d0a7d", "shasum": "" }, "require": { @@ -6152,7 +6152,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.19" + "source": "https://github.com/symfony/console/tree/v7.4.20" }, "funding": [ { @@ -6172,20 +6172,20 @@ "type": "tidelift" } ], - "time": "2026-09-13T10:38:41+00:00" + "time": "2026-09-18T15:55:00+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.4.17", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "f318ac9da5aba0be2cf43ecdd562c05a33bc11c0" + "reference": "a7faee783a87b55f27460fc571f8c639bf9d93a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f318ac9da5aba0be2cf43ecdd562c05a33bc11c0", - "reference": "f318ac9da5aba0be2cf43ecdd562c05a33bc11c0", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a7faee783a87b55f27460fc571f8c639bf9d93a2", + "reference": "a7faee783a87b55f27460fc571f8c639bf9d93a2", "shasum": "" }, "require": { @@ -6236,7 +6236,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.4.17" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.20" }, "funding": [ { @@ -6256,7 +6256,7 @@ "type": "tidelift" } ], - "time": "2026-08-21T17:40:08+00:00" + "time": "2026-09-29T12:35:16+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6331,16 +6331,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "d89437a59232a7e9b294652faea2469f2af66b63" + "reference": "03d285cfe0f633a856e7acb68cecf5964f8494a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d89437a59232a7e9b294652faea2469f2af66b63", - "reference": "d89437a59232a7e9b294652faea2469f2af66b63", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/03d285cfe0f633a856e7acb68cecf5964f8494a7", + "reference": "03d285cfe0f633a856e7acb68cecf5964f8494a7", "shasum": "" }, "require": { @@ -6420,7 +6420,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.4.19" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.4.20" }, "funding": [ { @@ -6440,20 +6440,20 @@ "type": "tidelift" } ], - "time": "2026-09-11T14:46:58+00:00" + "time": "2026-09-28T19:09:50+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "edee21e6307105f0aca6b82a1dc201e6789c5ed1" + "reference": "a34e55dce43e1229bb47555b57ba3c95910988c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/edee21e6307105f0aca6b82a1dc201e6789c5ed1", - "reference": "edee21e6307105f0aca6b82a1dc201e6789c5ed1", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/a34e55dce43e1229bb47555b57ba3c95910988c7", + "reference": "a34e55dce43e1229bb47555b57ba3c95910988c7", "shasum": "" }, "require": { @@ -6466,7 +6466,7 @@ "doctrine/persistence": "<1.3" }, "require-dev": { - "doctrine/persistence": "^1.3|^2|^3", + "doctrine/persistence": "^1.3|^2|^3|^4", "symfony/property-access": "^6.4|^7.0|^8.0", "symfony/serializer": "^6.4|^7.0|^8.0" }, @@ -6496,7 +6496,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v7.4.19" + "source": "https://github.com/symfony/doctrine-messenger/tree/v7.4.20" }, "funding": [ { @@ -6516,7 +6516,7 @@ "type": "tidelift" } ], - "time": "2026-09-13T08:27:19+00:00" + "time": "2026-09-24T08:15:08+00:00" }, { "name": "symfony/dotenv", @@ -6598,16 +6598,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.4.17", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8373921e231e190a88e2ad526951bbaa791576fa" + "reference": "82239fe00f7cdc9f17c4166fff4ebdc22bd26ec0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8373921e231e190a88e2ad526951bbaa791576fa", - "reference": "8373921e231e190a88e2ad526951bbaa791576fa", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/82239fe00f7cdc9f17c4166fff4ebdc22bd26ec0", + "reference": "82239fe00f7cdc9f17c4166fff4ebdc22bd26ec0", "shasum": "" }, "require": { @@ -6656,7 +6656,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.17" + "source": "https://github.com/symfony/error-handler/tree/v7.4.20" }, "funding": [ { @@ -6676,7 +6676,7 @@ "type": "tidelift" } ], - "time": "2026-08-21T17:40:08+00:00" + "time": "2026-09-22T18:56:40+00:00" }, { "name": "symfony/event-dispatcher", @@ -6983,16 +6983,16 @@ }, { "name": "symfony/finder", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "1b900bc6ae5ba60c5eee69c11ba44566190576fe" + "reference": "2dd31e5208db7a0fda7bfc998ad727b79c2e4d1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/1b900bc6ae5ba60c5eee69c11ba44566190576fe", - "reference": "1b900bc6ae5ba60c5eee69c11ba44566190576fe", + "url": "https://api.github.com/repos/symfony/finder/zipball/2dd31e5208db7a0fda7bfc998ad727b79c2e4d1e", + "reference": "2dd31e5208db7a0fda7bfc998ad727b79c2e4d1e", "shasum": "" }, "require": { @@ -7027,7 +7027,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.19" + "source": "https://github.com/symfony/finder/tree/v7.4.20" }, "funding": [ { @@ -7047,7 +7047,7 @@ "type": "tidelift" } ], - "time": "2026-09-10T19:14:10+00:00" + "time": "2026-09-26T06:31:10+00:00" }, { "name": "symfony/flex", @@ -7124,16 +7124,16 @@ }, { "name": "symfony/form", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "ededc326d2e5f271019b37d54c978e67cbc53ae3" + "reference": "a36c175f54bbe0320e096a857d67780053a28f44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/ededc326d2e5f271019b37d54c978e67cbc53ae3", - "reference": "ededc326d2e5f271019b37d54c978e67cbc53ae3", + "url": "https://api.github.com/repos/symfony/form/zipball/a36c175f54bbe0320e096a857d67780053a28f44", + "reference": "a36c175f54bbe0320e096a857d67780053a28f44", "shasum": "" }, "require": { @@ -7203,7 +7203,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.4.19" + "source": "https://github.com/symfony/form/tree/v7.4.20" }, "funding": [ { @@ -7223,20 +7223,20 @@ "type": "tidelift" } ], - "time": "2026-09-15T06:01:15+00:00" + "time": "2026-09-29T12:35:16+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "666aece282b9c6f4664c5d81149b17ac5a0f4732" + "reference": "99786f9338c24770ce4de6a95d049675aa75b129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/666aece282b9c6f4664c5d81149b17ac5a0f4732", - "reference": "666aece282b9c6f4664c5d81149b17ac5a0f4732", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/99786f9338c24770ce4de6a95d049675aa75b129", + "reference": "99786f9338c24770ce4de6a95d049675aa75b129", "shasum": "" }, "require": { @@ -7290,7 +7290,6 @@ "symfony/workflow": "<7.4" }, "require-dev": { - "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^5.2|^6.0", "seld/jsonlint": "^1.10", @@ -7361,7 +7360,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.4.19" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.20" }, "funding": [ { @@ -7381,20 +7380,20 @@ "type": "tidelift" } ], - "time": "2026-09-14T09:18:42+00:00" + "time": "2026-09-28T19:09:50+00:00" }, { "name": "symfony/http-client", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "3a523f38dc399337ec45b2ab9628e8c37ceb23c7" + "reference": "750a420b8dd0af3d6e1c6c1412802abf2cdd2b6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/3a523f38dc399337ec45b2ab9628e8c37ceb23c7", - "reference": "3a523f38dc399337ec45b2ab9628e8c37ceb23c7", + "url": "https://api.github.com/repos/symfony/http-client/zipball/750a420b8dd0af3d6e1c6c1412802abf2cdd2b6c", + "reference": "750a420b8dd0af3d6e1c6c1412802abf2cdd2b6c", "shasum": "" }, "require": { @@ -7462,7 +7461,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.4.19" + "source": "https://github.com/symfony/http-client/tree/v7.4.20" }, "funding": [ { @@ -7482,7 +7481,7 @@ "type": "tidelift" } ], - "time": "2026-09-08T13:28:43+00:00" + "time": "2026-09-24T11:02:13+00:00" }, { "name": "symfony/http-client-contracts", @@ -7568,16 +7567,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f7b953be7801974a5a0685e1228bbc3b12b35936" + "reference": "9d0761c0da6bd5b801b401666834901a9a1ffc33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f7b953be7801974a5a0685e1228bbc3b12b35936", - "reference": "f7b953be7801974a5a0685e1228bbc3b12b35936", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9d0761c0da6bd5b801b401666834901a9a1ffc33", + "reference": "9d0761c0da6bd5b801b401666834901a9a1ffc33", "shasum": "" }, "require": { @@ -7626,7 +7625,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.19" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.20" }, "funding": [ { @@ -7646,20 +7645,20 @@ "type": "tidelift" } ], - "time": "2026-09-14T17:41:17+00:00" + "time": "2026-09-24T07:12:44+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "683507424cc84ca85ac1551adb609b6b98216667" + "reference": "392784b5d7b959b8d872542a2530c50c540a788f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/683507424cc84ca85ac1551adb609b6b98216667", - "reference": "683507424cc84ca85ac1551adb609b6b98216667", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/392784b5d7b959b8d872542a2530c50c540a788f", + "reference": "392784b5d7b959b8d872542a2530c50c540a788f", "shasum": "" }, "require": { @@ -7745,7 +7744,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.19" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.20" }, "funding": [ { @@ -7765,7 +7764,7 @@ "type": "tidelift" } ], - "time": "2026-09-15T07:09:35+00:00" + "time": "2026-09-29T14:05:16+00:00" }, { "name": "symfony/intl", @@ -8016,16 +8015,16 @@ }, { "name": "symfony/messenger", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "4070504211a16c4237247f7b2a91143c3a1f4e51" + "reference": "4cf94f12c9e899a87e6b6bf800dffcb709585410" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/4070504211a16c4237247f7b2a91143c3a1f4e51", - "reference": "4070504211a16c4237247f7b2a91143c3a1f4e51", + "url": "https://api.github.com/repos/symfony/messenger/zipball/4cf94f12c9e899a87e6b6bf800dffcb709585410", + "reference": "4cf94f12c9e899a87e6b6bf800dffcb709585410", "shasum": "" }, "require": { @@ -8086,7 +8085,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v7.4.19" + "source": "https://github.com/symfony/messenger/tree/v7.4.20" }, "funding": [ { @@ -8106,7 +8105,7 @@ "type": "tidelift" } ], - "time": "2026-09-14T15:23:30+00:00" + "time": "2026-09-29T06:38:53+00:00" }, { "name": "symfony/mime", @@ -8594,16 +8593,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.41.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", - "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5cac8f4db97208823aa353f59a01faad2da52c75", + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75", "shasum": "" }, "require": { @@ -8652,7 +8651,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.43.0" }, "funding": [ { @@ -8672,20 +8671,20 @@ "type": "tidelift" } ], - "time": "2026-07-28T08:25:59+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.38.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "445c90e341fccda10311019cf82ff73bb7343945" + "reference": "d13cf82f40af144e5e5a867dc54ec3c7b4544b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/445c90e341fccda10311019cf82ff73bb7343945", - "reference": "445c90e341fccda10311019cf82ff73bb7343945", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d13cf82f40af144e5e5a867dc54ec3c7b4544b2e", + "reference": "d13cf82f40af144e5e5a867dc54ec3c7b4544b2e", "shasum": "" }, "require": { @@ -8740,7 +8739,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.38.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.43.0" }, "funding": [ { @@ -8760,20 +8759,20 @@ "type": "tidelift" } ], - "time": "2026-05-25T11:52:53+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.42.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "51b5ff5ba85452b31ec6f55490b08148612339d9" + "reference": "533d68cf99c8f8ee2e8893c59ed59192e92cfd74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/51b5ff5ba85452b31ec6f55490b08148612339d9", - "reference": "51b5ff5ba85452b31ec6f55490b08148612339d9", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/533d68cf99c8f8ee2e8893c59ed59192e92cfd74", + "reference": "533d68cf99c8f8ee2e8893c59ed59192e92cfd74", "shasum": "" }, "require": { @@ -8827,7 +8826,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.42.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.43.0" }, "funding": [ { @@ -8847,20 +8846,20 @@ "type": "tidelift" } ], - "time": "2026-08-24T10:51:20+00:00" + "time": "2026-09-23T14:40:04+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.42.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502" + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502", - "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/ebd57ccc7edb93d632e184efbe7693d2517bab3b", + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b", "shasum": "" }, "require": { @@ -8912,7 +8911,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.43.0" }, "funding": [ { @@ -8932,20 +8931,20 @@ "type": "tidelift" } ], - "time": "2026-08-07T06:33:24+00:00" + "time": "2026-09-23T22:02:09+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.38.2", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", - "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", "shasum": "" }, "require": { @@ -8997,7 +8996,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.0" }, "funding": [ { @@ -9017,20 +9016,20 @@ "type": "tidelift" } ], - "time": "2026-05-27T06:59:30+00:00" + "time": "2026-09-24T15:19:04+00:00" }, { "name": "symfony/polyfill-php82", - "version": "v1.38.1", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php82.git", - "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b" + "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", - "reference": "002dc0cfe5fd4ed6033d48f27d4f19a486c4b04b", + "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/843bbe8b2a7934307b749751eede0f111f5d1cfc", + "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc", "shasum": "" }, "require": { @@ -9077,7 +9076,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php82/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.43.0" }, "funding": [ { @@ -9097,20 +9096,20 @@ "type": "tidelift" } ], - "time": "2026-05-26T12:45:58+00:00" + "time": "2026-09-25T15:50:05+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.41.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6" + "reference": "80ccff923a8d61f73ebe9da0aa94e25232f004ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/5ea99087fb99c273a9b9236ed4c31e78b16103c6", - "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/80ccff923a8d61f73ebe9da0aa94e25232f004ce", + "reference": "80ccff923a8d61f73ebe9da0aa94e25232f004ce", "shasum": "" }, "require": { @@ -9157,7 +9156,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.41.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.43.0" }, "funding": [ { @@ -9177,20 +9176,20 @@ "type": "tidelift" } ], - "time": "2026-07-01T12:47:55+00:00" + "time": "2026-09-25T15:50:05+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.38.1", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + "reference": "22c6548499cbe5c5bb072fc0c42312dff062a015" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", - "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/22c6548499cbe5c5bb072fc0c42312dff062a015", + "reference": "22c6548499cbe5c5bb072fc0c42312dff062a015", "shasum": "" }, "require": { @@ -9237,7 +9236,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.43.0" }, "funding": [ { @@ -9257,20 +9256,20 @@ "type": "tidelift" } ], - "time": "2026-05-26T12:51:13+00:00" + "time": "2026-09-23T22:01:09+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.41.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" + "reference": "86a42cbcc07adc331481a5ab310a4024bfc227f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", - "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/86a42cbcc07adc331481a5ab310a4024bfc227f6", + "reference": "86a42cbcc07adc331481a5ab310a4024bfc227f6", "shasum": "" }, "require": { @@ -9317,7 +9316,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.43.0" }, "funding": [ { @@ -9337,20 +9336,20 @@ "type": "tidelift" } ], - "time": "2026-07-01T12:47:55+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/polyfill-php86", - "version": "v1.41.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php86.git", - "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e" + "reference": "8840df45b24f33a49dc419fa18dc0057231ae1d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/6bc356ed3d8dbfeea8f0de235e34d670704e880e", - "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e", + "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/8840df45b24f33a49dc419fa18dc0057231ae1d8", + "reference": "8840df45b24f33a49dc419fa18dc0057231ae1d8", "shasum": "" }, "require": { @@ -9397,7 +9396,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php86/tree/v1.41.0" + "source": "https://github.com/symfony/polyfill-php86/tree/v1.43.0" }, "funding": [ { @@ -9417,20 +9416,20 @@ "type": "tidelift" } ], - "time": "2026-07-02T13:42:24+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.37.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" + "reference": "b23ff8245cc5c4479ea2be3d0132d2e6dd433993" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", - "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/b23ff8245cc5c4479ea2be3d0132d2e6dd433993", + "reference": "b23ff8245cc5c4479ea2be3d0132d2e6dd433993", "shasum": "" }, "require": { @@ -9480,7 +9479,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.43.0" }, "funding": [ { @@ -9500,7 +9499,7 @@ "type": "tidelift" } ], - "time": "2026-04-10T16:19:22+00:00" + "time": "2026-09-24T05:20:52+00:00" }, { "name": "symfony/process", @@ -9650,16 +9649,16 @@ }, { "name": "symfony/property-info", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "547d2acbe865d511809b96ab653304fd632abbaa" + "reference": "d24c4c810b1285c5d8d77c6fd7b25e714479bd48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/547d2acbe865d511809b96ab653304fd632abbaa", - "reference": "547d2acbe865d511809b96ab653304fd632abbaa", + "url": "https://api.github.com/repos/symfony/property-info/zipball/d24c4c810b1285c5d8d77c6fd7b25e714479bd48", + "reference": "d24c4c810b1285c5d8d77c6fd7b25e714479bd48", "shasum": "" }, "require": { @@ -9716,7 +9715,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.19" + "source": "https://github.com/symfony/property-info/tree/v7.4.20" }, "funding": [ { @@ -9736,20 +9735,20 @@ "type": "tidelift" } ], - "time": "2026-09-04T10:11:42+00:00" + "time": "2026-09-28T09:47:41+00:00" }, { "name": "symfony/routing", - "version": "v7.4.18", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ddd558991e98f693ae6bf5063cc1b0362c6bbec3" + "reference": "2bacb72be5eadeaf9874d5accb75bfb33d21c74b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ddd558991e98f693ae6bf5063cc1b0362c6bbec3", - "reference": "ddd558991e98f693ae6bf5063cc1b0362c6bbec3", + "url": "https://api.github.com/repos/symfony/routing/zipball/2bacb72be5eadeaf9874d5accb75bfb33d21c74b", + "reference": "2bacb72be5eadeaf9874d5accb75bfb33d21c74b", "shasum": "" }, "require": { @@ -9801,7 +9800,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.18" + "source": "https://github.com/symfony/routing/tree/v7.4.20" }, "funding": [ { @@ -9821,7 +9820,7 @@ "type": "tidelift" } ], - "time": "2026-08-17T13:12:36+00:00" + "time": "2026-09-28T19:09:50+00:00" }, { "name": "symfony/runtime", @@ -9910,16 +9909,16 @@ }, { "name": "symfony/security-bundle", - "version": "v7.4.18", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "caaa8b92f2657a6b99057f4da36ee89f3baab506" + "reference": "a2a8dc7ab9d5d90d5937963a4ef1b9c8e3e7258c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/caaa8b92f2657a6b99057f4da36ee89f3baab506", - "reference": "caaa8b92f2657a6b99057f4da36ee89f3baab506", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/a2a8dc7ab9d5d90d5937963a4ef1b9c8e3e7258c", + "reference": "a2a8dc7ab9d5d90d5937963a4ef1b9c8e3e7258c", "shasum": "" }, "require": { @@ -9960,6 +9959,7 @@ "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", "symfony/http-client": "^6.4|^7.0|^8.0", "symfony/ldap": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", "symfony/process": "^6.4|^7.0|^8.0", "symfony/rate-limiter": "^6.4|^7.0|^8.0", "symfony/runtime": "^6.4.13|^7.1.6|^8.0", @@ -9998,7 +9998,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v7.4.18" + "source": "https://github.com/symfony/security-bundle/tree/v7.4.20" }, "funding": [ { @@ -10018,20 +10018,20 @@ "type": "tidelift" } ], - "time": "2026-08-30T17:23:54+00:00" + "time": "2026-09-24T11:02:13+00:00" }, { "name": "symfony/security-core", - "version": "v7.4.18", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "4fac226354298b8d66f680275b0daef1d3f580d2" + "reference": "4e5c01656aa79e6d463fde45117041ebccbaf829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/4fac226354298b8d66f680275b0daef1d3f580d2", - "reference": "4fac226354298b8d66f680275b0daef1d3f580d2", + "url": "https://api.github.com/repos/symfony/security-core/zipball/4e5c01656aa79e6d463fde45117041ebccbaf829", + "reference": "4e5c01656aa79e6d463fde45117041ebccbaf829", "shasum": "" }, "require": { @@ -10090,7 +10090,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.4.18" + "source": "https://github.com/symfony/security-core/tree/v7.4.20" }, "funding": [ { @@ -10110,7 +10110,7 @@ "type": "tidelift" } ], - "time": "2026-08-30T00:47:26+00:00" + "time": "2026-09-28T16:00:27+00:00" }, { "name": "symfony/security-csrf", @@ -10188,16 +10188,16 @@ }, { "name": "symfony/security-http", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "c13182ec07b8a0c5316505a4c9c51948f87d87bb" + "reference": "5fa566b8bfbb398cded6988f059c3d97506ed692" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/c13182ec07b8a0c5316505a4c9c51948f87d87bb", - "reference": "c13182ec07b8a0c5316505a4c9c51948f87d87bb", + "url": "https://api.github.com/repos/symfony/security-http/zipball/5fa566b8bfbb398cded6988f059c3d97506ed692", + "reference": "5fa566b8bfbb398cded6988f059c3d97506ed692", "shasum": "" }, "require": { @@ -10256,7 +10256,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.4.19" + "source": "https://github.com/symfony/security-http/tree/v7.4.20" }, "funding": [ { @@ -10276,20 +10276,20 @@ "type": "tidelift" } ], - "time": "2026-09-15T06:01:15+00:00" + "time": "2026-09-28T18:33:58+00:00" }, { "name": "symfony/serializer", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "d631b82e0db971444651c4e6a076040d20878caa" + "reference": "67c5b0b2ef39863835f43b9c34dcb3af80b892cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/d631b82e0db971444651c4e6a076040d20878caa", - "reference": "d631b82e0db971444651c4e6a076040d20878caa", + "url": "https://api.github.com/repos/symfony/serializer/zipball/67c5b0b2ef39863835f43b9c34dcb3af80b892cf", + "reference": "67c5b0b2ef39863835f43b9c34dcb3af80b892cf", "shasum": "" }, "require": { @@ -10360,7 +10360,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.4.19" + "source": "https://github.com/symfony/serializer/tree/v7.4.20" }, "funding": [ { @@ -10380,7 +10380,7 @@ "type": "tidelift" } ], - "time": "2026-09-08T13:28:43+00:00" + "time": "2026-09-28T09:39:38+00:00" }, { "name": "symfony/service-contracts", @@ -11088,16 +11088,16 @@ }, { "name": "symfony/type-info", - "version": "v7.4.17", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "62d0ad6995630a4f7ea8fd270aadb3e2545c8e31" + "reference": "bbaaf3366400f5c85f66800b955c77b46e8abad2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/62d0ad6995630a4f7ea8fd270aadb3e2545c8e31", - "reference": "62d0ad6995630a4f7ea8fd270aadb3e2545c8e31", + "url": "https://api.github.com/repos/symfony/type-info/zipball/bbaaf3366400f5c85f66800b955c77b46e8abad2", + "reference": "bbaaf3366400f5c85f66800b955c77b46e8abad2", "shasum": "" }, "require": { @@ -11147,7 +11147,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.4.17" + "source": "https://github.com/symfony/type-info/tree/v7.4.20" }, "funding": [ { @@ -11167,20 +11167,20 @@ "type": "tidelift" } ], - "time": "2026-08-21T15:52:48+00:00" + "time": "2026-09-28T12:19:37+00:00" }, { "name": "symfony/uid", - "version": "v7.4.17", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "69d732355a139c6f8881337d28515aa01f12b8be" + "reference": "a96bbdb02a04ff3b5592cee6741b03edc78b56aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/69d732355a139c6f8881337d28515aa01f12b8be", - "reference": "69d732355a139c6f8881337d28515aa01f12b8be", + "url": "https://api.github.com/repos/symfony/uid/zipball/a96bbdb02a04ff3b5592cee6741b03edc78b56aa", + "reference": "a96bbdb02a04ff3b5592cee6741b03edc78b56aa", "shasum": "" }, "require": { @@ -11225,7 +11225,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.17" + "source": "https://github.com/symfony/uid/tree/v7.4.20" }, "funding": [ { @@ -11245,7 +11245,7 @@ "type": "tidelift" } ], - "time": "2026-08-11T07:38:58+00:00" + "time": "2026-09-23T16:18:28+00:00" }, { "name": "symfony/ux-twig-component", @@ -11338,16 +11338,16 @@ }, { "name": "symfony/validator", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "a6d275d96d107fb2000dae04ab23b2e0c29ceb66" + "reference": "75a30e116016554477f662e106fd8e337f0c4dac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/a6d275d96d107fb2000dae04ab23b2e0c29ceb66", - "reference": "a6d275d96d107fb2000dae04ab23b2e0c29ceb66", + "url": "https://api.github.com/repos/symfony/validator/zipball/75a30e116016554477f662e106fd8e337f0c4dac", + "reference": "75a30e116016554477f662e106fd8e337f0c4dac", "shasum": "" }, "require": { @@ -11418,7 +11418,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.4.19" + "source": "https://github.com/symfony/validator/tree/v7.4.20" }, "funding": [ { @@ -11438,7 +11438,7 @@ "type": "tidelift" } ], - "time": "2026-09-09T19:50:33+00:00" + "time": "2026-09-29T12:35:16+00:00" }, { "name": "symfony/var-dumper", @@ -11773,16 +11773,16 @@ }, { "name": "symfony/workflow", - "version": "v7.4.9", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/workflow.git", - "reference": "0c7651c6c8f152348184d3dc3e7b40039c87d5d0" + "reference": "9abec938b46f894b1f11d6405f4f58c72e560154" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/workflow/zipball/0c7651c6c8f152348184d3dc3e7b40039c87d5d0", - "reference": "0c7651c6c8f152348184d3dc3e7b40039c87d5d0", + "url": "https://api.github.com/repos/symfony/workflow/zipball/9abec938b46f894b1f11d6405f4f58c72e560154", + "reference": "9abec938b46f894b1f11d6405f4f58c72e560154", "shasum": "" }, "require": { @@ -11843,7 +11843,7 @@ "workflow" ], "support": { - "source": "https://github.com/symfony/workflow/tree/v7.4.9" + "source": "https://github.com/symfony/workflow/tree/v7.4.20" }, "funding": [ { @@ -11863,20 +11863,20 @@ "type": "tidelift" } ], - "time": "2026-04-18T13:18:21+00:00" + "time": "2026-09-21T16:59:34+00:00" }, { "name": "symfony/yaml", - "version": "v7.4.18", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4cef939e55b8a21c5780418de0d98ab00d0736e1" + "reference": "0222bf4dfaa1e3ceb8fff579635d655f2950d5a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4cef939e55b8a21c5780418de0d98ab00d0736e1", - "reference": "4cef939e55b8a21c5780418de0d98ab00d0736e1", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0222bf4dfaa1e3ceb8fff579635d655f2950d5a7", + "reference": "0222bf4dfaa1e3ceb8fff579635d655f2950d5a7", "shasum": "" }, "require": { @@ -11919,7 +11919,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.18" + "source": "https://github.com/symfony/yaml/tree/v7.4.20" }, "funding": [ { @@ -11939,7 +11939,7 @@ "type": "tidelift" } ], - "time": "2026-08-30T00:47:26+00:00" + "time": "2026-09-26T06:31:10+00:00" }, { "name": "twig/extra-bundle", @@ -12950,16 +12950,16 @@ }, { "name": "fidry/cpu-core-counter", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "7cbeb03e286fa81b2bbe0e6bd6b8a27c71a3144d" + "reference": "d384a7d0d6e67aa497327260ca95023e92dc2032" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/7cbeb03e286fa81b2bbe0e6bd6b8a27c71a3144d", - "reference": "7cbeb03e286fa81b2bbe0e6bd6b8a27c71a3144d", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/d384a7d0d6e67aa497327260ca95023e92dc2032", + "reference": "d384a7d0d6e67aa497327260ca95023e92dc2032", "shasum": "" }, "require": { @@ -13000,7 +13000,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.4.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.4.1" }, "funding": [ { @@ -13008,7 +13008,7 @@ "type": "github" } ], - "time": "2026-09-27T17:40:20+00:00" + "time": "2026-09-29T22:11:39+00:00" }, { "name": "friendsofphp/php-cs-fixer", @@ -13493,35 +13493,33 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.32", + "version": "12.5.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + "reference": "186dab580576598076de6818596d12b61801880e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", + "reference": "186dab580576598076de6818596d12b61801880e", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-text-template": "^2.0.4", - "sebastian/code-unit-reverse-lookup": "^2.0.3", - "sebastian/complexity": "^2.0.3", - "sebastian/environment": "^5.1.5", - "sebastian/lines-of-code": "^1.0.4", - "sebastian/version": "^3.0.2", - "theseer/tokenizer": "^1.2.3" + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.1.2", + "sebastian/lines-of-code": "^4.0.1", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^12.5.28" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -13530,7 +13528,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "9.2.x-dev" + "dev-main": "12.5.x-dev" } }, "autoload": { @@ -13559,40 +13557,52 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.7" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2024-08-22T04:23:01+00:00" + "time": "2026-06-01T13:24:19+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "a248d1640ab059b075f53a2ef0f9856e864e06b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a248d1640ab059b075f53a2ef0f9856e864e06b5", + "reference": "a248d1640ab059b075f53a2ef0f9856e864e06b5", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.5.33" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -13619,36 +13629,49 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2026-08-25T14:40:53+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-pcntl": "*" @@ -13656,7 +13679,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -13682,7 +13705,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" }, "funding": [ { @@ -13690,32 +13714,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -13741,7 +13765,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" }, "funding": [ { @@ -13749,32 +13774,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2025-02-07T04:59:16+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -13800,7 +13825,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" }, "funding": [ { @@ -13808,54 +13834,49 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "9.6.37", + "version": "12.5.37", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "aceaa623912caf8e80bffea22fc4103a0a01565f" + "reference": "684340c1590e5f3f3b859f5e80619725d88b63ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/aceaa623912caf8e80bffea22fc4103a0a01565f", - "reference": "aceaa623912caf8e80bffea22fc4103a0a01565f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/684340c1590e5f3f3b859f5e80619725d88b63ba", + "reference": "684340c1590e5f3f3b859f5e80619725d88b63ba", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-filter": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", + "myclabs/deep-copy": "^1.14.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.32", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.4", - "phpunit/php-timer": "^5.0.3", - "sebastian/cli-parser": "^1.0.2", - "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.10", - "sebastian/diff": "^4.0.6", - "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.9", - "sebastian/global-state": "^5.0.8", - "sebastian/object-enumerator": "^4.0.4", - "sebastian/resource-operations": "^3.0.4", - "sebastian/type": "^3.2.1", - "sebastian/version": "^3.0.2" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.7", + "phpunit/php-file-iterator": "^6.0.2", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.1", + "sebastian/comparator": "^7.1.8", + "sebastian/diff": "^7.0.1", + "sebastian/environment": "^8.1.2", + "sebastian/exporter": "^7.0.3", + "sebastian/global-state": "^8.0.3", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", + "sebastian/type": "^6.0.4", + "sebastian/version": "^6.0.0", + "staabm/side-effects-detector": "^1.0.5" }, "bin": [ "phpunit" @@ -13863,7 +13884,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-main": "12.5-dev" } }, "autoload": { @@ -13895,7 +13916,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.37" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.37" }, "funding": [ { @@ -13903,7 +13924,7 @@ "type": "other" } ], - "time": "2026-09-23T09:59:59+00:00" + "time": "2026-09-29T12:08:54+00:00" }, { "name": "react/cache", @@ -14490,28 +14511,28 @@ }, { "name": "sebastian/cli-parser", - "version": "1.0.2", + "version": "4.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15", + "reference": "7d05781b13f7dec9043a629a21d086ed74582a15", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -14534,153 +14555,60 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2024-03-02T06:27:43+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2026-05-17T05:29:34+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.10", + "version": "7.1.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d" + "reference": "7c65c1e79836812819705b473a90c12399542485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d", - "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485", + "reference": "7c65c1e79836812819705b473a90c12399542485", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.5.25" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -14719,7 +14647,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.8" }, "funding": [ { @@ -14739,33 +14668,33 @@ "type": "tidelift" } ], - "time": "2026-01-24T09:22:56+00:00" + "time": "2026-05-21T04:45:25+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.3", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" + "nikic/php-parser": "^5.0", + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -14788,7 +14717,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { @@ -14796,33 +14726,33 @@ "type": "github" } ], - "time": "2023-12-22T06:19:30+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { "name": "sebastian/diff", - "version": "4.0.6", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + "reference": "cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6", + "reference": "cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^12.5.33", + "symfony/process": "^7.4.17" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -14854,35 +14784,48 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/diff", + "type": "tidelift" } ], - "time": "2024-03-02T06:30:58+00:00" + "time": "2026-08-25T15:35:54+00:00" }, { "name": "sebastian/environment", - "version": "5.1.5", + "version": "8.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439", + "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.5.26" }, "suggest": { "ext-posix": "*" @@ -14890,7 +14833,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -14909,7 +14852,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -14917,42 +14860,55 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2023-02-03T06:03:51+00:00" + "time": "2026-05-25T13:40:20+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.9", + "version": "7.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "4352c1a3df741a7ba9e61af6fed51d1fee41cbf7" + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/4352c1a3df741a7ba9e61af6fed51d1fee41cbf7", - "reference": "4352c1a3df741a7ba9e61af6fed51d1fee41cbf7", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", + "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.3", + "sebastian/recursion-context": "^7.0.1" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -14994,7 +14950,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.9" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.3" }, "funding": [ { @@ -15014,38 +14971,35 @@ "type": "tidelift" } ], - "time": "2026-08-11T04:55:59+00:00" + "time": "2026-05-20T04:37:17+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.8", + "version": "8.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", - "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9", + "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0.1" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^12.5.28" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -15064,13 +15018,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.3" }, "funding": [ { @@ -15090,33 +15045,33 @@ "type": "tidelift" } ], - "time": "2025-08-10T07:10:35+00:00" + "time": "2026-06-01T15:10:33+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.4", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e", + "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" + "nikic/php-parser": "^5.7.0", + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -15139,42 +15094,55 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code", + "type": "tidelift" } ], - "time": "2023-12-22T06:20:34+00:00" + "time": "2026-05-19T16:22:07+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -15196,7 +15164,8 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { @@ -15204,32 +15173,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -15251,7 +15220,8 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { @@ -15259,32 +15229,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.7", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "c85be6922b7fd365942b986b9a50397d65407611" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/c85be6922b7fd365942b986b9a50397d65407611", - "reference": "c85be6922b7fd365942b986b9a50397d65407611", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -15314,7 +15284,8 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.7" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { @@ -15334,86 +15305,32 @@ "type": "tidelift" } ], - "time": "2026-08-11T05:25:24+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-14T16:00:52+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "3.2.1", + "version": "6.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "reference": "82ff822c2edc46724be9f7411d3163021f602773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773", + "reference": "82ff822c2edc46724be9f7411d3163021f602773", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^12.5.25" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -15436,37 +15353,50 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2026-05-20T06:45:45+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -15489,7 +15419,8 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { @@ -15497,7 +15428,59 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" }, { "name": "symfony/browser-kit", @@ -15975,16 +15958,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v7.4.19", + "version": "v7.4.20", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "f9c5fed39f307b23c47e8a11c431d848390f8a67" + "reference": "916c2a4edf51270a5173a57d8d3936c02a4543a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/f9c5fed39f307b23c47e8a11c431d848390f8a67", - "reference": "f9c5fed39f307b23c47e8a11c431d848390f8a67", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/916c2a4edf51270a5173a57d8d3936c02a4543a1", + "reference": "916c2a4edf51270a5173a57d8d3936c02a4543a1", "shasum": "" }, "require": { @@ -16041,7 +16024,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.19" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.20" }, "funding": [ { @@ -16061,27 +16044,27 @@ "type": "tidelift" } ], - "time": "2026-09-04T10:11:42+00:00" + "time": "2026-09-28T19:09:50+00:00" }, { "name": "theseer/tokenizer", - "version": "1.3.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -16103,7 +16086,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { @@ -16111,7 +16094,7 @@ "type": "github" } ], - "time": "2025-11-17T20:03:58+00:00" + "time": "2025-12-08T11:19:18+00:00" } ], "aliases": [], @@ -16128,7 +16111,7 @@ }, "platform-dev": {}, "platform-overrides": { - "php": "8.4.24" + "php": "8.5.9" }, "plugin-api-version": "2.9.0" } diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 6915d12..2e431a5 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,20 +1,26 @@ - + - - @@ -23,13 +29,15 @@ - + + - src + src - + - - - + + + diff --git a/tests/BusProNet/UserDataHandlerTest.php b/tests/BusProNet/UserDataHandlerTest.php index eec0db4..6b08219 100644 --- a/tests/BusProNet/UserDataHandlerTest.php +++ b/tests/BusProNet/UserDataHandlerTest.php @@ -15,10 +15,12 @@ use App\Entity\Teamer; use App\Entity\User; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; +#[AllowMockObjectsWithoutExpectations] class UserDataHandlerTest extends TestCase { private EntityManagerInterface&MockObject $entityManager; @@ -30,9 +32,7 @@ class UserDataHandlerTest extends TestCase $this->logger = $this->createMock(LoggerInterface::class); } - /** - * @dataProvider collectRolesProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('collectRolesProvider')] public function testCollectRolesImportsAdministrativeRolesAsPendingOnly(CrmAttributesResponse $crmAttributes, array $expectedRoles): void { $handler = new UserDataHandler($this->entityManager, $this->logger); @@ -86,9 +86,8 @@ class UserDataHandlerTest extends TestCase /** * The role policy has to be identical whichever identity source claims the role, so * toPendingRoles() must agree with collectPendingRoles() on equivalent input. - * - * @dataProvider toPendingRolesProvider */ + #[\PHPUnit\Framework\Attributes\DataProvider('toPendingRolesProvider')] public function testToPendingRolesMatchesTheCrmPolicy(array $claimedRoles, CrmAttributesResponse $crmAttributes, array $expectedRoles): void { $handler = new UserDataHandler($this->entityManager, $this->logger); @@ -231,9 +230,7 @@ class UserDataHandlerTest extends TestCase $this->assertSame('new.user@example.com', $teamer->getCommunication()?->getEmail()); } - /** - * @dataProvider pendingRolesProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('pendingRolesProvider')] public function testUpdateLocalUserRefreshesThePendingRoles( array $roles, array $claimedRoles, @@ -441,9 +438,7 @@ class UserDataHandlerTest extends TestCase $this->assertSame([User::PENDING_ROLES['ROLE_HOUSE_MANAGER']], $user->getPendingRoles()); } - /** - * @dataProvider unapprovableRoleProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('unapprovableRoleProvider')] public function testApproveRoleRefusesARoleWithoutANomination(array $roles, string $role): void { $user = (new User()) diff --git a/tests/Command/MyEpImportCommandTest.php b/tests/Command/MyEpImportCommandTest.php index 85f0f23..b362c18 100644 --- a/tests/Command/MyEpImportCommandTest.php +++ b/tests/Command/MyEpImportCommandTest.php @@ -11,6 +11,7 @@ use App\MyEp\Import\TravelExport; use App\MyEp\Import\TravelExportClient; use Doctrine\DBAL\Connection; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; use Symfony\Component\Console\Command\Command; @@ -87,7 +88,7 @@ class MyEpImportCommandTest extends TestCase public function testItRefusesToRunWhenTheExportCannotBeRead(): void { - $client = $this->createMock(TravelExportClient::class); + $client = $this->createStub(TravelExportClient::class); $client->method('fetchAll')->willThrowException(new ApiException('gateway timeout')); $tester = new CommandTester(new MyEpImportCommand( @@ -184,7 +185,7 @@ class MyEpImportCommandTest extends TestCase int $skipped = 0, int $pickupsWithoutMasterData = 0, ): CommandTester { - $client = $this->createMock(TravelExportClient::class); + $client = $this->createStub(TravelExportClient::class); $client->method('fetchAll')->willReturn( new TravelExport($rows, $skipped, $pickupsWithoutMasterData, '2026-09-29T03:20:00+02:00') ); @@ -212,9 +213,9 @@ class MyEpImportCommandTest extends TestCase return $connection; } - private function writingConnection(int $existingId): Connection&MockObject + private function writingConnection(int $existingId): Connection&Stub { - $connection = $this->createMock(Connection::class); + $connection = $this->createStub(Connection::class); $connection->method('fetchOne')->willReturn($existingId); return $connection; diff --git a/tests/Config/SeasonCalendarTest.php b/tests/Config/SeasonCalendarTest.php index fa8aa6b..6b7f34d 100644 --- a/tests/Config/SeasonCalendarTest.php +++ b/tests/Config/SeasonCalendarTest.php @@ -14,9 +14,7 @@ class SeasonCalendarTest extends TestCase return new SeasonCalendar('11-01', '04-01'); } - /** - * @dataProvider winterDates - */ + #[\PHPUnit\Framework\Attributes\DataProvider('winterDates')] public function testSeasonYearForTheWrappingWinterWindow(string $date, ?int $expected): void { $this->assertSame($expected, $this->winter()->seasonYearFor(new \DateTimeImmutable($date))); @@ -44,9 +42,7 @@ class SeasonCalendarTest extends TestCase $this->assertSame('außerhalb der Saison', $calendar->label(null)); } - /** - * @dataProvider summerDates - */ + #[\PHPUnit\Framework\Attributes\DataProvider('summerDates')] public function testSeasonYearForANonWrappingWindow(string $date, ?int $expected): void { $calendar = new SeasonCalendar('06-01', '09-01'); @@ -71,9 +67,7 @@ class SeasonCalendarTest extends TestCase (new SeasonCalendar('xx-yy', '04-01'))->seasonYearFor(new \DateTimeImmutable('2025-01-01')); } - /** - * @dataProvider currentOrUpcomingDates - */ + #[\PHPUnit\Framework\Attributes\DataProvider('currentOrUpcomingDates')] public function testCurrentOrUpcomingSeasonYear(string $date, int $expected): void { $this->assertSame( @@ -117,9 +111,7 @@ class SeasonCalendarTest extends TestCase $this->assertSame('2025-09-30', $end->format('Y-m-d')); } - /** - * @dataProvider provideUpcomingSeasonDates - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideUpcomingSeasonDates')] public function testTheCurrentOrUpcomingSeasonYear(string $date, int $expected): void { $calendar = new SeasonCalendar('11-01', '04-01'); diff --git a/tests/Config/SeasonTaskTest.php b/tests/Config/SeasonTaskTest.php index fd61c2c..09fccff 100644 --- a/tests/Config/SeasonTaskTest.php +++ b/tests/Config/SeasonTaskTest.php @@ -31,9 +31,7 @@ class SeasonTaskTest extends TestCase $this->assertSame($labels, array_unique($labels)); } - /** - * @dataProvider entries - */ + #[\PHPUnit\Framework\Attributes\DataProvider('entries')] public function testTheAgreedEntryList( SeasonTask $task, string $label, diff --git a/tests/Controller/Administrative/System/Destination/DestinationTraitTest.php b/tests/Controller/Administrative/System/Destination/DestinationTraitTest.php index e92568e..6fb6ff4 100644 --- a/tests/Controller/Administrative/System/Destination/DestinationTraitTest.php +++ b/tests/Controller/Administrative/System/Destination/DestinationTraitTest.php @@ -67,10 +67,10 @@ class DestinationTraitTest extends TestCase */ private function harness(?Hotel $hotel, array $pickups = []): object { - $hotelProvider = $this->createMock(HotelDataProvider::class); + $hotelProvider = $this->createStub(HotelDataProvider::class); $hotelProvider->method('get')->willReturn($hotel); - $pickupProvider = $this->createMock(PickupDataProvider::class); + $pickupProvider = $this->createStub(PickupDataProvider::class); $pickupProvider->method('get')->willReturnCallback(fn ($id) => $pickups[$id] ?? null); return new class($hotelProvider, $pickupProvider) { diff --git a/tests/Controller/Api/ApplicationFormControllerTest.php b/tests/Controller/Api/ApplicationFormControllerTest.php index 7f94011..e947699 100644 --- a/tests/Controller/Api/ApplicationFormControllerTest.php +++ b/tests/Controller/Api/ApplicationFormControllerTest.php @@ -79,9 +79,8 @@ class ApplicationFormControllerTest extends WebTestCase * date element straight to json_encode sends an object, and its keys are the whole diagnosis. * * Never the value itself - a rejected payload is still personal data. - * - * @dataProvider unusableBirthDateTypes */ + #[\PHPUnit\Framework\Attributes\DataProvider('unusableBirthDateTypes')] public function testARejectionNamesTheShapeThatArrived(mixed $birthDate, string $received): void { $this->post(['birthDate' => $birthDate] + $this->payload()); @@ -258,9 +257,7 @@ class ApplicationFormControllerTest extends WebTestCase $this->assertSame([], $submission->getDetails()); } - /** - * @dataProvider requiredFields - */ + #[\PHPUnit\Framework\Attributes\DataProvider('requiredFields')] public function testAPayloadMissingARequiredFieldIsRejected(string $field): void { $payload = $this->payload(); @@ -277,9 +274,8 @@ class ApplicationFormControllerTest extends WebTestCase /** * An empty string is the shape a form posts for a field the visitor left blank, and it is as * unusable as an absent key - except for eu, where "" is a lawful no and has its own case. - * - * @dataProvider requiredFields */ + #[\PHPUnit\Framework\Attributes\DataProvider('requiredFields')] public function testAPayloadWithAnEmptyRequiredFieldIsRejected(string $field): void { if ('eu' === $field) { @@ -315,9 +311,8 @@ class ApplicationFormControllerTest extends WebTestCase * The one field whose format is nailed down: provisioning parses it as a date, so the day the * TYPO3 side switches a form back to a free-text birthday has to be a 400 here rather than a * failure in front of a reviewer weeks later. - * - * @dataProvider unusableBirthDates */ + #[\PHPUnit\Framework\Attributes\DataProvider('unusableBirthDates')] public function testAnUnusableBirthDateIsRejected(string $birthDate): void { $this->post(['birthDate' => $birthDate] + $this->payload()); @@ -380,9 +375,8 @@ class ApplicationFormControllerTest extends WebTestCase /** * Case is the sender's business, not a reason to lose an application: every spelling a form * can post lands on the same stored value. - * - * @dataProvider genderSpellings */ + #[\PHPUnit\Framework\Attributes\DataProvider('genderSpellings')] public function testAGenderIsReadWhateverItsCase(string $posted, string $stored): void { $this->post(['gender' => $posted] + $this->payload()); diff --git a/tests/Email/EmailTextMailRenderingTest.php b/tests/Email/EmailTextMailRenderingTest.php index 98451bd..797e6a3 100644 --- a/tests/Email/EmailTextMailRenderingTest.php +++ b/tests/Email/EmailTextMailRenderingTest.php @@ -44,9 +44,7 @@ class EmailTextMailRenderingTest extends KernelTestCase EmailTextKey::APPLICATION_FORM_FOLLOW_UP, ]; - /** - * @dataProvider provideKeys - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideKeys')] public function testTheMailRenders(EmailTextKey $key): void { self::bootKernel(); @@ -63,7 +61,7 @@ class EmailTextMailRenderingTest extends KernelTestCase // Renders the delivered wording: the test environment has no database, and the // defaults are what a mail falls back to anyway. - $repository = $this->createMock(EmailTextRepository::class); + $repository = $this->createStub(EmailTextRepository::class); $repository->method('findByKey')->willReturn(null); $text = (new EmailTextRenderer( @@ -152,7 +150,7 @@ class EmailTextMailRenderingTest extends KernelTestCase self::bootKernel(); $container = self::getContainer(); - $repository = $this->createMock(EmailTextRepository::class); + $repository = $this->createStub(EmailTextRepository::class); $repository->method('findByKey')->willReturn(null); $renderer = new EmailTextRenderer( @@ -173,7 +171,7 @@ class EmailTextMailRenderingTest extends KernelTestCase self::bootKernel(); $container = self::getContainer(); - $repository = $this->createMock(EmailTextRepository::class); + $repository = $this->createStub(EmailTextRepository::class); $repository->method('findByKey')->willReturn(null); $text = (new EmailTextRenderer( diff --git a/tests/Email/EmailTextRendererTest.php b/tests/Email/EmailTextRendererTest.php index f14dfd7..d0181a8 100644 --- a/tests/Email/EmailTextRendererTest.php +++ b/tests/Email/EmailTextRendererTest.php @@ -228,7 +228,7 @@ class EmailTextRendererTest extends KernelTestCase */ public function testGivenValuesAreRenderedInsteadOfTheStoredOnes(): void { - $repository = $this->createMock(EmailTextRepository::class); + $repository = $this->createStub(EmailTextRepository::class); $repository ->method('findByKey') ->willReturn($this->emailText(subject: 'Gespeichert', body: 'Gespeicherter Text')) @@ -264,7 +264,7 @@ class EmailTextRendererTest extends KernelTestCase $renderer = new EmailTextRenderer( self::getContainer()->get(EmailTextCatalog::class), - $this->createMock(EmailTextRepository::class), + $this->createStub(EmailTextRepository::class), self::getContainer()->get(MailBodyRenderer::class) ); @@ -286,7 +286,7 @@ class EmailTextRendererTest extends KernelTestCase */ private function render(?EmailText $emailText, array $placeholders): \App\Model\RenderedEmailTextDto { - $repository = $this->createMock(EmailTextRepository::class); + $repository = $this->createStub(EmailTextRepository::class); $repository ->method('findByKey') ->willReturn($emailText) diff --git a/tests/EventListener/DatevEmailSubscriberTest.php b/tests/EventListener/DatevEmailSubscriberTest.php index da53a72..9496511 100644 --- a/tests/EventListener/DatevEmailSubscriberTest.php +++ b/tests/EventListener/DatevEmailSubscriberTest.php @@ -13,16 +13,19 @@ use App\EventListener\DatevEmailSubscriber; use App\Model\EmailPathAttachmentDto; use App\Service\Upload\UploadHandler; use Flagception\Manager\FeatureManagerInterface; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; +#[AllowMockObjectsWithoutExpectations] class DatevEmailSubscriberTest extends TestCase { private Mailer&MockObject $mailer; private UploadHandler&MockObject $uploadHandler; private LoggerInterface&MockObject $logger; - private FeatureManagerInterface&MockObject $featureManager; + private FeatureManagerInterface&Stub $featureManager; private DatevEmailSubscriber $subscriber; protected function setUp(): void @@ -30,8 +33,8 @@ class DatevEmailSubscriberTest extends TestCase $this->mailer = $this->createMock(Mailer::class); $this->uploadHandler = $this->createMock(UploadHandler::class); $this->logger = $this->createMock(LoggerInterface::class); - $this->featureManager = $this->createMock(FeatureManagerInterface::class); - $this->featureManager->method('isActive')->with('datev_email')->willReturn(true); + $this->featureManager = $this->createStub(FeatureManagerInterface::class); + $this->featureManager->method('isActive')->willReturnCallback(static fn (string $name): bool => 'datev_email' === $name); $this->subscriber = new DatevEmailSubscriber( $this->mailer, @@ -53,7 +56,7 @@ class DatevEmailSubscriberTest extends TestCase public function testSkipsNonInvoiceDocuments(): void { - $document = $this->createMock(Upload::class); + $document = $this->createStub(Upload::class); $document->method('getType')->willReturn(Upload::TYPE_CONTRACT); $this->mailer @@ -66,7 +69,7 @@ class DatevEmailSubscriberTest extends TestCase public function testSkipsDocumentWithoutDisposition(): void { - $document = $this->createMock(Upload::class); + $document = $this->createStub(Upload::class); $document->method('getType')->willReturn(Upload::TYPE_INVOICE); $document->method('getDisposition')->willReturn(null); $document->method('getId')->willReturn(1); @@ -86,10 +89,10 @@ class DatevEmailSubscriberTest extends TestCase public function testSkipsDispositionWithoutTeamer(): void { - $disposition = $this->createMock(Disposition::class); + $disposition = $this->createStub(Disposition::class); $disposition->method('getTeamer')->willReturn(null); - $document = $this->createMock(Upload::class); + $document = $this->createStub(Upload::class); $document->method('getType')->willReturn(Upload::TYPE_INVOICE); $document->method('getDisposition')->willReturn($disposition); $document->method('getId')->willReturn(2); @@ -109,13 +112,13 @@ class DatevEmailSubscriberTest extends TestCase public function testSkipsMissingAttachmentFile(): void { - $teamer = $this->createMock(Teamer::class); + $teamer = $this->createStub(Teamer::class); $teamer->method('getFullName')->willReturn('Doe, John'); - $disposition = $this->createMock(Disposition::class); + $disposition = $this->createStub(Disposition::class); $disposition->method('getTeamer')->willReturn($teamer); - $document = $this->createMock(Upload::class); + $document = $this->createStub(Upload::class); $document->method('getType')->willReturn(Upload::TYPE_INVOICE); $document->method('getDisposition')->willReturn($disposition); $document->method('getId')->willReturn(3); @@ -145,14 +148,14 @@ class DatevEmailSubscriberTest extends TestCase public function testSendsEmailWithAttachment(): void { - $teamer = $this->createMock(Teamer::class); + $teamer = $this->createStub(Teamer::class); $teamer->method('getFullName')->willReturn('Doe, John'); $teamer->method('__toString')->willReturn('Doe, John'); - $disposition = $this->createMock(Disposition::class); + $disposition = $this->createStub(Disposition::class); $disposition->method('getTeamer')->willReturn($teamer); - $document = $this->createMock(Upload::class); + $document = $this->createStub(Upload::class); $document->method('getDisposition')->willReturn($disposition); $document->method('getType')->willReturn(Upload::TYPE_INVOICE); $document->method('getId')->willReturn(42); diff --git a/tests/EventListener/EmailNotificationSubscriberTest.php b/tests/EventListener/EmailNotificationSubscriberTest.php index 7679d10..75b87eb 100644 --- a/tests/EventListener/EmailNotificationSubscriberTest.php +++ b/tests/EventListener/EmailNotificationSubscriberTest.php @@ -21,6 +21,7 @@ use App\EventListener\EmailNotificationSubscriber; use App\Model\ApplicationStatusDto; use App\Repository\UserRepository; use App\Service\Pdf\ContractRenderer; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -28,6 +29,7 @@ use PHPUnit\Framework\TestCase; * A deleted teamer must never be mailed again - this is the point of the deletion, so * every handler that writes to a teamer is covered here. */ +#[AllowMockObjectsWithoutExpectations] class EmailNotificationSubscriberTest extends TestCase { private Mailer&MockObject $mailer; @@ -41,9 +43,9 @@ class EmailNotificationSubscriberTest extends TestCase $this->subscriber = new EmailNotificationSubscriber( $this->mailer, - $this->createMock(UserRepository::class), + $this->createStub(UserRepository::class), $this->contractRenderer, - $this->createMock(MailPlaceholderFactory::class), + $this->createStub(MailPlaceholderFactory::class), 7, ); } diff --git a/tests/EventListener/InvalidateApplicationsListenerTest.php b/tests/EventListener/InvalidateApplicationsListenerTest.php index f6cc923..ee75804 100644 --- a/tests/EventListener/InvalidateApplicationsListenerTest.php +++ b/tests/EventListener/InvalidateApplicationsListenerTest.php @@ -16,12 +16,15 @@ use App\EventListener\InvalidateApplicationsListener; use App\Repository\ApplicationRepository; use Carbon\CarbonPeriodImmutable; use Doctrine\ORM\EntityManagerInterface; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Contracts\EventDispatcher\Event; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +#[AllowMockObjectsWithoutExpectations] class InvalidateApplicationsListenerTest extends TestCase { private ApplicationRepository&MockObject $applicationRepository; @@ -38,7 +41,7 @@ class InvalidateApplicationsListenerTest extends TestCase { $this->applicationRepository = $this->createMock(ApplicationRepository::class); $this->entityManager = $this->createMock(EntityManagerInterface::class); - $eventDispatcher = $this->createMock(EventDispatcherInterface::class); + $eventDispatcher = $this->createStub(EventDispatcherInterface::class); $this->removedApplications = []; $this->dispatchedEvents = []; @@ -62,13 +65,13 @@ class InvalidateApplicationsListenerTest extends TestCase $this->applicationRepository, $this->entityManager, $eventDispatcher, - $this->createMock(LoggerInterface::class) + $this->createStub(LoggerInterface::class) ); } public function testIgnoresNonContractDocuments(): void { - $document = $this->createMock(Upload::class); + $document = $this->createStub(Upload::class); $document->method('getType')->willReturn(Upload::TYPE_INVOICE); $this->applicationRepository->expects($this->never())->method('findOverlappingForTeamer'); @@ -188,51 +191,51 @@ class InvalidateApplicationsListenerTest extends TestCase } } - private function createTeamer(bool $allowOverlapping = false): Teamer&MockObject + private function createTeamer(bool $allowOverlapping = false): Teamer&Stub { - $teamer = $this->createMock(Teamer::class); + $teamer = $this->createStub(Teamer::class); $teamer->method('isAllowOverlappingApplications')->willReturn($allowOverlapping); $teamer->method('getUuid')->willReturn('teamer-uuid'); return $teamer; } - private function createContract(?CarbonPeriodImmutable $period, Teamer $teamer): Upload&MockObject + private function createContract(?CarbonPeriodImmutable $period, Teamer $teamer): Upload&Stub { - $assignment = $this->createMock(Assignment::class); + $assignment = $this->createStub(Assignment::class); if (null === $period) { $assignment->method('getDestination')->willReturn(null); } else { - $destination = $this->createMock(Destination::class); + $destination = $this->createStub(Destination::class); $destination->method('getDateFrom')->willReturn($period->getStartDate()->toDateTimeImmutable()); $destination->method('getDateTo')->willReturn($period->getEndDate()->toDateTimeImmutable()); $assignment->method('getDestination')->willReturn($destination); } - $disposition = $this->createMock(Disposition::class); + $disposition = $this->createStub(Disposition::class); $disposition->method('getAssignment')->willReturn($assignment); $disposition->method('getTeamer')->willReturn($teamer); - $document = $this->createMock(Upload::class); + $document = $this->createStub(Upload::class); $document->method('getType')->willReturn(Upload::TYPE_CONTRACT); $document->method('getDisposition')->willReturn($disposition); return $document; } - private function createApplication(): Application&MockObject + private function createApplication(): Application&Stub { - $destination = $this->createMock(Destination::class); + $destination = $this->createStub(Destination::class); $destination->method('getHotelCode')->willReturn('TST'); $destination->method('getDateFrom')->willReturn(new \DateTimeImmutable('2025-01-12')); $destination->method('getDateTo')->willReturn(new \DateTimeImmutable('2025-01-18')); - $assignment = $this->createMock(Assignment::class); + $assignment = $this->createStub(Assignment::class); $assignment->method('getDestination')->willReturn($destination); $assignment->method('getUuid')->willReturn('assignment-uuid'); - $application = $this->createMock(Application::class); + $application = $this->createStub(Application::class); $application->method('getUuid')->willReturn('application-uuid'); $application->method('getAssignment')->willReturn($assignment); diff --git a/tests/EventListener/StatisticsChangeSetListenerTest.php b/tests/EventListener/StatisticsChangeSetListenerTest.php index a17b8ef..1cb57a2 100644 --- a/tests/EventListener/StatisticsChangeSetListenerTest.php +++ b/tests/EventListener/StatisticsChangeSetListenerTest.php @@ -24,6 +24,7 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Event\OnFlushEventArgs; use Doctrine\ORM\Event\PostFlushEventArgs; use Doctrine\ORM\UnitOfWork; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -32,6 +33,7 @@ use PHPUnit\Framework\TestCase; * profile change overwrites its own history - so the thing worth pinning is *when* a row * gets written and when it must not. */ +#[AllowMockObjectsWithoutExpectations] class StatisticsChangeSetListenerTest extends TestCase { private StatisticsRecorder&MockObject $recorder; @@ -501,7 +503,7 @@ class StatisticsChangeSetListenerTest extends TestCase $byEntity[$entity] = $changeSet; } - $unitOfWork = $this->createMock(UnitOfWork::class); + $unitOfWork = $this->createStub(UnitOfWork::class); $unitOfWork->method('getScheduledEntityUpdates')->willReturn($entities); $unitOfWork->method('getScheduledEntityInsertions')->willReturn($insertions); $unitOfWork->method('getScheduledEntityDeletions')->willReturn($deletions); @@ -510,7 +512,7 @@ class StatisticsChangeSetListenerTest extends TestCase ->willReturnCallback(static fn (object $entity): array => $byEntity[$entity] ?? []) ; - $entityManager = $this->createMock(EntityManagerInterface::class); + $entityManager = $this->createStub(EntityManagerInterface::class); $entityManager->method('getUnitOfWork')->willReturn($unitOfWork); return new OnFlushEventArgs($entityManager); @@ -518,7 +520,7 @@ class StatisticsChangeSetListenerTest extends TestCase private function postFlushArgs(): PostFlushEventArgs { - return new PostFlushEventArgs($this->createMock(EntityManagerInterface::class)); + return new PostFlushEventArgs($this->createStub(EntityManagerInterface::class)); } /** diff --git a/tests/Form/AutosizeTextareaTypeTest.php b/tests/Form/AutosizeTextareaTypeTest.php index 7c650c7..ca47101 100644 --- a/tests/Form/AutosizeTextareaTypeTest.php +++ b/tests/Form/AutosizeTextareaTypeTest.php @@ -14,6 +14,7 @@ use Symfony\Component\Form\Test\TypeTestCase; * The rows attribute is deliberately not part of it: textarea_autosize_controller.js * overwrites rows on connect, which is why the floor travels as min_rows instead. */ +#[\PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations] class AutosizeTextareaTypeTest extends TypeTestCase { public function testTheControllerAndItsResizeActionAreWiredUp(): void diff --git a/tests/Logging/InjectUserProcessorTest.php b/tests/Logging/InjectUserProcessorTest.php index 7e5332e..cf92b00 100644 --- a/tests/Logging/InjectUserProcessorTest.php +++ b/tests/Logging/InjectUserProcessorTest.php @@ -58,7 +58,7 @@ class InjectUserProcessorTest extends TestCase private function process(?InMemoryUser $user, string $sapi = 'fpm-fcgi'): LogRecord { - $security = $this->createMock(Security::class); + $security = $this->createStub(Security::class); $security->method('getUser')->willReturn($user); $processor = new InjectUserProcessor($security, $sapi); diff --git a/tests/Logging/UserDataProcessorTest.php b/tests/Logging/UserDataProcessorTest.php index 6376b38..e7889a2 100644 --- a/tests/Logging/UserDataProcessorTest.php +++ b/tests/Logging/UserDataProcessorTest.php @@ -20,7 +20,7 @@ class UserDataProcessorTest extends TestCase { public function testAnApiFirewallUserGetsNoIdInsteadOfAnError(): void { - $security = $this->createMock(Security::class); + $security = $this->createStub(Security::class); $security->method('getUser')->willReturn(new InMemoryUser('api', null, ['ROLE_API'])); $security->method('getToken')->willReturn(null); diff --git a/tests/Menu/TeamerMenuBackItemTest.php b/tests/Menu/TeamerMenuBackItemTest.php index 65b4432..103eaaf 100644 --- a/tests/Menu/TeamerMenuBackItemTest.php +++ b/tests/Menu/TeamerMenuBackItemTest.php @@ -58,9 +58,8 @@ class TeamerMenuBackItemTest extends KernelTestCase /** * The regression guard: reachable e.g. after the status update in * Admin\Teamer\SkillsController, which redirects without carrying "r" forward. - * - * @dataProvider builderProvider */ + #[\PHPUnit\Framework\Attributes\DataProvider('builderProvider')] public function testWithoutAnyReturnUrlTheOverviewIsLinked(string $builderClass): void { $this->pushRequest(); diff --git a/tests/Model/DestinationDtoTest.php b/tests/Model/DestinationDtoTest.php index 0d8457b..bfe6b81 100644 --- a/tests/Model/DestinationDtoTest.php +++ b/tests/Model/DestinationDtoTest.php @@ -27,9 +27,7 @@ class DestinationDtoTest extends TestCase $this->assertSame(['at', 'ch', 'fr', 'it', 'de', 'nl'], DestinationDto::countryCodes()); } - /** - * @dataProvider isoCountryCodes - */ + #[\PHPUnit\Framework\Attributes\DataProvider('isoCountryCodes')] public function testAnIsoCountryCodeIsAccepted(string $code): void { $this->assertCount(0, $this->validateCountry($code)); @@ -37,9 +35,8 @@ class DestinationDtoTest extends TestCase /** * The four that the form offered and the constraint refused. - * - * @dataProvider busProNetCountryAbbreviations */ + #[\PHPUnit\Framework\Attributes\DataProvider('busProNetCountryAbbreviations')] public function testABusProNetAbbreviationIsNoLongerAccepted(string $abbreviation): void { $this->assertCount(1, $this->validateCountry($abbreviation)); diff --git a/tests/Saas/ApiClientTest.php b/tests/Saas/ApiClientTest.php index a18f7ae..373d1c4 100644 --- a/tests/Saas/ApiClientTest.php +++ b/tests/Saas/ApiClientTest.php @@ -14,9 +14,8 @@ class ApiClientTest extends TestCase /** * The whole point of the calendar-month argument: the app never has to know that the * API counts from zero. - * - * @dataProvider provideMonths */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideMonths')] public function testItTranslatesTheCalendarMonthIntoTheApiIndex(int $month, string $expectedPath): void { $requested = null; diff --git a/tests/Security/BpnAuthenticatorTest.php b/tests/Security/BpnAuthenticatorTest.php index 4d31aa0..d76d406 100644 --- a/tests/Security/BpnAuthenticatorTest.php +++ b/tests/Security/BpnAuthenticatorTest.php @@ -13,7 +13,9 @@ use App\Entity\User; use App\RequiredTeamerCheck\RequiredTeamerCheckRegistry; use App\Security\BpnAuthenticator; use Doctrine\ORM\EntityManagerInterface; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\Request; @@ -23,14 +25,15 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Exception\UserNotFoundException; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; +#[AllowMockObjectsWithoutExpectations] class BpnAuthenticatorTest extends TestCase { - private ApiClient&MockObject $apiClient; + private ApiClient&Stub $apiClient; private UserDataHandler&MockObject $userDataHandler; protected function setUp(): void { - $this->apiClient = $this->createMock(ApiClient::class); + $this->apiClient = $this->createStub(ApiClient::class); $this->userDataHandler = $this->createMock(UserDataHandler::class); } @@ -148,12 +151,12 @@ class BpnAuthenticatorTest extends TestCase private function loadUser(): ?User { $authenticator = new BpnAuthenticator( - $this->createMock(UrlGeneratorInterface::class), - $this->createMock(EntityManagerInterface::class), + $this->createStub(UrlGeneratorInterface::class), + $this->createStub(EntityManagerInterface::class), $this->apiClient, - $this->createMock(LoggerInterface::class), + $this->createStub(LoggerInterface::class), $this->userDataHandler, - $this->createMock(RequiredTeamerCheckRegistry::class), + $this->createStub(RequiredTeamerCheckRegistry::class), ); $request = new Request(request: [ diff --git a/tests/Security/MyEpAuthenticatorTest.php b/tests/Security/MyEpAuthenticatorTest.php index b164b9c..ed266f6 100644 --- a/tests/Security/MyEpAuthenticatorTest.php +++ b/tests/Security/MyEpAuthenticatorTest.php @@ -13,6 +13,7 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; use Flagception\Manager\FeatureManagerInterface; use League\OAuth2\Client\Token\AccessToken; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; @@ -25,6 +26,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; +#[AllowMockObjectsWithoutExpectations] class MyEpAuthenticatorTest extends TestCase { private EntityManagerInterface&MockObject $entityManager; @@ -425,21 +427,21 @@ class MyEpAuthenticatorTest extends TestCase private function createAuthenticator(array $userinfo, bool $featureActive = true, ?MockHttpClient $httpClient = null): MyEpAuthenticator { - $client = $this->createMock(MyEpClient::class); + $client = $this->createStub(MyEpClient::class); $client->method('fetchAccessToken')->willReturn(new AccessToken(['access_token' => 'token'])); - $featureManager = $this->createMock(FeatureManagerInterface::class); + $featureManager = $this->createStub(FeatureManagerInterface::class); $featureManager->method('isActive')->willReturn($featureActive); return new MyEpAuthenticator( $client, $httpClient ?? $this->userinfoClient($userinfo), - new UserDataHandler($this->entityManager, $this->createMock(LoggerInterface::class)), + new UserDataHandler($this->entityManager, $this->createStub(LoggerInterface::class)), $this->entityManager, - $this->createMock(UrlGeneratorInterface::class), - $this->createMock(LoggerInterface::class), + $this->createStub(UrlGeneratorInterface::class), + $this->createStub(LoggerInterface::class), $featureManager, - $this->createMock(RequiredTeamerCheckRegistry::class), + $this->createStub(RequiredTeamerCheckRegistry::class), ); } } diff --git a/tests/Security/OAuth2/MyEpClientTest.php b/tests/Security/OAuth2/MyEpClientTest.php index e1cc13b..87685e9 100644 --- a/tests/Security/OAuth2/MyEpClientTest.php +++ b/tests/Security/OAuth2/MyEpClientTest.php @@ -137,13 +137,13 @@ class MyEpClientTest extends TestCase private function createClient(): MyEpClient { - $urlGenerator = $this->createMock(UrlGeneratorInterface::class); + $urlGenerator = $this->createStub(UrlGeneratorInterface::class); $urlGenerator ->method('generate') ->willReturn('https://myep-team.example.org/myep-auth/check') ; - return new MyEpClient($urlGenerator, $this->createMock(LoggerInterface::class), [ + return new MyEpClient($urlGenerator, $this->createStub(LoggerInterface::class), [ 'myep_oauth2_client_id' => 'client-id', 'myep_oauth2_client_secret' => 'client-secret', 'myep_oauth2_url_authorize' => 'https://my.example.org/authorize', diff --git a/tests/Security/RequiredCheck/DriverLicenseRequiredCheckTest.php b/tests/Security/RequiredCheck/DriverLicenseRequiredCheckTest.php index b3daf7d..1ed341c 100644 --- a/tests/Security/RequiredCheck/DriverLicenseRequiredCheckTest.php +++ b/tests/Security/RequiredCheck/DriverLicenseRequiredCheckTest.php @@ -19,10 +19,7 @@ class DriverLicenseRequiredCheckTest extends TestCase $this->check = new DriverLicenseRequiredCheck(); } - - /** - * @dataProvider mixedRoleProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('mixedRoleProvider')] public function testDoesNotApplyToExcludedMixedRoleUsersWithTeamerRole(string $excludedRole): void { $user = $this->createTeamerUser(); @@ -31,7 +28,7 @@ class DriverLicenseRequiredCheckTest extends TestCase $this->assertFalse($this->check->appliesTo($user)); } - public function mixedRoleProvider(): array + public static function mixedRoleProvider(): array { return [ ['ROLE_TEAM_ADMIN'], diff --git a/tests/Security/RequiredCheck/FinancialDataRequiredCheckTest.php b/tests/Security/RequiredCheck/FinancialDataRequiredCheckTest.php index 9f5754c..02e2e30 100644 --- a/tests/Security/RequiredCheck/FinancialDataRequiredCheckTest.php +++ b/tests/Security/RequiredCheck/FinancialDataRequiredCheckTest.php @@ -19,9 +19,7 @@ class FinancialDataRequiredCheckTest extends TestCase $this->check = new FinancialDataRequiredCheck(); } - /** - * @dataProvider mixedRoleProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('mixedRoleProvider')] public function testDoesNotApplyToExcludedMixedRoleUsersWithTeamerRole(string $excludedRole): void { $user = $this->createTeamerUser(); @@ -30,7 +28,7 @@ class FinancialDataRequiredCheckTest extends TestCase $this->assertFalse($this->check->appliesTo($user)); } - public function mixedRoleProvider(): array + public static function mixedRoleProvider(): array { return [ ['ROLE_TEAM_ADMIN'], @@ -76,9 +74,7 @@ class FinancialDataRequiredCheckTest extends TestCase $this->assertFalse($this->check->isSatisfied($user)); } - /** - * @dataProvider missingBankAccountFieldProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('missingBankAccountFieldProvider')] public function testIsNotSatisfiedWhenBankAccountFieldIsMissing(string $setter): void { $bankAccount = $this->createBankAccount(); @@ -93,7 +89,7 @@ class FinancialDataRequiredCheckTest extends TestCase $this->assertFalse($this->check->isSatisfied($user)); } - public function missingBankAccountFieldProvider(): array + public static function missingBankAccountFieldProvider(): array { return [ ['setIban'], diff --git a/tests/Security/RequiredCheck/MealPreferenceRequiredCheckTest.php b/tests/Security/RequiredCheck/MealPreferenceRequiredCheckTest.php index 57ea30c..a806aaf 100644 --- a/tests/Security/RequiredCheck/MealPreferenceRequiredCheckTest.php +++ b/tests/Security/RequiredCheck/MealPreferenceRequiredCheckTest.php @@ -19,9 +19,7 @@ class MealPreferenceRequiredCheckTest extends TestCase $this->check = new MealPreferenceRequiredCheck(); } - /** - * @dataProvider mixedRoleProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('mixedRoleProvider')] public function testDoesNotApplyToExcludedMixedRoleUsersWithTeamerRole(string $excludedRole): void { $user = $this->createTeamerUser(); @@ -30,7 +28,7 @@ class MealPreferenceRequiredCheckTest extends TestCase $this->assertFalse($this->check->appliesTo($user)); } - public function mixedRoleProvider(): array + public static function mixedRoleProvider(): array { return [ ['ROLE_TEAM_ADMIN'], diff --git a/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php b/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php index 63943b6..11dcf98 100644 --- a/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php +++ b/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php @@ -30,9 +30,7 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase $this->assertTrue($this->createCheck()->appliesTo($user)); } - /** - * @dataProvider mixedRoleProvider - */ + #[\PHPUnit\Framework\Attributes\DataProvider('mixedRoleProvider')] public function testDoesNotApplyToExcludedMixedRoleUsersWithTeamerRole(string $excludedRole): void { $user = (new User())->setRoles([$excludedRole, 'ROLE_TEAMER']); @@ -40,7 +38,7 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase $this->assertFalse($this->createCheck()->appliesTo($user)); } - public function mixedRoleProvider(): array + public static function mixedRoleProvider(): array { return [ ['ROLE_TEAM_ADMIN'], diff --git a/tests/Security/Voter/DispositionVoterTest.php b/tests/Security/Voter/DispositionVoterTest.php index 7c4ac02..9885ec8 100644 --- a/tests/Security/Voter/DispositionVoterTest.php +++ b/tests/Security/Voter/DispositionVoterTest.php @@ -10,7 +10,7 @@ use App\Entity\Disposition; use App\Entity\Teamer; use App\Entity\User; use App\Security\Voter\DispositionVoter; -use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; @@ -23,16 +23,14 @@ use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface; */ class DispositionVoterTest extends TestCase { - private Security&MockObject $security; + private Security&Stub $security; protected function setUp(): void { - $this->security = $this->createMock(Security::class); + $this->security = $this->createStub(Security::class); } - /** - * @dataProvider documentAndFeedbackAttributes - */ + #[\PHPUnit\Framework\Attributes\DataProvider('documentAndFeedbackAttributes')] public function testAnAdminIsDeniedOnASkipFormalitiesAssignment(string $attribute): void { $this->security->method('isGranted')->willReturn(true); @@ -46,9 +44,8 @@ class DispositionVoterTest extends TestCase /** * The same admin on a normal assignment must still get through - the flag is the only thing * that may take these away. - * - * @dataProvider documentAndFeedbackAttributes */ + #[\PHPUnit\Framework\Attributes\DataProvider('documentAndFeedbackAttributes')] public function testTheSameAdminIsGrantedOnANormalAssignment(string $attribute): void { $this->security->method('isGranted')->willReturn(true); @@ -91,9 +88,8 @@ class DispositionVoterTest extends TestCase * transition, because there is none to derive it from: while the Honorarnote is being checked * the state machine offers nothing at all, and that is exactly when receipts must stay * manageable. - * - * @dataProvider receiptWindowStatuses */ + #[\PHPUnit\Framework\Attributes\DataProvider('receiptWindowStatuses')] public function testTheReceiptWindowIsTheTwoInvoiceStates(string $status, bool $expected): void { $this->security->method('isGranted')->willReturn(true); @@ -139,9 +135,8 @@ class DispositionVoterTest extends TestCase /** * The owning teamer gets in without being administrative; anyone else's teamer does not. - * - * @dataProvider receiptOwnership */ + #[\PHPUnit\Framework\Attributes\DataProvider('receiptOwnership')] public function testOnlyTheOwningTeamerMayManageTheirReceipts(bool $owning, bool $expected): void { $this->security @@ -158,7 +153,7 @@ class DispositionVoterTest extends TestCase $user = (new User())->setTeamer($owning ? $teamer : new Teamer()); - $token = $this->createMock(TokenInterface::class); + $token = $this->createStub(TokenInterface::class); $token->method('getUser')->willReturn($user); $this->assertSame( @@ -181,7 +176,7 @@ class DispositionVoterTest extends TestCase private function vote(string $attribute, Disposition $disposition): int { return (new DispositionVoter($this->security))->vote( - $this->createMock(TokenInterface::class), + $this->createStub(TokenInterface::class), $disposition, [$attribute], ); diff --git a/tests/Security/Voter/UploadVoterTest.php b/tests/Security/Voter/UploadVoterTest.php index 33e75bc..c4c846f 100644 --- a/tests/Security/Voter/UploadVoterTest.php +++ b/tests/Security/Voter/UploadVoterTest.php @@ -9,7 +9,7 @@ use App\Entity\Teamer; use App\Entity\Upload; use App\Entity\User; use App\Security\Voter\UploadVoter; -use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; @@ -22,11 +22,11 @@ use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface; */ class UploadVoterTest extends TestCase { - private Security&MockObject $security; + private Security&Stub $security; protected function setUp(): void { - $this->security = $this->createMock(Security::class); + $this->security = $this->createStub(Security::class); $this->security ->method('isGranted') ->willReturnCallback(static fn (string $role): bool => 'ROLE_TEAMER' === $role) @@ -68,9 +68,8 @@ class UploadVoterTest extends TestCase /** * Downloading is all the new rule grants: the file stays the office's, so the teamer it was * issued to may not delete it or reach it through any other attribute. - * - * @dataProvider otherAttributes */ + #[\PHPUnit\Framework\Attributes\DataProvider('otherAttributes')] public function testTheNewRuleGrantsNothingButDownloading(string $attribute): void { $teamer = new Teamer(); @@ -124,7 +123,7 @@ class UploadVoterTest extends TestCase private function vote(string $attribute, Upload $upload, Teamer $teamer): int { - $token = $this->createMock(TokenInterface::class); + $token = $this->createStub(TokenInterface::class); $token->method('getUser')->willReturn((new User())->setTeamer($teamer)); return (new UploadVoter($this->security))->vote($token, $upload, [$attribute]); diff --git a/tests/Security/Voter/UserVoterTest.php b/tests/Security/Voter/UserVoterTest.php index e18087e..a6b88cd 100644 --- a/tests/Security/Voter/UserVoterTest.php +++ b/tests/Security/Voter/UserVoterTest.php @@ -6,7 +6,7 @@ namespace App\Tests\Security\Voter; use App\Entity\User; use App\Security\Voter\UserVoter; -use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; @@ -14,11 +14,11 @@ use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface; class UserVoterTest extends TestCase { - private Security&MockObject $security; + private Security&Stub $security; protected function setUp(): void { - $this->security = $this->createMock(Security::class); + $this->security = $this->createStub(Security::class); } public function testSuperAdminMayEditOtherUsers(): void @@ -59,10 +59,9 @@ class UserVoterTest extends TestCase { $this->security ->method('isGranted') - ->with('IS_IMPERSONATOR') - ->willReturn($isImpersonator); + ->willReturnCallback(static fn (mixed $attribute): bool => 'IS_IMPERSONATOR' === $attribute && $isImpersonator); - $token = $this->createMock(TokenInterface::class); + $token = $this->createStub(TokenInterface::class); $token ->method('getUser') ->willReturn($currentUser); diff --git a/tests/Service/Common/AbstractFilterHandlerTest.php b/tests/Service/Common/AbstractFilterHandlerTest.php index 7296b6c..c2adfb8 100644 --- a/tests/Service/Common/AbstractFilterHandlerTest.php +++ b/tests/Service/Common/AbstractFilterHandlerTest.php @@ -22,9 +22,7 @@ use Symfony\Component\HttpFoundation\RequestStack; */ class AbstractFilterHandlerTest extends TestCase { - /** - * @dataProvider legacyCountries - */ + #[\PHPUnit\Framework\Attributes\DataProvider('legacyCountries')] public function testALegacyCountryIsTranslatedToItsIsoCode(?string $stored, ?string $expected): void { $this->assertSame($expected, $this->handler()->translate($stored)); @@ -67,7 +65,7 @@ class AbstractFilterHandlerTest extends TestCase private function handler(): object { - return new class($this->createMock(RequestStack::class), $this->createMock(EntityManagerInterface::class)) extends AbstractFilterHandler { + return new class($this->createStub(RequestStack::class), $this->createStub(EntityManagerInterface::class)) extends AbstractFilterHandler { protected string $modelClass = AssignmentFilterDto::class; public function translate(?string $country): ?string diff --git a/tests/Service/Common/TeamerFilterHandlerTest.php b/tests/Service/Common/TeamerFilterHandlerTest.php index e1678d1..ffc961b 100644 --- a/tests/Service/Common/TeamerFilterHandlerTest.php +++ b/tests/Service/Common/TeamerFilterHandlerTest.php @@ -87,6 +87,6 @@ class TeamerFilterHandlerTest extends TestCase $requestStack = new RequestStack(); $requestStack->push($request); - return new TeamerFilterHandler($requestStack, $this->createMock(EntityManagerInterface::class)); + return new TeamerFilterHandler($requestStack, $this->createStub(EntityManagerInterface::class)); } } diff --git a/tests/Service/Cron/DispositionStatusServiceTest.php b/tests/Service/Cron/DispositionStatusServiceTest.php index f777097..c1ed23c 100644 --- a/tests/Service/Cron/DispositionStatusServiceTest.php +++ b/tests/Service/Cron/DispositionStatusServiceTest.php @@ -11,7 +11,7 @@ use App\Entity\Teamer; use App\Repository\DispositionRepository; use App\Service\Cron\DispositionStatusService; use Doctrine\ORM\EntityManagerInterface; -use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -24,14 +24,14 @@ use Psr\Log\NullLogger; */ class DispositionStatusServiceTest extends TestCase { - private DispositionRepository&MockObject $repository; + private DispositionRepository&Stub $repository; private DispositionStatusService $service; protected function setUp(): void { - $this->repository = $this->createMock(DispositionRepository::class); + $this->repository = $this->createStub(DispositionRepository::class); - $entityManager = $this->createMock(EntityManagerInterface::class); + $entityManager = $this->createStub(EntityManagerInterface::class); $entityManager ->method('getRepository') ->willReturn($this->repository) diff --git a/tests/Service/Cron/SeasonTaskReminderServiceTest.php b/tests/Service/Cron/SeasonTaskReminderServiceTest.php index 098b165..e3edd96 100644 --- a/tests/Service/Cron/SeasonTaskReminderServiceTest.php +++ b/tests/Service/Cron/SeasonTaskReminderServiceTest.php @@ -17,6 +17,7 @@ use App\Repository\SeasonAssignmentTaskRepository; use App\Service\Cron\SeasonTaskReminderService; use App\Service\Season\SeasonAssignmentLabeler; use App\Service\Season\SeasonTaskDeadlineResolver; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -26,6 +27,7 @@ use Psr\Log\NullLogger; * anyone twice. That property, and what does and does not silence a reminder, is what is pinned * here - the queries behind them are asserted in the repository test. */ +#[AllowMockObjectsWithoutExpectations] class SeasonTaskReminderServiceTest extends TestCase { private SeasonAssignmentTaskRepository&MockObject $repository; diff --git a/tests/Service/Cron/UploadReminderServiceTest.php b/tests/Service/Cron/UploadReminderServiceTest.php index 7163c82..17e5d60 100644 --- a/tests/Service/Cron/UploadReminderServiceTest.php +++ b/tests/Service/Cron/UploadReminderServiceTest.php @@ -14,6 +14,7 @@ use App\Entity\Embeddable\Communication; use App\Entity\Teamer; use App\Repository\DispositionRepository; use App\Service\Cron\UploadReminderService; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -25,6 +26,7 @@ use Psr\Log\NullLogger; * arithmetic the service hands over, because a reminder that asks for the wrong day is just as * silent as the broken queries these replaced. */ +#[AllowMockObjectsWithoutExpectations] class UploadReminderServiceTest extends TestCase { private const CONTRACT_DEADLINE_DAYS = 5; diff --git a/tests/Service/Cron/WorkMonthReminderServiceTest.php b/tests/Service/Cron/WorkMonthReminderServiceTest.php index 3be3dc7..ba237bf 100644 --- a/tests/Service/Cron/WorkMonthReminderServiceTest.php +++ b/tests/Service/Cron/WorkMonthReminderServiceTest.php @@ -11,6 +11,7 @@ use App\Entity\Teamer; use App\Entity\TeamerWorkMonth; use App\Repository\TeamerWorkMonthRepository; use App\Service\Cron\WorkMonthReminderService; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -19,6 +20,7 @@ use Psr\Log\NullLogger; * Pins the rules the reminder applies: which day it runs on, how long it waits after an * import, and who it can actually reach. The query itself is the repository's business. */ +#[AllowMockObjectsWithoutExpectations] class WorkMonthReminderServiceTest extends TestCase { private TeamerWorkMonthRepository&MockObject $repository; diff --git a/tests/Service/Pdf/InvoiceApproverTest.php b/tests/Service/Pdf/InvoiceApproverTest.php index 5d16be8..9f034ea 100644 --- a/tests/Service/Pdf/InvoiceApproverTest.php +++ b/tests/Service/Pdf/InvoiceApproverTest.php @@ -12,10 +12,9 @@ use App\Entity\JobProfile; use App\Entity\Teamer; use App\Entity\Upload; use App\Service\Pdf\InvoiceApprover; -use App\Service\Pdf\InvoiceRenderer; use App\Service\Pdf\Pdf; use App\Service\Upload\UploadHandler; -use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\Filesystem\Filesystem; use Symfony\Contracts\Translation\TranslatorInterface; @@ -27,7 +26,7 @@ class InvoiceApproverTest extends WebTestCase private string $pdfPath; private string $origPath; private Filesystem $filesystem; - private UploadHandler&MockObject $uploadHandler; + private UploadHandler&Stub $uploadHandler; protected function setUp(): void { @@ -38,7 +37,7 @@ class InvoiceApproverTest extends WebTestCase $this->pdfPath = $this->invoiceDir.'/test_approver_backup.pdf'; $this->origPath = $this->invoiceDir.'/test_approver_backup.orig.pdf'; $this->filesystem = new Filesystem(); - $this->uploadHandler = $this->createMock(UploadHandler::class); + $this->uploadHandler = $this->createStub(UploadHandler::class); $this->filesystem->mkdir($this->invoiceDir); } @@ -81,10 +80,7 @@ class InvoiceApproverTest extends WebTestCase private function createApprover(): InvoiceApprover { - $translator = $this->createMock(TranslatorInterface::class); - - /** @var TranslatorInterface $translator */ - return new InvoiceApprover($translator, ['project_dir' => $this->projectDir], $this->uploadHandler); + return new InvoiceApprover($this->createStub(TranslatorInterface::class), ['project_dir' => $this->projectDir], $this->uploadHandler); } private function createDispositionWithInvoicePdf(): Disposition @@ -109,7 +105,7 @@ class InvoiceApproverTest extends WebTestCase $jobProfile->setName('Testprofil'); $jobProfile->setCostUnit('200'); - $assignment = $this->createMock(Assignment::class); + $assignment = $this->createStub(Assignment::class); $assignment->method('getDestination')->willReturn($destination); $assignment->method('getJobProfile')->willReturn($jobProfile); @@ -134,8 +130,9 @@ class InvoiceApproverTest extends WebTestCase ; $disposition->addDocument($invoice); - $this->uploadHandler->method('getResolvedUploadFilepath')->with($invoice)->willReturn($this->pdfPath); - $this->uploadHandler->method('getUploadFilepath')->with($invoice)->willReturn($this->pdfPath); + $filepath = fn (Upload $upload): string => $invoice === $upload ? $this->pdfPath : throw new \LogicException('Unexpected upload'); + $this->uploadHandler->method('getResolvedUploadFilepath')->willReturnCallback($filepath); + $this->uploadHandler->method('getUploadFilepath')->willReturnCallback($filepath); return $disposition; } diff --git a/tests/Service/Pdf/InvoiceRendererTest.php b/tests/Service/Pdf/InvoiceRendererTest.php index 96dd1b1..061131a 100644 --- a/tests/Service/Pdf/InvoiceRendererTest.php +++ b/tests/Service/Pdf/InvoiceRendererTest.php @@ -25,7 +25,7 @@ class InvoiceRendererTest extends WebTestCase public function testRendersInvoice(): void { $projectDir = static::getContainer()->getParameter('kernel.project_dir'); - $translator = $this->createMock(TranslatorInterface::class); + $translator = $this->createStub(TranslatorInterface::class); /** @var TranslatorInterface $translator */ $renderer = new InvoiceRenderer($translator, ['project_dir' => $projectDir]); @@ -82,7 +82,7 @@ class InvoiceRendererTest extends WebTestCase ->setEmail('carmen.baer@ep-reisen.de') ; - $assignment = $this->createMock(Assignment::class); + $assignment = $this->createStub(Assignment::class); $assignment->method('getId')->willReturn(1234); $assignment->method('getDestination')->willReturn($destination); $assignment->method('getJobProfile')->willReturn($jobProfile); @@ -108,9 +108,10 @@ class InvoiceRendererTest extends WebTestCase $disposition->addDocument($invoice); $invoicePath = $projectDir.'/uploads/invoice/a/abcdef0123456789.pdf'; - $uploadHandler = $this->createMock(UploadHandler::class); - $uploadHandler->method('getResolvedUploadFilepath')->with($invoice)->willReturn($invoicePath); - $uploadHandler->method('getUploadFilepath')->with($invoice)->willReturn($invoicePath); + $uploadHandler = $this->createStub(UploadHandler::class); + $filepath = static fn (Upload $upload): string => $invoice === $upload ? $invoicePath : throw new \LogicException('Unexpected upload'); + $uploadHandler->method('getResolvedUploadFilepath')->willReturnCallback($filepath); + $uploadHandler->method('getUploadFilepath')->willReturnCallback($filepath); /** @var TranslatorInterface $translator */ $approver = new InvoiceApprover($translator, ['project_dir' => $projectDir], $uploadHandler); diff --git a/tests/Service/Saas/WorkHoursSynchronizerTest.php b/tests/Service/Saas/WorkHoursSynchronizerTest.php index edc13a7..255d10c 100644 --- a/tests/Service/Saas/WorkHoursSynchronizerTest.php +++ b/tests/Service/Saas/WorkHoursSynchronizerTest.php @@ -18,24 +18,27 @@ use App\Saas\Model\EmployeeDirectory; use App\Saas\ResponseParser; use App\Service\Saas\WorkHoursSynchronizer; use Doctrine\ORM\EntityManagerInterface; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; +#[AllowMockObjectsWithoutExpectations] class WorkHoursSynchronizerTest extends TestCase { private ApiClient&MockObject $apiClient; - private EmployeeDataProvider&MockObject $employeeDataProvider; - private TeamerWorkMonthRepository&MockObject $workMonthRepository; + private EmployeeDataProvider&Stub $employeeDataProvider; + private TeamerWorkMonthRepository&Stub $workMonthRepository; private EntityManagerInterface&MockObject $entityManager; private WorkHoursSynchronizer $synchronizer; protected function setUp(): void { $this->apiClient = $this->createMock(ApiClient::class); - $this->workMonthRepository = $this->createMock(TeamerWorkMonthRepository::class); + $this->workMonthRepository = $this->createStub(TeamerWorkMonthRepository::class); $this->entityManager = $this->createMock(EntityManagerInterface::class); - $this->employeeDataProvider = $this->createMock(EmployeeDataProvider::class); + $this->employeeDataProvider = $this->createStub(EmployeeDataProvider::class); // Registered by default; the tests that care say otherwise. $this->employeeDataProvider->method('getDirectory')->willReturn( @@ -48,7 +51,7 @@ class WorkHoursSynchronizerTest extends TestCase $this->apiClient, new ResponseParser(), $this->employeeDataProvider, - $this->createMock(TeamerRepository::class), + $this->createStub(TeamerRepository::class), $this->workMonthRepository, $this->entityManager, new NullLogger(), @@ -85,7 +88,7 @@ class WorkHoursSynchronizerTest extends TestCase */ public function testATeamerMissingFromTheRosterIsSkippedWithoutAnyRequest(): void { - $provider = $this->createMock(EmployeeDataProvider::class); + $provider = $this->createStub(EmployeeDataProvider::class); $provider->method('getDirectory')->willReturn( EmployeeDirectory::fromEmployees([new Employee('someone.else@example.com', 'e-9', 'Service', false)]) ); @@ -97,7 +100,7 @@ class WorkHoursSynchronizerTest extends TestCase $apiClient, new ResponseParser(), $provider, - $this->createMock(TeamerRepository::class), + $this->createStub(TeamerRepository::class), $this->workMonthRepository, $this->entityManager, new NullLogger(), @@ -115,7 +118,7 @@ class WorkHoursSynchronizerTest extends TestCase */ public function testAnUnreachableRosterDoesNotSkipEveryone(): void { - $provider = $this->createMock(EmployeeDataProvider::class); + $provider = $this->createStub(EmployeeDataProvider::class); $provider->method('getDirectory')->willReturn(EmployeeDirectory::fromEmployees([])); $this->apiClient->method('getTimeAccount')->willReturn($this->payload()); @@ -125,7 +128,7 @@ class WorkHoursSynchronizerTest extends TestCase $this->apiClient, new ResponseParser(), $provider, - $this->createMock(TeamerRepository::class), + $this->createStub(TeamerRepository::class), $this->workMonthRepository, $this->entityManager, new NullLogger(), diff --git a/tests/Service/Season/SeasonChecklistBuilderTest.php b/tests/Service/Season/SeasonChecklistBuilderTest.php index 2164b79..7418667 100644 --- a/tests/Service/Season/SeasonChecklistBuilderTest.php +++ b/tests/Service/Season/SeasonChecklistBuilderTest.php @@ -29,7 +29,7 @@ class SeasonChecklistBuilderTest extends TestCase ->setDocument($document) ); - $builder = new SeasonChecklistBuilder($this->createMock(SeasonTaskDeadlineResolver::class)); + $builder = new SeasonChecklistBuilder($this->createStub(SeasonTaskDeadlineResolver::class)); $rows = $builder->build($seasonAssignment); @@ -44,7 +44,7 @@ class SeasonChecklistBuilderTest extends TestCase (new SeasonAssignmentTask())->setTaskKey(SeasonTask::MASTER_DATA->value) ); - $builder = new SeasonChecklistBuilder($this->createMock(SeasonTaskDeadlineResolver::class)); + $builder = new SeasonChecklistBuilder($this->createStub(SeasonTaskDeadlineResolver::class)); $rows = $builder->build($seasonAssignment); diff --git a/tests/Service/Season/SeasonChecklistStatusTest.php b/tests/Service/Season/SeasonChecklistStatusTest.php index be30f17..7be9a7a 100644 --- a/tests/Service/Season/SeasonChecklistStatusTest.php +++ b/tests/Service/Season/SeasonChecklistStatusTest.php @@ -22,7 +22,7 @@ class SeasonChecklistStatusTest extends TestCase protected function setUp(): void { - $this->builder = new SeasonChecklistBuilder($this->createMock(SeasonTaskDeadlineResolver::class)); + $this->builder = new SeasonChecklistBuilder($this->createStub(SeasonTaskDeadlineResolver::class)); } public function testItIsOpenWhileAnEntryRequiringAReturnIsOpen(): void diff --git a/tests/Service/Season/SeasonTaskSynchronizerTest.php b/tests/Service/Season/SeasonTaskSynchronizerTest.php index 8efbb84..38e4384 100644 --- a/tests/Service/Season/SeasonTaskSynchronizerTest.php +++ b/tests/Service/Season/SeasonTaskSynchronizerTest.php @@ -12,7 +12,9 @@ use App\Entity\Upload; use App\Repository\SeasonTaskDocumentRepository; use App\Service\Season\SeasonTaskSynchronizer; use Doctrine\ORM\EntityManagerInterface; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; /** @@ -20,16 +22,17 @@ use PHPUnit\Framework\TestCase; * that is what is asserted: new entries appear on assignments that already exist, and rows of * an entry that was removed are left alone rather than deleted. */ +#[AllowMockObjectsWithoutExpectations] class SeasonTaskSynchronizerTest extends TestCase { private EntityManagerInterface&MockObject $entityManager; - private SeasonTaskDocumentRepository&MockObject $seasonTaskDocumentRepository; + private SeasonTaskDocumentRepository&Stub $seasonTaskDocumentRepository; private SeasonTaskSynchronizer $synchronizer; protected function setUp(): void { $this->entityManager = $this->createMock(EntityManagerInterface::class); - $this->seasonTaskDocumentRepository = $this->createMock(SeasonTaskDocumentRepository::class); + $this->seasonTaskDocumentRepository = $this->createStub(SeasonTaskDocumentRepository::class); $this->synchronizer = new SeasonTaskSynchronizer( $this->entityManager, diff --git a/tests/Service/Statistics/StatisticsRecorderTest.php b/tests/Service/Statistics/StatisticsRecorderTest.php index a9c4365..a04d022 100644 --- a/tests/Service/Statistics/StatisticsRecorderTest.php +++ b/tests/Service/Statistics/StatisticsRecorderTest.php @@ -12,21 +12,24 @@ use App\Enum\StatisticsEventName; use App\Service\Statistics\StatisticsRecorder; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\DatabaseRequired; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Bundle\SecurityBundle\Security; +#[AllowMockObjectsWithoutExpectations] class StatisticsRecorderTest extends TestCase { private Connection&MockObject $connection; - private Security&MockObject $security; + private Security&Stub $security; private LoggerInterface&MockObject $logger; protected function setUp(): void { $this->connection = $this->createMock(Connection::class); - $this->security = $this->createMock(Security::class); + $this->security = $this->createStub(Security::class); $this->logger = $this->createMock(LoggerInterface::class); } diff --git a/tests/Service/Teamer/AccountDeletionHandlerTest.php b/tests/Service/Teamer/AccountDeletionHandlerTest.php index 3894b5c..315ef9a 100644 --- a/tests/Service/Teamer/AccountDeletionHandlerTest.php +++ b/tests/Service/Teamer/AccountDeletionHandlerTest.php @@ -8,10 +8,12 @@ use App\Entity\Teamer; use App\Entity\User; use App\Service\Teamer\AccountDeletionHandler; use Doctrine\ORM\EntityManagerInterface; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; +#[AllowMockObjectsWithoutExpectations] class AccountDeletionHandlerTest extends TestCase { private EntityManagerInterface&MockObject $entityManager; @@ -23,7 +25,7 @@ class AccountDeletionHandlerTest extends TestCase $this->handler = new AccountDeletionHandler( $this->entityManager, - $this->createMock(LoggerInterface::class), + $this->createStub(LoggerInterface::class), ); } diff --git a/tests/Service/Teamer/SeasonDispositionCounterTest.php b/tests/Service/Teamer/SeasonDispositionCounterTest.php index c9353d5..3002b89 100644 --- a/tests/Service/Teamer/SeasonDispositionCounterTest.php +++ b/tests/Service/Teamer/SeasonDispositionCounterTest.php @@ -8,17 +8,17 @@ use App\Config\SeasonCalendar; use App\Entity\Teamer; use App\Repository\DispositionRepository; use App\Service\Teamer\SeasonDispositionCounter; -use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; class SeasonDispositionCounterTest extends TestCase { - private DispositionRepository&MockObject $dispositionRepository; + private DispositionRepository&Stub $dispositionRepository; private SeasonDispositionCounter $counter; protected function setUp(): void { - $this->dispositionRepository = $this->createMock(DispositionRepository::class); + $this->dispositionRepository = $this->createStub(DispositionRepository::class); $this->counter = new SeasonDispositionCounter( $this->dispositionRepository, diff --git a/tests/Service/Teamer/TeamerMailingServiceTest.php b/tests/Service/Teamer/TeamerMailingServiceTest.php index 7e8968b..ada9b8e 100644 --- a/tests/Service/Teamer/TeamerMailingServiceTest.php +++ b/tests/Service/Teamer/TeamerMailingServiceTest.php @@ -15,20 +15,23 @@ use App\Model\TeamerMailingRecipient; use App\Model\TeamerMailingRecipientsDto; use App\Repository\TeamerRepository; use App\Service\Teamer\TeamerMailingService; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; +#[AllowMockObjectsWithoutExpectations] class TeamerMailingServiceTest extends TestCase { - private TeamerRepository&MockObject $teamerRepository; + private TeamerRepository&Stub $teamerRepository; private Mailer&MockObject $mailer; private TeamerMailingService $service; private static int $nextId = 1; protected function setUp(): void { - $this->teamerRepository = $this->createMock(TeamerRepository::class); + $this->teamerRepository = $this->createStub(TeamerRepository::class); $this->mailer = $this->createMock(Mailer::class); // The real renderer, not a mock: what the mailing puts in front of a teamer is @@ -37,7 +40,7 @@ class TeamerMailingServiceTest extends TestCase $this->teamerRepository, $this->mailer, new MailBodyRenderer(), - $this->createMock(LoggerInterface::class), + $this->createStub(LoggerInterface::class), 'mailing', ); } diff --git a/tests/Service/Teamer/TeamerProvisionerTest.php b/tests/Service/Teamer/TeamerProvisionerTest.php index d25aa51..62eca1c 100644 --- a/tests/Service/Teamer/TeamerProvisionerTest.php +++ b/tests/Service/Teamer/TeamerProvisionerTest.php @@ -17,6 +17,7 @@ use App\Entity\User; use App\Service\Teamer\TeamerProvisioner; use App\Service\Teamer\TeamerProvisioningException; use Doctrine\ORM\EntityManagerInterface; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; @@ -28,6 +29,7 @@ use Psr\Log\NullLogger; * client: what runs, in which order, what is persisted before the next step, and what a retry does * after a failure halfway. */ +#[AllowMockObjectsWithoutExpectations] class TeamerProvisionerTest extends TestCase { private const SELECTION_ID = 1070; @@ -366,7 +368,7 @@ class TeamerProvisionerTest extends TestCase return new TeamerProvisioner( $this->apiClient, $this->userDataHandler, - $this->createMock(EntityManagerInterface::class), + $this->createStub(EntityManagerInterface::class), new NullLogger(), self::SELECTION_ID, ); diff --git a/tests/Service/Upload/UploadHandlerTest.php b/tests/Service/Upload/UploadHandlerTest.php index 5975b14..416c542 100644 --- a/tests/Service/Upload/UploadHandlerTest.php +++ b/tests/Service/Upload/UploadHandlerTest.php @@ -110,9 +110,9 @@ class UploadHandlerTest extends TestCase private function handler(string $replacementFile = self::REPLACEMENT_FILE): UploadHandler { return new UploadHandler( - $this->createMock(RequestStack::class), - $this->createMock(OrphanageManager::class), - $this->createMock(Sanitizer::class), + $this->createStub(RequestStack::class), + $this->createStub(OrphanageManager::class), + $this->createStub(Sanitizer::class), new NullLogger(), $this->featureManager, $this->projectDir, diff --git a/tests/Validator/Constraints/ResolvableHotelValidatorTest.php b/tests/Validator/Constraints/ResolvableHotelValidatorTest.php index 23cccac..0d78318 100644 --- a/tests/Validator/Constraints/ResolvableHotelValidatorTest.php +++ b/tests/Validator/Constraints/ResolvableHotelValidatorTest.php @@ -84,7 +84,7 @@ class ResolvableHotelValidatorTest extends ConstraintValidatorTestCase */ private function provider(array $hotels): object { - $provider = $this->createMock(HotelDataProvider::class); + $provider = $this->createStub(HotelDataProvider::class); $provider->method('getAll')->willReturn($hotels); return $provider; diff --git a/tests/Validator/SeasonAssignmentValidatorTest.php b/tests/Validator/SeasonAssignmentValidatorTest.php index 4da4a6a..a69377d 100644 --- a/tests/Validator/SeasonAssignmentValidatorTest.php +++ b/tests/Validator/SeasonAssignmentValidatorTest.php @@ -10,6 +10,7 @@ use App\Entity\Teamer; use App\Repository\SeasonAssignmentRepository; use App\Validator\Constraints\SeasonAssignment as SeasonAssignmentConstraint; use App\Validator\Constraints\SeasonAssignmentValidator; +use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; use PHPUnit\Framework\MockObject\MockObject; use Symfony\Component\Validator\Test\ConstraintValidatorTestCase; @@ -18,6 +19,7 @@ use Symfony\Component\Validator\Test\ConstraintValidatorTestCase; * pinned here is which season window a given assignment is counted against, and the cases that * must not be refused - an unstaffed assignment, and the assignment being edited itself. */ +#[AllowMockObjectsWithoutExpectations] class SeasonAssignmentValidatorTest extends ConstraintValidatorTestCase { private SeasonAssignmentRepository&MockObject $repository;