From f56de08bfe02687296849577d773d83d6a8f6ba5 Mon Sep 17 00:00:00 2001 From: Gustavo Nieves Date: Thu, 25 Jun 2026 14:36:28 -0500 Subject: [PATCH 1/3] Add Messenger functional tests Add a MessengerCest covering the new Messenger assertions from codeception/module-symfony: seeDispatchedMessageCount, 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 | 94 ++++++++++++++++++- 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, 234 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 9b4622f..503b12d 100644 --- a/composer.json +++ b/composer.json @@ -22,6 +22,7 @@ "symfony/framework-bundle": "8.1.*", "symfony/http-client": "8.1.*", "symfony/mailer": "8.1.*", + "symfony/messenger": "8.1.*", "symfony/notifier": "8.1.*", "symfony/runtime": "8.1.*", "symfony/security-bundle": "8.1.*", diff --git a/composer.lock b/composer.lock index 57ec3d5..b2038ea 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": "daf25551631f2160dd16661390f08af8", + "content-hash": "14e30357887f3cf354c208f7d12e95ee", "packages": [ { "name": "doctrine/dbal", @@ -2848,6 +2848,98 @@ ], "time": "2026-05-29T05:06:50+00:00" }, + { + "name": "symfony/messenger", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/messenger.git", + "reference": "c095398338a8e6f5ae6579ebb2092b7a16b7df72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/messenger/zipball/c095398338a8e6f5ae6579ebb2092b7a16b7df72", + "reference": "c095398338a8e6f5ae6579ebb2092b7a16b7df72", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/log": "^1|^2|^3", + "symfony/clock": "^7.4|^8.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/console": "<7.4", + "symfony/dependency-injection": "<8.1", + "symfony/event-dispatcher-contracts": "<2.5", + "symfony/lock": "<7.4", + "symfony/serializer": "<7.4.4|>=8.0,<8.0.4" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/serializer": "^7.4.4|^8.0.4", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^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/v8.1.0" + }, + "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-29T05:06:50+00:00" + }, { "name": "symfony/mime", "version": "v8.1.0", 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->seeDispatchedMessageCount(1); + $I->seeDispatchedMessageCount(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->seeDispatchedMessageCount(0); + $I->assertSame([], $I->grabDispatchedMessageClasses()); + } +} From 4953b481d7aefc4811a7623acf2147a4a3fca035 Mon Sep 17 00:00:00 2001 From: Gustavo Nieves Date: Thu, 25 Jun 2026 15:07:06 -0500 Subject: [PATCH 2/3] 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 b2038ea..f032061 100644 --- a/composer.lock +++ b/composer.lock @@ -5863,12 +5863,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": { @@ -5902,6 +5902,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", @@ -5961,7 +5962,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 9769395ab33e07d31092b909a7801e13938bb65b Mon Sep 17 00:00:00 2001 From: Gustavo Nieves Date: Thu, 25 Jun 2026 15:17:59 -0500 Subject: [PATCH 3/3] 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. } }