From 961657b4d023c218624f4e802657fc6d74e61198 Mon Sep 17 00:00:00 2001 From: Vincent Langlet Date: Sat, 27 Jul 2019 08:25:12 +0200 Subject: [PATCH] Check if method getLocale exists before to use it (#298) --- src/EventSubscriber/UserLocaleSubscriber.php | 2 +- tests/EventSubscriber/LocalizedUser.php | 39 +++++++++++++++++++ tests/EventSubscriber/User.php | 17 -------- .../UserLocaleSubscriberTest.php | 18 +++++++-- 4 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 tests/EventSubscriber/LocalizedUser.php diff --git a/src/EventSubscriber/UserLocaleSubscriber.php b/src/EventSubscriber/UserLocaleSubscriber.php index 8dfebb03..0a3e6287 100644 --- a/src/EventSubscriber/UserLocaleSubscriber.php +++ b/src/EventSubscriber/UserLocaleSubscriber.php @@ -40,7 +40,7 @@ public function onInteractiveLogin(InteractiveLoginEvent $event) { $user = $event->getAuthenticationToken()->getUser(); - if (null !== $user->getLocale()) { + if (\is_callable([$user, 'getLocale']) && null !== $user->getLocale()) { $this->session->set('_locale', $user->getLocale()); } } diff --git a/tests/EventSubscriber/LocalizedUser.php b/tests/EventSubscriber/LocalizedUser.php new file mode 100644 index 00000000..624ff6d5 --- /dev/null +++ b/tests/EventSubscriber/LocalizedUser.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Sonata\TranslationBundle\Tests\EventSubscriber; + +use Symfony\Component\Security\Core\User\UserInterface; + +/** + * @author Jonathan Vautrin + */ +class LocalizedUser extends User implements UserInterface +{ + private $locale; + + public function __construct(string $locale) + { + $this->locale = $locale; + } + + public function getLocale() + { + return $this->locale; + } + + public function setLocale($locale) + { + $this->locale = $locale; + } +} diff --git a/tests/EventSubscriber/User.php b/tests/EventSubscriber/User.php index afc34d12..ab478b8f 100644 --- a/tests/EventSubscriber/User.php +++ b/tests/EventSubscriber/User.php @@ -20,13 +20,6 @@ */ class User implements UserInterface { - private $locale; - - public function __construct($locale) - { - $this->locale = $locale; - } - public function getRoles() { return []; @@ -50,14 +43,4 @@ public function getUsername() public function eraseCredentials() { } - - public function getLocale() - { - return $this->locale; - } - - public function setLocale($locale) - { - $this->locale = $locale; - } } diff --git a/tests/EventSubscriber/UserLocaleSubscriberTest.php b/tests/EventSubscriber/UserLocaleSubscriberTest.php index 98129c1f..df120cef 100644 --- a/tests/EventSubscriber/UserLocaleSubscriberTest.php +++ b/tests/EventSubscriber/UserLocaleSubscriberTest.php @@ -19,6 +19,7 @@ use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; +use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; /** @@ -28,21 +29,30 @@ class UserLocaleSubscriberTest extends TestCase { /** * Check if session locale is set to user locale at login. + * + * @dataProvider userLocaleSubscriberDataProvider */ - public function testUserLocaleSubscriber() + public function testUserLocaleSubscriber(UserInterface $user, string $expectedLocale): void { $session = new Session(new MockArraySessionStorage()); $session->set('_locale', 'en'); $request = new Request(); $request->setSession($session); - $user = new User('fr'); $event = $this->getEvent($request, $user); $userLocaleSubscriber = new UserLocaleSubscriber($session); $userLocaleSubscriber->onInteractiveLogin($event); - $this->assertSame('fr', $session->get('_locale')); + $this->assertSame($expectedLocale, $session->get('_locale')); } - private function getEvent(Request $request, User $user) + public function userLocaleSubscriberDataProvider(): array + { + return [ + [new LocalizedUser('fr'), 'fr'], + [new User(), 'en'], + ]; + } + + private function getEvent(Request $request, UserInterface $user): InteractiveLoginEvent { $token = new UsernamePasswordToken($user, null, 'dev', []);