From 2b30ed0bb99d9a97e68b088f23422a3611f3829b Mon Sep 17 00:00:00 2001 From: Gustavo Nieves Date: Thu, 25 Jun 2026 12:26:42 -0500 Subject: [PATCH 1/4] Add Messenger functional tests Add a MessengerCest covering the new Messenger assertions from codeception/module-symfony: assertMessageCount, seeMessageDispatched, dontSeeMessageDispatched and grabDispatchedMessageClasses. Enable Symfony Messenger in the test app (symfony/messenger + a default synchronous bus) with a sample message, handler and dispatch route, and keep the Mailer synchronous (mailer.message_bus: false) so the existing MailerCest is unaffected. --- .env | 7 ++ composer.json | 1 + composer.lock | 96 ++++++++++++++++++- config/packages/messenger.yaml | 11 +++ config/routes.php | 4 + src/Controller/DispatchMessageController.php | 25 +++++ src/Message/SendWelcomeMessage.php | 18 ++++ .../SendWelcomeMessageHandler.php | 17 ++++ symfony.lock | 12 +++ tests/Functional/MessengerCest.php | 46 +++++++++ 10 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 config/packages/messenger.yaml create mode 100644 src/Controller/DispatchMessageController.php create mode 100644 src/Message/SendWelcomeMessage.php create mode 100644 src/MessageHandler/SendWelcomeMessageHandler.php create mode 100644 tests/Functional/MessengerCest.php diff --git a/.env b/.env index 726c7e5..f1cf48b 100644 --- a/.env +++ b/.env @@ -18,3 +18,10 @@ MAILER_DSN=null://null ###> symfony/notifier ### NOTIFIER_DSN=null://null ###< symfony/notifier ### + +###> symfony/messenger ### +# Choose one of the transports below +# MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages +# MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages +MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0 +###< symfony/messenger ### diff --git a/composer.json b/composer.json index 4f28215..1c91067 100644 --- a/composer.json +++ b/composer.json @@ -22,6 +22,7 @@ "symfony/framework-bundle": "7.4.*", "symfony/http-client": "7.4.*", "symfony/mailer": "7.4.*", + "symfony/messenger": "7.4.*", "symfony/notifier": "7.4.*", "symfony/runtime": "7.4.*", "symfony/security-bundle": "7.4.*", diff --git a/composer.lock b/composer.lock index 110b7a2..3c7aefe 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": "1cbac46690609d534af42bd046cdafaf", + "content-hash": "8e3e78e97a4b5e245f35e38c532d6f5f", "packages": [ { "name": "doctrine/dbal", @@ -2914,6 +2914,100 @@ ], "time": "2026-05-20T07:20:23+00:00" }, + { + "name": "symfony/messenger", + "version": "v7.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/messenger.git", + "reference": "906387986caecc10b2ad2e85f715d834e5133a04" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/messenger/zipball/906387986caecc10b2ad2e85f715d834e5133a04", + "reference": "906387986caecc10b2ad2e85f715d834e5133a04", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/console": "<7.2", + "symfony/event-dispatcher": "<6.4", + "symfony/event-dispatcher-contracts": "<2.5", + "symfony/framework-bundle": "<6.4", + "symfony/http-kernel": "<7.3", + "symfony/lock": "<7.4", + "symfony/serializer": "<6.4.32|>=7.3,<7.3.10|>=7.4,<7.4.4|>=8.0,<8.0.4" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/console": "^7.2|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^7.3|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.32|~7.3.10|^7.4.4|^8.0.4", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Roze", + "email": "samuel.roze@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-19T07:02:47+00:00" + }, { "name": "symfony/mime", "version": "v7.4.13", diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml new file mode 100644 index 0000000..b113fb9 --- /dev/null +++ b/config/packages/messenger.yaml @@ -0,0 +1,11 @@ +framework: + mailer: + # Keep the Mailer synchronous: with Messenger enabled, Symfony otherwise routes + # emails through the bus, which would double-count messages in MailerCest. + message_bus: false + messenger: + # A single synchronous bus; messages without explicit routing are handled in-process, + # which is what the Messenger assertions verify. + default_bus: messenger.bus.default + buses: + messenger.bus.default: ~ diff --git a/config/routes.php b/config/routes.php index 32532ff..0e941cd 100644 --- a/config/routes.php +++ b/config/routes.php @@ -100,4 +100,8 @@ $routes->add('app_create_user_with_confirmation', '/create-user-with-confirmation') ->controller(App\Controller\CreateUserWithConfirmationController::class) ->methods(['GET']); + + $routes->add('dispatch_message', '/dispatch-message') + ->controller(App\Controller\DispatchMessageController::class) + ->methods(['GET']); }; diff --git a/src/Controller/DispatchMessageController.php b/src/Controller/DispatchMessageController.php new file mode 100644 index 0000000..c8ef4c7 --- /dev/null +++ b/src/Controller/DispatchMessageController.php @@ -0,0 +1,25 @@ +bus->dispatch(new SendWelcomeMessage('jane_doe@example.com')); + + return $this->json(['message' => 'Message dispatched']); + } +} diff --git a/src/Message/SendWelcomeMessage.php b/src/Message/SendWelcomeMessage.php new file mode 100644 index 0000000..bfbb856 --- /dev/null +++ b/src/Message/SendWelcomeMessage.php @@ -0,0 +1,18 @@ +email; + } +} diff --git a/src/MessageHandler/SendWelcomeMessageHandler.php b/src/MessageHandler/SendWelcomeMessageHandler.php new file mode 100644 index 0000000..ceed239 --- /dev/null +++ b/src/MessageHandler/SendWelcomeMessageHandler.php @@ -0,0 +1,17 @@ +amOnPage('/dispatch-message'); + $I->assertMessageCount(1); + $I->assertMessageCount(1, 'messenger.bus.default'); + } + + public function seeMessageDispatched(FunctionalTester $I): void + { + $I->amOnPage('/dispatch-message'); + $I->seeMessageDispatched(SendWelcomeMessage::class); + $I->seeMessageDispatched(SendWelcomeMessage::class, 'messenger.bus.default'); + } + + public function dontSeeMessageDispatched(FunctionalTester $I): void + { + $I->amOnPage('/dispatch-message'); + $I->dontSeeMessageDispatched(stdClass::class); + } + + public function grabDispatchedMessageClasses(FunctionalTester $I): void + { + $I->amOnPage('/dispatch-message'); + $messages = $I->grabDispatchedMessageClasses(); + $I->assertSame([SendWelcomeMessage::class], $messages); + } + + public function noMessagesDispatched(FunctionalTester $I): void + { + $I->amOnPage('/'); + $I->assertMessageCount(0); + $I->assertSame([], $I->grabDispatchedMessageClasses()); + } +} From 49da1f681948aa16ab73234d9778d0e4bb37889b Mon Sep 17 00:00:00 2001 From: Gustavo Nieves Date: Thu, 25 Jun 2026 13:31:08 -0500 Subject: [PATCH 2/4] Rename assertMessageCount to seeDispatchedMessageCount --- tests/Functional/MessengerCest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Functional/MessengerCest.php b/tests/Functional/MessengerCest.php index 0cc24b3..83687df 100644 --- a/tests/Functional/MessengerCest.php +++ b/tests/Functional/MessengerCest.php @@ -10,11 +10,11 @@ final class MessengerCest { - public function assertMessageCount(FunctionalTester $I): void + public function seeDispatchedMessageCount(FunctionalTester $I): void { $I->amOnPage('/dispatch-message'); - $I->assertMessageCount(1); - $I->assertMessageCount(1, 'messenger.bus.default'); + $I->seeDispatchedMessageCount(1); + $I->seeDispatchedMessageCount(1, 'messenger.bus.default'); } public function seeMessageDispatched(FunctionalTester $I): void @@ -40,7 +40,7 @@ public function grabDispatchedMessageClasses(FunctionalTester $I): void public function noMessagesDispatched(FunctionalTester $I): void { $I->amOnPage('/'); - $I->assertMessageCount(0); + $I->seeDispatchedMessageCount(0); $I->assertSame([], $I->grabDispatchedMessageClasses()); } } From 4abb4dbde86df6ed6b012a830de5d5d72f06fab3 Mon Sep 17 00:00:00 2001 From: Gustavo Nieves Date: Thu, 25 Jun 2026 15:08:32 -0500 Subject: [PATCH 3/4] Update composer.lock for module-symfony#241 merge Refresh codeception/module-symfony dev-main (7d9317f -> 7f0cd5d) so the Messenger steps are available; MessengerCest passes against the merged module. --- composer.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 3c7aefe..b4d577b 100644 --- a/composer.lock +++ b/composer.lock @@ -5980,12 +5980,12 @@ "source": { "type": "git", "url": "https://github.com/Codeception/module-symfony.git", - "reference": "7d9317fe13da9e8521558f79b0fa3bd0a5c197da" + "reference": "7f0cd5d5ef89658ed1a56185bf33047477686fc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/module-symfony/zipball/7d9317fe13da9e8521558f79b0fa3bd0a5c197da", - "reference": "7d9317fe13da9e8521558f79b0fa3bd0a5c197da", + "url": "https://api.github.com/repos/Codeception/module-symfony/zipball/7f0cd5d5ef89658ed1a56185bf33047477686fc5", + "reference": "7f0cd5d5ef89658ed1a56185bf33047477686fc5", "shasum": "" }, "require": { @@ -6019,6 +6019,7 @@ "symfony/http-foundation": "^5.4 | ^6.4 | ^7.4 | ^8.0", "symfony/http-kernel": "^5.4 | ^6.4 | ^7.4 | ^8.0", "symfony/mailer": "^5.4 | ^6.4 | ^7.4 | ^8.0", + "symfony/messenger": "^5.4 | ^6.4 | ^7.4 | ^8.0", "symfony/mime": "^5.4 | ^6.4 | ^7.4 | ^8.0", "symfony/notifier": "^5.4 | ^6.4 | ^7.4 | ^8.0", "symfony/options-resolver": "^5.4 | ^6.4 | ^7.4 | ^8.0", @@ -6078,7 +6079,7 @@ "issues": "https://github.com/Codeception/module-symfony/issues", "source": "https://github.com/Codeception/module-symfony/tree/main" }, - "time": "2026-06-23T20:14:24+00:00" + "time": "2026-06-25T19:43:59+00:00" }, { "name": "codeception/stub", From f3588c56ae9a8a5957109c6ca1ebfd431f68efd0 Mon Sep 17 00:00:00 2001 From: Gustavo Nieves Date: Thu, 25 Jun 2026 15:17:57 -0500 Subject: [PATCH 4/4] Remove comments from Messenger test code --- .env | 3 --- config/packages/messenger.yaml | 4 ---- src/MessageHandler/SendWelcomeMessageHandler.php | 1 - 3 files changed, 8 deletions(-) diff --git a/.env b/.env index f1cf48b..ce77eb6 100644 --- a/.env +++ b/.env @@ -20,8 +20,5 @@ NOTIFIER_DSN=null://null ###< symfony/notifier ### ###> symfony/messenger ### -# Choose one of the transports below -# MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages -# MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0 ###< symfony/messenger ### diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index b113fb9..6dc4cfa 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -1,11 +1,7 @@ framework: mailer: - # Keep the Mailer synchronous: with Messenger enabled, Symfony otherwise routes - # emails through the bus, which would double-count messages in MailerCest. message_bus: false messenger: - # A single synchronous bus; messages without explicit routing are handled in-process, - # which is what the Messenger assertions verify. default_bus: messenger.bus.default buses: messenger.bus.default: ~ diff --git a/src/MessageHandler/SendWelcomeMessageHandler.php b/src/MessageHandler/SendWelcomeMessageHandler.php index ceed239..db4a12d 100644 --- a/src/MessageHandler/SendWelcomeMessageHandler.php +++ b/src/MessageHandler/SendWelcomeMessageHandler.php @@ -12,6 +12,5 @@ final class SendWelcomeMessageHandler { public function __invoke(SendWelcomeMessage $message): void { - // No-op: the dispatch itself is what the assertions verify. } }