diff --git a/src/EventListener/ExceptionListener.php b/src/EventListener/ExceptionListener.php index f8f1fd33..208afdbc 100644 --- a/src/EventListener/ExceptionListener.php +++ b/src/EventListener/ExceptionListener.php @@ -111,8 +111,14 @@ public function onKernelException(GetResponseForExceptionEvent $event): void return; } + $data = ['tags' => []]; + $request = $this->requestStack->getCurrentRequest(); + if ($request instanceof Request) { + $data['tags']['route'] = $request->attributes->get('_route'); + } + $this->eventDispatcher->dispatch(SentrySymfonyEvents::PRE_CAPTURE, $event); - $this->client->captureException($exception); + $this->client->captureException($exception, $data); } /** diff --git a/test/EventListener/ExceptionListenerTest.php b/test/EventListener/ExceptionListenerTest.php index 8aa3423d..6bc7015b 100644 --- a/test/EventListener/ExceptionListenerTest.php +++ b/test/EventListener/ExceptionListenerTest.php @@ -42,21 +42,24 @@ class ExceptionListenerTest extends TestCase private $mockEventDispatcher; - private $mockRequestStack; + /** + * @var RequestStack + */ + private $requestStack; public function setUp() { - $this->mockTokenStorage = $this->createMock(TokenStorageInterface::class); + $this->mockTokenStorage = $this->createMock(TokenStorageInterface::class); $this->mockAuthorizationChecker = $this->createMock(AuthorizationCheckerInterface::class); - $this->mockSentryClient = $this->createMock(\Raven_Client::class); - $this->mockEventDispatcher = $this->createMock(EventDispatcherInterface::class); - $this->mockRequestStack = $this->createMock(RequestStack::class); + $this->mockSentryClient = $this->createMock(\Raven_Client::class); + $this->mockEventDispatcher = $this->createMock(EventDispatcherInterface::class); + $this->requestStack = new RequestStack(); $containerBuilder = new ContainerBuilder(); $containerBuilder->setParameter('kernel.root_dir', 'kernel/root'); $containerBuilder->setParameter('kernel.environment', 'test'); - $containerBuilder->set('request_stack', $this->mockRequestStack); + $containerBuilder->set('request_stack', $this->requestStack); $containerBuilder->set('security.token_storage', $this->mockTokenStorage); $containerBuilder->set('security.authorization_checker', $this->mockAuthorizationChecker); $containerBuilder->set('sentry.client', $this->mockSentryClient); @@ -403,16 +406,10 @@ public function test_that_ip_is_set_from_request_stack() ->willReturn(true); $mockEvent = $this->createMock(GetResponseEvent::class); - - $mockRequest = $this->createMock(Request::class); - - $mockRequest - ->method('getClientIp') - ->willReturn('1.2.3.4'); - - $this->mockRequestStack - ->method('getCurrentRequest') - ->willReturn($mockRequest); + + $this->requestStack->push(new Request([], [], [], [], [], [ + 'REMOTE_ADDR' => '1.2.3.4' + ])); $mockEvent ->expects($this->once()) @@ -510,6 +507,39 @@ public function test_that_it_captures_exception() $listener->onKernelException($mockEvent); } + public function test_that_it_captures_exception_with_route() + { + $reportableException = new \Exception(); + + $mockEvent = $this->createMock(GetResponseForExceptionEvent::class); + $mockEvent + ->expects($this->once()) + ->method('getException') + ->willReturn($reportableException); + + $this->mockEventDispatcher + ->expects($this->once()) + ->method('dispatch') + ->with($this->identicalTo(SentrySymfonyEvents::PRE_CAPTURE), $this->identicalTo($mockEvent)); + + $data = [ + 'tags' => [ + 'route' => 'homepage' + ] + ]; + + $this->requestStack->push(new Request([], [], ['_route' => 'homepage'])); + + $this->mockSentryClient + ->expects($this->once()) + ->method('captureException') + ->with($this->identicalTo($reportableException), $data); + + $this->containerBuilder->compile(); + $listener = $this->getListener(); + $listener->onKernelException($mockEvent); + } + /** * @dataProvider mockCommandProvider */