1616use Symfony \Component \DependencyInjection \Alias ;
1717use Symfony \Component \DependencyInjection \ContainerBuilder ;
1818use Symfony \Component \EventDispatcher \EventDispatcherInterface ;
19+ use Symfony \Component \HttpFoundation \Request ;
20+ use Symfony \Component \HttpFoundation \RequestStack ;
1921use Symfony \Component \HttpKernel \Event \GetResponseEvent ;
2022use Symfony \Component \HttpKernel \Event \GetResponseForExceptionEvent ;
2123use Symfony \Component \HttpKernel \Exception \HttpException ;
@@ -40,17 +42,21 @@ class ExceptionListenerTest extends TestCase
4042
4143 private $ mockEventDispatcher ;
4244
45+ private $ mockRequestStack ;
46+
4347 public function setUp ()
4448 {
4549 $ this ->mockTokenStorage = $ this ->createMock (TokenStorageInterface::class);
4650 $ this ->mockAuthorizationChecker = $ this ->createMock (AuthorizationCheckerInterface::class);
4751 $ this ->mockSentryClient = $ this ->createMock (\Raven_Client::class);
4852 $ this ->mockEventDispatcher = $ this ->createMock (EventDispatcherInterface::class);
53+ $ this ->mockRequestStack = $ this ->createMock (RequestStack::class);
4954
5055 $ containerBuilder = new ContainerBuilder ();
5156 $ containerBuilder ->setParameter ('kernel.root_dir ' , 'kernel/root ' );
5257 $ containerBuilder ->setParameter ('kernel.environment ' , 'test ' );
5358
59+ $ containerBuilder ->set ('request_stack ' , $ this ->mockRequestStack );
5460 $ containerBuilder ->set ('security.token_storage ' , $ this ->mockTokenStorage );
5561 $ containerBuilder ->set ('security.authorization_checker ' , $ this ->mockAuthorizationChecker );
5662 $ containerBuilder ->set ('sentry.client ' , $ this ->mockSentryClient );
@@ -384,6 +390,54 @@ public function test_that_username_is_set_from_user_interface_if_token_present_a
384390 $ listener ->onKernelRequest ($ mockEvent );
385391 }
386392
393+ public function test_that_ip_is_set_from_request_stack ()
394+ {
395+ $ mockToken = $ this ->createMock (TokenInterface::class);
396+
397+ $ mockToken
398+ ->method ('getUser ' )
399+ ->willReturn ('some_user ' );
400+
401+ $ mockToken
402+ ->method ('isAuthenticated ' )
403+ ->willReturn (true );
404+
405+ $ mockEvent = $ this ->createMock (GetResponseEvent::class);
406+
407+ $ mockRequest = $ this ->createMock (Request::class);
408+
409+ $ mockRequest
410+ ->method ('getClientIp ' )
411+ ->willReturn ('1.2.3.4 ' );
412+
413+ $ this ->mockRequestStack
414+ ->method ('getCurrentRequest ' )
415+ ->willReturn ($ mockRequest );
416+
417+ $ mockEvent
418+ ->expects ($ this ->once ())
419+ ->method ('getRequestType ' )
420+ ->willReturn (HttpKernelInterface::MASTER_REQUEST );
421+
422+ $ this ->mockAuthorizationChecker
423+ ->method ('isGranted ' )
424+ ->with ($ this ->identicalTo (AuthenticatedVoter::IS_AUTHENTICATED_REMEMBERED ))
425+ ->willReturn (true );
426+
427+ $ this ->mockTokenStorage
428+ ->method ('getToken ' )
429+ ->willReturn ($ mockToken );
430+
431+ $ this ->mockSentryClient
432+ ->expects ($ this ->once ())
433+ ->method ('set_user_data ' )
434+ ->with ($ this ->identicalTo ('some_user ' ), null , ['ip_address ' => '1.2.3.4 ' ]);
435+
436+ $ this ->containerBuilder ->compile ();
437+ $ listener = $ this ->getListener ();
438+ $ listener ->onKernelRequest ($ mockEvent );
439+ }
440+
387441 public function test_regression_with_unauthenticated_user_token_PR_78 ()
388442 {
389443 $ mockToken = $ this ->createMock (TokenInterface::class);
0 commit comments