From 1dd76e56852a7465175be41e24085c4e29206d22 Mon Sep 17 00:00:00 2001 From: Aaron Gustavo Nieves <64917965+TavoNiievez@users.noreply.github.com> Date: Sat, 27 Jun 2026 13:53:26 -0500 Subject: [PATCH 1/2] Add app fixtures for the new Symfony module assertions A flash-and-redirect controller (assertSessionHasFlashMessage), a Greeting service swapped via mockService, a query-heavy page for the Doctrine query-count assertions, and an in-memory 'async' transport with SendWelcomeMessage routed to it for the Messenger transport assertions. --- config/packages/messenger.yaml | 4 ++++ config/routes.php | 15 +++++++++++++++ config/services_test.php | 5 +++++ src/Controller/FlashController.php | 18 ++++++++++++++++++ src/Controller/GreetingController.php | 22 ++++++++++++++++++++++ src/Controller/RunQueriesController.php | 25 +++++++++++++++++++++++++ src/Service/Greeting.php | 13 +++++++++++++ 7 files changed, 102 insertions(+) create mode 100644 src/Controller/FlashController.php create mode 100644 src/Controller/GreetingController.php create mode 100644 src/Controller/RunQueriesController.php create mode 100644 src/Service/Greeting.php diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index 6dc4cfa..7179862 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -5,3 +5,7 @@ framework: default_bus: messenger.bus.default buses: messenger.bus.default: ~ + transports: + async: 'in-memory://' + routing: + App\Message\SendWelcomeMessage: async diff --git a/config/routes.php b/config/routes.php index 84caaa5..23668b3 100644 --- a/config/routes.php +++ b/config/routes.php @@ -6,10 +6,13 @@ use App\Controller\DashboardController; use App\Controller\DomCrawlerController; use App\Controller\ExternalApiController; +use App\Controller\FlashController; use App\Controller\FormController; +use App\Controller\GreetingController; use App\Controller\HomeController; use App\Controller\HttpClientController; use App\Controller\RegistrationController; +use App\Controller\RunQueriesController; use App\Controller\SecurityController; use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; @@ -109,4 +112,16 @@ $routes->add('dispatch_message', '/dispatch-message') ->controller(App\Controller\DispatchMessageController::class) ->methods(['GET']); + + $routes->add('app_flash', '/flash') + ->controller(FlashController::class) + ->methods(['GET']); + + $routes->add('app_greeting', '/greeting') + ->controller(GreetingController::class) + ->methods(['GET']); + + $routes->add('app_run_queries', '/run-queries') + ->controller(RunQueriesController::class) + ->methods(['GET']); }; diff --git a/config/services_test.php b/config/services_test.php index 5f15173..b4908a5 100644 --- a/config/services_test.php +++ b/config/services_test.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use App\Service\Greeting; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\Security\Core\Security; @@ -10,4 +11,8 @@ $services->alias(Security::class, 'security.helper') ->public(); + + $services->set(Greeting::class) + ->autowire() + ->public(); }; diff --git a/src/Controller/FlashController.php b/src/Controller/FlashController.php new file mode 100644 index 0000000..63316fa --- /dev/null +++ b/src/Controller/FlashController.php @@ -0,0 +1,18 @@ +addFlash('success', 'Welcome back!'); + + return $this->redirectToRoute('index'); + } +} diff --git a/src/Controller/GreetingController.php b/src/Controller/GreetingController.php new file mode 100644 index 0000000..77f4cae --- /dev/null +++ b/src/Controller/GreetingController.php @@ -0,0 +1,22 @@ +greeting->greet()); + } +} diff --git a/src/Controller/RunQueriesController.php b/src/Controller/RunQueriesController.php new file mode 100644 index 0000000..dca0460 --- /dev/null +++ b/src/Controller/RunQueriesController.php @@ -0,0 +1,25 @@ +users->findAll(); + $this->users->getByEmail('john_doe@gmail.com'); + + return new Response('Queries executed.'); + } +} diff --git a/src/Service/Greeting.php b/src/Service/Greeting.php new file mode 100644 index 0000000..cd09368 --- /dev/null +++ b/src/Service/Greeting.php @@ -0,0 +1,13 @@ + Date: Sat, 27 Jun 2026 13:53:26 -0500 Subject: [PATCH 2/2] Add functional tests for the new Symfony module assertions Cover assertSessionHasFlashMessage, mockService, seeNumQueriesIsLessThan, dontSeeDuplicateQueries, and the Messenger in-memory transport assertions (grab/seeContains/seeQueueCount/consume). --- tests/Functional/DoctrineCest.php | 7 +++++++ tests/Functional/MessengerCest.php | 13 +++++++++++++ tests/Functional/ServicesCest.php | 14 ++++++++++++++ tests/Functional/SessionCest.php | 8 ++++++++ 4 files changed, 42 insertions(+) diff --git a/tests/Functional/DoctrineCest.php b/tests/Functional/DoctrineCest.php index bfe1e29..c6281ee 100644 --- a/tests/Functional/DoctrineCest.php +++ b/tests/Functional/DoctrineCest.php @@ -43,4 +43,11 @@ public function seeNumRecords(FunctionalTester $I) { $I->seeNumRecords(1, User::class); } + + public function queryCountAssertions(FunctionalTester $I): void + { + $I->amOnPage('/run-queries'); + $I->seeNumQueriesIsLessThan(10); + $I->dontSeeDuplicateQueries(); + } } diff --git a/tests/Functional/MessengerCest.php b/tests/Functional/MessengerCest.php index 83687df..10534e2 100644 --- a/tests/Functional/MessengerCest.php +++ b/tests/Functional/MessengerCest.php @@ -43,4 +43,17 @@ public function noMessagesDispatched(FunctionalTester $I): void $I->seeDispatchedMessageCount(0); $I->assertSame([], $I->grabDispatchedMessageClasses()); } + + public function messengerTransport(FunctionalTester $I): void + { + $I->amOnPage('/dispatch-message'); + $I->seeMessengerQueueCount(1, 'async'); + $I->seeMessengerTransportContains(SendWelcomeMessage::class, 'async'); + + $envelope = $I->grabMessengerTransport('async')->getSent()[0]; + $I->assertInstanceOf(SendWelcomeMessage::class, $envelope->getMessage()); + + $I->consumeMessengerMessages('async'); + $I->assertCount(1, $I->grabMessengerTransport('async')->getAcknowledged()); + } } diff --git a/tests/Functional/ServicesCest.php b/tests/Functional/ServicesCest.php index 0f854b7..c926ac2 100644 --- a/tests/Functional/ServicesCest.php +++ b/tests/Functional/ServicesCest.php @@ -4,6 +4,7 @@ namespace App\Tests\Functional; +use App\Service\Greeting; use App\Tests\Support\FunctionalTester; use Symfony\Component\Security\Core\Security; @@ -14,4 +15,17 @@ public function grabService(FunctionalTester $I) $security = $I->grabService('security.helper'); $I->assertInstanceOf(Security::class, $security); } + + public function mockService(FunctionalTester $I): void + { + $I->mockService(Greeting::class, new class extends Greeting { + public function greet(): string + { + return 'Mocked greeting!'; + } + }); + + $I->amOnPage('/greeting'); + $I->see('Mocked greeting!'); + } } diff --git a/tests/Functional/SessionCest.php b/tests/Functional/SessionCest.php index 77d5076..9984461 100644 --- a/tests/Functional/SessionCest.php +++ b/tests/Functional/SessionCest.php @@ -96,4 +96,12 @@ public function seeSessionHasValues(FunctionalTester $I) $I->seeSessionHasValues(['_security_main', '_security_main']); } + + public function assertSessionHasFlashMessage(FunctionalTester $I): void + { + $I->stopFollowingRedirects(); + $I->amOnPage('/flash'); + $I->assertSessionHasFlashMessage('success'); + $I->assertSessionHasFlashMessage('success', 'Welcome back!'); + } }