From b8826ba5920b37309eeeb04a0c367bf75099b305 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Sat, 30 Aug 2025 08:02:09 -0400 Subject: [PATCH 1/2] test(http): Add test for EVENT_AFTER_REQUEST trigger during exception handling in `ApplicationErrorHandlerTest`. --- .../stateless/ApplicationErrorHandlerTest.php | 79 ++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/tests/http/stateless/ApplicationErrorHandlerTest.php b/tests/http/stateless/ApplicationErrorHandlerTest.php index 261ecf10..257c7a37 100644 --- a/tests/http/stateless/ApplicationErrorHandlerTest.php +++ b/tests/http/stateless/ApplicationErrorHandlerTest.php @@ -5,10 +5,10 @@ namespace yii2\extensions\psrbridge\tests\http\stateless; use PHPUnit\Framework\Attributes\{DataProviderExternal, Group, RequiresPhpExtension}; -use yii\base\{Exception, InvalidConfigException}; +use yii\base\{Event, Exception, InvalidConfigException}; use yii\helpers\Json; use yii\log\{FileTarget, Logger}; -use yii2\extensions\psrbridge\http\Response; +use yii2\extensions\psrbridge\http\{Response, StatelessApplication}; use yii2\extensions\psrbridge\tests\provider\StatelessApplicationProvider; use yii2\extensions\psrbridge\tests\support\FactoryHelper; use yii2\extensions\psrbridge\tests\TestCase; @@ -75,6 +75,72 @@ public function testErrorViewLogic( @\runkit_constant_redefine('YII_DEBUG', true); } + /** + * @throws InvalidConfigException if the configuration is invalid or incomplete. + */ + public function testEventAfterRequestIsTriggeredWhenHandlingException(): void + { + $eventTriggered = false; + $eventName = null; + $eventSender = null; + + $app = $this->statelessApplication( + [ + 'flushLogger' => false, + 'components' => [ + 'errorHandler' => ['errorAction' => null], + ], + ], + ); + + $app->on( + StatelessApplication::EVENT_AFTER_REQUEST, + static function (Event $event) use (&$eventTriggered, &$eventName, &$eventSender): void { + if ($event->name === StatelessApplication::EVENT_AFTER_REQUEST) { + $eventTriggered = true; + $eventName = $event->name; + $eventSender = $event->sender; + } + }, + ); + + $response = $app->handle(FactoryHelper::createRequest('GET', '/site/trigger-exception')); + + self::assertSame( + 500, + $response->getStatusCode(), + "Expected HTTP '500' for route 'site/trigger-exception'.", + ); + self::assertSame( + 'text/html; charset=UTF-8', + $response->getHeaderLine('Content-Type'), + "Expected Content-Type 'text/html; charset=UTF-8' for route 'site/trigger-exception'.", + ); + self::assertStringContainsString( + self::normalizeLineEndings( + <<Exception (Exception) 'yii\base\Exception' with message 'Exception error message.' + HTML, + ), + self::normalizeLineEndings($response->getBody()->getContents()), + 'Response body should contain content from Response object.', + ); + self::assertTrue( + $eventTriggered, + 'EVENT_AFTER_REQUEST should be triggered when handling an exception.', + ); + self::assertSame( + StatelessApplication::EVENT_AFTER_REQUEST, + $eventName, + 'Triggered event should be EVENT_AFTER_REQUEST.', + ); + self::assertSame( + $app, + $eventSender, + 'Event sender should be the StatelessApplication instance.', + ); + } + /** * @throws InvalidConfigException if the configuration is invalid or incomplete. */ @@ -196,6 +262,15 @@ public function testLogExceptionIsCalledWhenHandlingException(): void $response->getHeaderLine('Content-Type'), "Expected Content-Type 'text/html; charset=UTF-8' for route 'site/trigger-exception'.", ); + self::assertStringContainsString( + self::normalizeLineEndings( + <<Exception (Exception) 'yii\base\Exception' with message 'Exception error message.' + HTML, + ), + self::normalizeLineEndings($response->getBody()->getContents()), + 'Response body should contain content from Response object.', + ); $logMessages = $app->getLog()->getLogger()->messages; From 667acef39efa593e9c16d82b28aa47bb79bf50f2 Mon Sep 17 00:00:00 2001 From: Wilmer Arambula Date: Sat, 30 Aug 2025 08:11:33 -0400 Subject: [PATCH 2/2] Apply fixed review coderabbitai nitpick comments. --- tests/http/stateless/ApplicationErrorHandlerTest.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/http/stateless/ApplicationErrorHandlerTest.php b/tests/http/stateless/ApplicationErrorHandlerTest.php index 257c7a37..e7b1a033 100644 --- a/tests/http/stateless/ApplicationErrorHandlerTest.php +++ b/tests/http/stateless/ApplicationErrorHandlerTest.php @@ -83,6 +83,7 @@ public function testEventAfterRequestIsTriggeredWhenHandlingException(): void $eventTriggered = false; $eventName = null; $eventSender = null; + $eventCount = 0; $app = $this->statelessApplication( [ @@ -95,11 +96,12 @@ public function testEventAfterRequestIsTriggeredWhenHandlingException(): void $app->on( StatelessApplication::EVENT_AFTER_REQUEST, - static function (Event $event) use (&$eventTriggered, &$eventName, &$eventSender): void { + static function (Event $event) use (&$eventTriggered, &$eventCount, &$eventName, &$eventSender): void { if ($event->name === StatelessApplication::EVENT_AFTER_REQUEST) { $eventTriggered = true; $eventName = $event->name; $eventSender = $event->sender; + $eventCount++; } }, ); @@ -139,6 +141,11 @@ static function (Event $event) use (&$eventTriggered, &$eventName, &$eventSender $eventSender, 'Event sender should be the StatelessApplication instance.', ); + self::assertSame( + 1, + $eventCount, + 'EVENT_AFTER_REQUEST should be triggered exactly once when handling an exception.', + ); } /**