From c5b9174b7d4e947f2dcb32b3f9abb3443be1ecbb Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Thu, 4 Jul 2024 17:24:44 +0200 Subject: [PATCH 1/9] [Tests] Dropped redundancy in EmailProvider and UsernameProvider tests --- .../Security/User/BaseProviderTestCase.php | 121 ++++++++++++++++ .../Security/User/EmailProviderTest.php | 132 ++++------------- .../Security/User/UsernameProviderTest.php | 136 ++++-------------- 3 files changed, 170 insertions(+), 219 deletions(-) create mode 100644 tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php diff --git a/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php b/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php new file mode 100644 index 0000000000..fe6e1f9fd5 --- /dev/null +++ b/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php @@ -0,0 +1,121 @@ +userService = $this->createMock(UserService::class); + $this->permissionResolver = $this->createMock(PermissionResolver::class); + $this->userProvider = $this->buildProvider(); + } + + public function testLoadUserByUsernameAlreadyUserObject(): void + { + $user = $this->createMock(UserInterface::class); + self::assertSame($user, $this->userProvider->loadUserByUsername($user)); + } + + /** + * @phpstan-return list + */ + public function supportsClassProvider(): array + { + return [ + [SymfonyUserInterface::class, false], + [MVCUser::class, true], + [get_class($this->createMock(MVCUser::class)), true], + ]; + } + + /** + * @dataProvider supportsClassProvider + * + * @phpstan-param class-string $class + */ + public function testSupportsClass(string $class, bool $supports): void + { + self::assertSame($supports, $this->userProvider->supportsClass($class)); + } + + public function testLoadUserByAPIUser(): void + { + $apiUser = $this->createMock(APIUser::class); + + $user = $this->userProvider->loadUserByAPIUser($apiUser); + + self::assertInstanceOf(MVCUser::class, $user); + self::assertSame($apiUser, $user->getAPIUser()); + self::assertSame(['ROLE_USER'], $user->getRoles()); + } + + protected function createUserWrapperMockFromAPIUser(User $apiUser, int $userId): UserInterface & MockObject + { + $refreshedAPIUser = clone $apiUser; + $user = $this->createMock(UserInterface::class); + $user + ->expects(self::once()) + ->method('getAPIUser') + ->willReturn($apiUser) + ; + $user + ->expects(self::once()) + ->method('setAPIUser') + ->with($refreshedAPIUser) + ; + + $this->userService + ->expects(self::once()) + ->method('loadUser') + ->with($userId) + ->willReturn($refreshedAPIUser) + ; + + return $user; + } + + protected function buildUserValueObjectStub(int $userId): User + { + return new User( + [ + 'content' => new Content( + [ + 'versionInfo' => new VersionInfo( + ['contentInfo' => new ContentInfo(['id' => $userId])] + ), + ] + ), + ] + ); + } +} diff --git a/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php b/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php index 1579cd7a37..3705f1a105 100644 --- a/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php +++ b/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php @@ -8,62 +8,41 @@ namespace Ibexa\Tests\Core\MVC\Symfony\Security\User; -use Ibexa\Contracts\Core\Repository\PermissionResolver; -use Ibexa\Contracts\Core\Repository\UserService; -use Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo; use Ibexa\Contracts\Core\Repository\Values\User\User as APIUser; use Ibexa\Core\Base\Exceptions\NotFoundException; -use Ibexa\Core\MVC\Symfony\Security\User as MVCUser; +use Ibexa\Core\MVC\Symfony\Security\User\BaseProvider; use Ibexa\Core\MVC\Symfony\Security\User\EmailProvider; use Ibexa\Core\MVC\Symfony\Security\UserInterface; -use Ibexa\Core\Repository\Values\Content\Content; -use Ibexa\Core\Repository\Values\Content\VersionInfo; -use Ibexa\Core\Repository\Values\User\User; use Ibexa\Core\Repository\Values\User\UserReference; -use PHPUnit\Framework\TestCase; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; +use Symfony\Component\Security\Core\Exception\UserNotFoundException; use Symfony\Component\Security\Core\User\UserInterface as SymfonyUserInterface; -class EmailProviderTest extends TestCase +/** + * @covers \Ibexa\Core\MVC\Symfony\Security\User\EmailProvider + */ +final class EmailProviderTest extends BaseProviderTestCase { - /** @var \Ibexa\Contracts\Core\Repository\UserService|\PHPUnit\Framework\MockObject\MockObject */ - private $userService; - - /** @var \Ibexa\Contracts\Core\Repository\PermissionResolver|\PHPUnit\Framework\MockObject\MockObject */ - private $permissionResolver; - - /** @var \Ibexa\Core\MVC\Symfony\Security\User\EmailProvider */ - private $userProvider; - - protected function setUp(): void + protected function buildProvider(): BaseProvider { - parent::setUp(); - $this->userService = $this->createMock(UserService::class); - $this->permissionResolver = $this->createMock(PermissionResolver::class); - $this->userProvider = new EmailProvider($this->userService, $this->permissionResolver); + return new EmailProvider($this->userService, $this->permissionResolver); } - public function testLoadUserByUsernameAlreadyUserObject() + public function testLoadUserByUsernameUserNotFound(): void { - $user = $this->createMock(UserInterface::class); - self::assertSame($user, $this->userProvider->loadUserByUsername($user)); - } - - public function testLoadUserByUsernameUserNotFound() - { - $this->expectException(UsernameNotFoundException::class); - $username = 'foobar@example.org'; $this->userService ->expects(self::once()) ->method('loadUserByEmail') ->with($username) - ->will(self::throwException(new NotFoundException('user', $username))); + ->willThrowException(new NotFoundException('user', $username)); + + $this->expectException(UserNotFoundException::class); $this->userProvider->loadUserByUsername($username); } - public function testLoadUserByUsername() + public function testLoadUserByUsername(): void { $username = 'foobar@example.org'; $apiUser = $this->createMock(APIUser::class); @@ -72,7 +51,7 @@ public function testLoadUserByUsername() ->expects(self::once()) ->method('loadUserByEmail') ->with($username) - ->will(self::returnValue($apiUser)); + ->willReturn($apiUser); $user = $this->userProvider->loadUserByUsername($username); self::assertInstanceOf(UserInterface::class, $user); @@ -80,44 +59,19 @@ public function testLoadUserByUsername() self::assertSame(['ROLE_USER'], $user->getRoles()); } - public function testRefreshUserNotSupported() + public function testRefreshUserNotSupported(): void { - $this->expectException(UnsupportedUserException::class); - $user = $this->createMock(SymfonyUserInterface::class); + + $this->expectException(UnsupportedUserException::class); $this->userProvider->refreshUser($user); } - public function testRefreshUser() + public function testRefreshUser(): void { $userId = 123; - $apiUser = new User( - [ - 'content' => new Content( - [ - 'versionInfo' => new VersionInfo( - ['contentInfo' => new ContentInfo(['id' => $userId])] - ), - ] - ), - ] - ); - $refreshedAPIUser = clone $apiUser; - $user = $this->createMock(UserInterface::class); - $user - ->expects(self::once()) - ->method('getAPIUser') - ->will(self::returnValue($apiUser)); - $user - ->expects(self::once()) - ->method('setAPIUser') - ->with($refreshedAPIUser); - - $this->userService - ->expects(self::once()) - ->method('loadUser') - ->with($userId) - ->will(self::returnValue($refreshedAPIUser)); + $apiUser = $this->buildUserValueObjectStub($userId); + $user = $this->createUserWrapperMockFromAPIUser($apiUser, $userId); $this->permissionResolver ->expects(self::once()) @@ -127,62 +81,24 @@ public function testRefreshUser() self::assertSame($user, $this->userProvider->refreshUser($user)); } - public function testRefreshUserNotFound() + public function testRefreshUserNotFound(): void { $this->expectException(UsernameNotFoundException::class); $userId = 123; - $apiUser = new User( - [ - 'content' => new Content( - [ - 'versionInfo' => new VersionInfo( - ['contentInfo' => new ContentInfo(['id' => $userId])] - ), - ] - ), - ] - ); + $apiUser = $this->buildUserValueObjectStub($userId); $user = $this->createMock(UserInterface::class); $user ->expects(self::once()) ->method('getAPIUser') - ->will(self::returnValue($apiUser)); + ->willReturn($apiUser); $this->userService ->expects(self::once()) ->method('loadUser') ->with($userId) - ->will(self::throwException(new NotFoundException('user', 'foo'))); + ->willThrowException(new NotFoundException('user', 'foo')); $this->userProvider->refreshUser($user); } - - /** - * @dataProvider supportsClassProvider - */ - public function testSupportsClass($class, $supports) - { - self::assertSame($supports, $this->userProvider->supportsClass($class)); - } - - public function supportsClassProvider() - { - return [ - [SymfonyUserInterface::class, false], - [MVCUser::class, true], - [get_class($this->createMock(MVCUser::class)), true], - ]; - } - - public function testLoadUserByAPIUser() - { - $apiUser = $this->createMock(APIUser::class); - - $user = $this->userProvider->loadUserByAPIUser($apiUser); - - self::assertInstanceOf(MVCUser::class, $user); - self::assertSame($apiUser, $user->getAPIUser()); - self::assertSame(['ROLE_USER'], $user->getRoles()); - } } diff --git a/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php b/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php index 6fe995cb08..e6b14d53e2 100644 --- a/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php +++ b/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php @@ -8,62 +8,40 @@ namespace Ibexa\Tests\Core\MVC\Symfony\Security\User; -use Ibexa\Contracts\Core\Repository\PermissionResolver; -use Ibexa\Contracts\Core\Repository\UserService; -use Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo; use Ibexa\Contracts\Core\Repository\Values\User\User as APIUser; use Ibexa\Core\Base\Exceptions\NotFoundException; -use Ibexa\Core\MVC\Symfony\Security\User as MVCUser; +use Ibexa\Core\MVC\Symfony\Security\User\BaseProvider; use Ibexa\Core\MVC\Symfony\Security\User\UsernameProvider; use Ibexa\Core\MVC\Symfony\Security\UserInterface; -use Ibexa\Core\Repository\Values\Content\Content; -use Ibexa\Core\Repository\Values\Content\VersionInfo; -use Ibexa\Core\Repository\Values\User\User; use Ibexa\Core\Repository\Values\User\UserReference; -use PHPUnit\Framework\TestCase; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; -use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; +use Symfony\Component\Security\Core\Exception\UserNotFoundException; use Symfony\Component\Security\Core\User\UserInterface as SymfonyUserInterface; -class UsernameProviderTest extends TestCase +/** + * @covers \Ibexa\Core\MVC\Symfony\Security\User\UsernameProvider + */ +final class UsernameProviderTest extends BaseProviderTestCase { - /** @var \Ibexa\Contracts\Core\Repository\UserService|\PHPUnit\Framework\MockObject\MockObject */ - private $userService; - - /** @var \Ibexa\Contracts\Core\Repository\PermissionResolver|\PHPUnit\Framework\MockObject\MockObject */ - private $permissionResolver; - - /** @var \Ibexa\Core\MVC\Symfony\Security\User\UsernameProvider */ - private $userProvider; - - protected function setUp(): void + protected function buildProvider(): BaseProvider { - parent::setUp(); - $this->userService = $this->createMock(UserService::class); - $this->permissionResolver = $this->createMock(PermissionResolver::class); - $this->userProvider = new UsernameProvider($this->userService, $this->permissionResolver); + return new UsernameProvider($this->userService, $this->permissionResolver); } - public function testLoadUserByUsernameAlreadyUserObject() + public function testLoadUserByUsernameUserNotFound(): void { - $user = $this->createMock(UserInterface::class); - self::assertSame($user, $this->userProvider->loadUserByUsername($user)); - } - - public function testLoadUserByUsernameUserNotFound() - { - $this->expectException(UsernameNotFoundException::class); - $username = 'foobar'; $this->userService ->expects(self::once()) ->method('loadUserByLogin') ->with($username) - ->will(self::throwException(new NotFoundException('user', $username))); + ->willThrowException(new NotFoundException('user', $username)); + + $this->expectException(UserNotFoundException::class); $this->userProvider->loadUserByUsername($username); } - public function testLoadUserByUsername() + public function testLoadUserByUsername(): void { $username = 'foobar'; $apiUser = $this->createMock(APIUser::class); @@ -72,7 +50,7 @@ public function testLoadUserByUsername() ->expects(self::once()) ->method('loadUserByLogin') ->with($username) - ->will(self::returnValue($apiUser)); + ->willReturn($apiUser); $user = $this->userProvider->loadUserByUsername($username); self::assertInstanceOf(UserInterface::class, $user); @@ -80,44 +58,19 @@ public function testLoadUserByUsername() self::assertSame(['ROLE_USER'], $user->getRoles()); } - public function testRefreshUserNotSupported() + public function testRefreshUserNotSupported(): void { - $this->expectException(UnsupportedUserException::class); - $user = $this->createMock(SymfonyUserInterface::class); + + $this->expectException(UnsupportedUserException::class); $this->userProvider->refreshUser($user); } - public function testRefreshUser() + public function testRefreshUser(): void { $userId = 123; - $apiUser = new User( - [ - 'content' => new Content( - [ - 'versionInfo' => new VersionInfo( - ['contentInfo' => new ContentInfo(['id' => $userId])] - ), - ] - ), - ] - ); - $refreshedAPIUser = clone $apiUser; - $user = $this->createMock(UserInterface::class); - $user - ->expects(self::once()) - ->method('getAPIUser') - ->will(self::returnValue($apiUser)); - $user - ->expects(self::once()) - ->method('setAPIUser') - ->with($refreshedAPIUser); - - $this->userService - ->expects(self::once()) - ->method('loadUser') - ->with($userId) - ->will(self::returnValue($refreshedAPIUser)); + $apiUser = $this->buildUserValueObjectStub($userId); + $user = $this->createUserWrapperMockFromAPIUser($apiUser, $userId); $this->permissionResolver ->expects(self::once()) @@ -127,62 +80,23 @@ public function testRefreshUser() self::assertSame($user, $this->userProvider->refreshUser($user)); } - public function testRefreshUserNotFound() + public function testRefreshUserNotFound(): void { - $this->expectException(UsernameNotFoundException::class); - $userId = 123; - $apiUser = new User( - [ - 'content' => new Content( - [ - 'versionInfo' => new VersionInfo( - ['contentInfo' => new ContentInfo(['id' => $userId])] - ), - ] - ), - ] - ); + $apiUser = $this->buildUserValueObjectStub($userId); $user = $this->createMock(UserInterface::class); $user ->expects(self::once()) ->method('getAPIUser') - ->will(self::returnValue($apiUser)); + ->willReturn($apiUser); $this->userService ->expects(self::once()) ->method('loadUser') ->with($userId) - ->will(self::throwException(new NotFoundException('user', 'foo'))); + ->willThrowException(new NotFoundException('user', 'foo')); + $this->expectException(UserNotFoundException::class); $this->userProvider->refreshUser($user); } - - /** - * @dataProvider supportsClassProvider - */ - public function testSupportsClass($class, $supports) - { - self::assertSame($supports, $this->userProvider->supportsClass($class)); - } - - public function supportsClassProvider() - { - return [ - [SymfonyUserInterface::class, false], - [MVCUser::class, true], - [get_class($this->createMock(MVCUser::class)), true], - ]; - } - - public function testLoadUserByAPIUser() - { - $apiUser = $this->createMock(APIUser::class); - - $user = $this->userProvider->loadUserByAPIUser($apiUser); - - self::assertInstanceOf(MVCUser::class, $user); - self::assertSame($apiUser, $user->getAPIUser()); - self::assertSame(['ROLE_USER'], $user->getRoles()); - } } From a555faefd6e62ba37bbaced0ecbf6b29f8216d68 Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Thu, 4 Jul 2024 17:40:43 +0200 Subject: [PATCH 2/9] Aligned Username and Email providers with Symfony interface --- .../Symfony/Security/User/EmailProvider.php | 20 +++++++------------ .../Security/User/UsernameProvider.php | 17 +++++----------- 2 files changed, 12 insertions(+), 25 deletions(-) diff --git a/src/lib/MVC/Symfony/Security/User/EmailProvider.php b/src/lib/MVC/Symfony/Security/User/EmailProvider.php index 79aae22ed1..82a82620ee 100644 --- a/src/lib/MVC/Symfony/Security/User/EmailProvider.php +++ b/src/lib/MVC/Symfony/Security/User/EmailProvider.php @@ -8,27 +8,21 @@ namespace Ibexa\Core\MVC\Symfony\Security\User; +use Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException; use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException; -use Ibexa\Core\MVC\Symfony\Security\UserInterface; -use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; +use Symfony\Component\Security\Core\Exception\UserNotFoundException; +use Symfony\Component\Security\Core\User\UserInterface; final class EmailProvider extends BaseProvider { - public function loadUserByUsername($user) + public function loadUserByUsername(string $username): UserInterface { try { - // SecurityContext always tries to authenticate anonymous users when checking granted access. - // In that case $user is an instance of \Ibexa\Core\MVC\Symfony\Security\User. - // We don't need to reload the user here. - if ($user instanceof UserInterface) { - return $user; - } - return $this->createSecurityUser( - $this->userService->loadUserByEmail($user) + $this->userService->loadUserByEmail($username) ); - } catch (NotFoundException $e) { - throw new UsernameNotFoundException($e->getMessage(), 0, $e); + } catch (NotFoundException|InvalidArgumentException $e) { + throw new UserNotFoundException($e->getMessage(), 0, $e); } } } diff --git a/src/lib/MVC/Symfony/Security/User/UsernameProvider.php b/src/lib/MVC/Symfony/Security/User/UsernameProvider.php index f9adacf79a..4ee822b77d 100644 --- a/src/lib/MVC/Symfony/Security/User/UsernameProvider.php +++ b/src/lib/MVC/Symfony/Security/User/UsernameProvider.php @@ -9,26 +9,19 @@ namespace Ibexa\Core\MVC\Symfony\Security\User; use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException; -use Ibexa\Core\MVC\Symfony\Security\UserInterface; -use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; +use Symfony\Component\Security\Core\Exception\UserNotFoundException; +use Symfony\Component\Security\Core\User\UserInterface; final class UsernameProvider extends BaseProvider { - public function loadUserByUsername($user) + public function loadUserByUsername(string $username): UserInterface { try { - // SecurityContext always tries to authenticate anonymous users when checking granted access. - // In that case $user is an instance of \Ibexa\Core\MVC\Symfony\Security\User. - // We don't need to reload the user here. - if ($user instanceof UserInterface) { - return $user; - } - return $this->createSecurityUser( - $this->userService->loadUserByLogin($user) + $this->userService->loadUserByLogin($username) ); } catch (NotFoundException $e) { - throw new UsernameNotFoundException($e->getMessage(), 0, $e); + throw new UserNotFoundException($e->getMessage(), 0, $e); } } } From ebd54d80db8ace15b7f51914ec296c4eaab99a43 Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Thu, 4 Jul 2024 17:41:01 +0200 Subject: [PATCH 3/9] [Tests] Dropped obsolete test case --- .../lib/MVC/Symfony/Security/User/BaseProviderTestCase.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php b/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php index fe6e1f9fd5..ed3e703f76 100644 --- a/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php +++ b/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php @@ -40,12 +40,6 @@ protected function setUp(): void $this->userProvider = $this->buildProvider(); } - public function testLoadUserByUsernameAlreadyUserObject(): void - { - $user = $this->createMock(UserInterface::class); - self::assertSame($user, $this->userProvider->loadUserByUsername($user)); - } - /** * @phpstan-return list */ From 30904ee068312ad2ec59ee5d2abc63758a111918 Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Thu, 4 Jul 2024 17:46:56 +0200 Subject: [PATCH 4/9] Implemented loadUserByIdentifier in custom User providers --- src/lib/MVC/Symfony/Security/User/EmailProvider.php | 9 +++++++-- .../MVC/Symfony/Security/User/UsernameProvider.php | 12 +++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/lib/MVC/Symfony/Security/User/EmailProvider.php b/src/lib/MVC/Symfony/Security/User/EmailProvider.php index 82a82620ee..4976c77933 100644 --- a/src/lib/MVC/Symfony/Security/User/EmailProvider.php +++ b/src/lib/MVC/Symfony/Security/User/EmailProvider.php @@ -15,14 +15,19 @@ final class EmailProvider extends BaseProvider { - public function loadUserByUsername(string $username): UserInterface + public function loadUserByIdentifier(string $identifier): UserInterface { try { return $this->createSecurityUser( - $this->userService->loadUserByEmail($username) + $this->userService->loadUserByEmail($identifier) ); } catch (NotFoundException|InvalidArgumentException $e) { throw new UserNotFoundException($e->getMessage(), 0, $e); } } + + public function loadUserByUsername(string $username): UserInterface + { + return $this->loadUserByIdentifier($username); + } } diff --git a/src/lib/MVC/Symfony/Security/User/UsernameProvider.php b/src/lib/MVC/Symfony/Security/User/UsernameProvider.php index 4ee822b77d..865777eee7 100644 --- a/src/lib/MVC/Symfony/Security/User/UsernameProvider.php +++ b/src/lib/MVC/Symfony/Security/User/UsernameProvider.php @@ -8,20 +8,26 @@ namespace Ibexa\Core\MVC\Symfony\Security\User; +use Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException; use Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException; use Symfony\Component\Security\Core\Exception\UserNotFoundException; use Symfony\Component\Security\Core\User\UserInterface; final class UsernameProvider extends BaseProvider { - public function loadUserByUsername(string $username): UserInterface + public function loadUserByIdentifier(string $identifier): UserInterface { try { return $this->createSecurityUser( - $this->userService->loadUserByLogin($username) + $this->userService->loadUserByLogin($identifier) ); - } catch (NotFoundException $e) { + } catch (NotFoundException|InvalidArgumentException $e) { throw new UserNotFoundException($e->getMessage(), 0, $e); } } + + public function loadUserByUsername(string $username): UserInterface + { + return $this->loadUserByIdentifier($username); + } } From ec37cf852466698243c046588c2c71608a47fbb5 Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Thu, 4 Jul 2024 17:47:30 +0200 Subject: [PATCH 5/9] [Tests] Dropped usage of deprecated `loadUserByUsername` method --- tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php | 4 ++-- tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php b/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php index 3705f1a105..ac901bec9a 100644 --- a/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php +++ b/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php @@ -39,7 +39,7 @@ public function testLoadUserByUsernameUserNotFound(): void ->willThrowException(new NotFoundException('user', $username)); $this->expectException(UserNotFoundException::class); - $this->userProvider->loadUserByUsername($username); + $this->userProvider->loadUserByIdentifier($username); } public function testLoadUserByUsername(): void @@ -53,7 +53,7 @@ public function testLoadUserByUsername(): void ->with($username) ->willReturn($apiUser); - $user = $this->userProvider->loadUserByUsername($username); + $user = $this->userProvider->loadUserByIdentifier($username); self::assertInstanceOf(UserInterface::class, $user); self::assertSame($apiUser, $user->getAPIUser()); self::assertSame(['ROLE_USER'], $user->getRoles()); diff --git a/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php b/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php index e6b14d53e2..76ab877d7b 100644 --- a/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php +++ b/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php @@ -38,7 +38,7 @@ public function testLoadUserByUsernameUserNotFound(): void ->willThrowException(new NotFoundException('user', $username)); $this->expectException(UserNotFoundException::class); - $this->userProvider->loadUserByUsername($username); + $this->userProvider->loadUserByIdentifier($username); } public function testLoadUserByUsername(): void @@ -52,7 +52,7 @@ public function testLoadUserByUsername(): void ->with($username) ->willReturn($apiUser); - $user = $this->userProvider->loadUserByUsername($username); + $user = $this->userProvider->loadUserByIdentifier($username); self::assertInstanceOf(UserInterface::class, $user); self::assertSame($apiUser, $user->getAPIUser()); self::assertSame(['ROLE_USER'], $user->getRoles()); From 7bdf4f17dd134ac3b80f18f4135cb1383300f28b Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Thu, 4 Jul 2024 17:49:04 +0200 Subject: [PATCH 6/9] [PHPDoc] Added missing throw annotations to UserService::loadUserBy* --- src/contracts/Repository/UserService.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/contracts/Repository/UserService.php b/src/contracts/Repository/UserService.php index faf485aca0..58aec8f8f8 100644 --- a/src/contracts/Repository/UserService.php +++ b/src/contracts/Repository/UserService.php @@ -165,6 +165,7 @@ public function loadUser(int $userId, array $prioritizedLanguages = []): User; * @return \Ibexa\Contracts\Core\Repository\Values\User\User * * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException if a user with the given credentials was not found + * @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException */ public function loadUserByLogin(string $login, array $prioritizedLanguages = []): User; @@ -187,6 +188,7 @@ public function checkUserCredentials(User $user, string $credentials): bool; * @return \Ibexa\Contracts\Core\Repository\Values\User\User * * @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException + * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException */ public function loadUserByEmail(string $email, array $prioritizedLanguages = []): User; From 5d23ed7d208586a2b131eb2e82f2a739eaeb134f Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Thu, 4 Jul 2024 18:06:18 +0200 Subject: [PATCH 7/9] [PHPStan] Aligned baseline with the changes --- phpstan-baseline.neon | 120 ------------------------------------------ 1 file changed, 120 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index e84d0149af..2ce84f5611 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -12365,16 +12365,6 @@ parameters: count: 1 path: src/lib/MVC/Symfony/Security/InteractiveLoginToken.php - - - message: "#^Method Ibexa\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProvider\\:\\:loadUserByUsername\\(\\) has parameter \\$user with no type specified\\.$#" - count: 1 - path: src/lib/MVC/Symfony/Security/User/EmailProvider.php - - - - message: "#^Method Ibexa\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProvider\\:\\:loadUserByUsername\\(\\) has parameter \\$user with no type specified\\.$#" - count: 1 - path: src/lib/MVC/Symfony/Security/User/UsernameProvider.php - - message: "#^Method Ibexa\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\UserInterface\\:\\:setAPIUser\\(\\) has no return type specified\\.$#" count: 1 @@ -47195,116 +47185,6 @@ parameters: count: 1 path: tests/lib/MVC/Symfony/Security/InteractiveLoginTokenTest.php - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:supportsClassProvider\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testLoadUserByAPIUser\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testLoadUserByUsername\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testLoadUserByUsernameAlreadyUserObject\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testLoadUserByUsernameUserNotFound\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testRefreshUser\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testRefreshUserNotFound\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testRefreshUserNotSupported\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testSupportsClass\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testSupportsClass\\(\\) has parameter \\$class with no type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\EmailProviderTest\\:\\:testSupportsClass\\(\\) has parameter \\$supports with no type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:supportsClassProvider\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testLoadUserByAPIUser\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testLoadUserByUsername\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testLoadUserByUsernameAlreadyUserObject\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testLoadUserByUsernameUserNotFound\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testRefreshUser\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testRefreshUserNotFound\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testRefreshUserNotSupported\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testSupportsClass\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testSupportsClass\\(\\) has parameter \\$class with no type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Security\\\\User\\\\UsernameProviderTest\\:\\:testSupportsClass\\(\\) has parameter \\$supports with no type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php - - message: "#^Parameter \\#1 \\$expirationDate of class Ibexa\\\\Contracts\\\\Core\\\\Repository\\\\Values\\\\User\\\\PasswordInfo constructor expects DateTimeImmutable\\|null, DateTimeImmutable\\|false given\\.$#" count: 1 From 5c5f4418cf64f6a9187a6f98b76a7aab5f09aabe Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Fri, 5 Jul 2024 10:14:47 +0200 Subject: [PATCH 8/9] [Tests] Reduced code duplication in custom providers test cases --- .../Security/User/BaseProviderTestCase.php | 80 +++++++++++++++++++ .../Security/User/EmailProviderTest.php | 79 +----------------- .../Security/User/UsernameProviderTest.php | 77 +----------------- 3 files changed, 88 insertions(+), 148 deletions(-) diff --git a/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php b/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php index ed3e703f76..7d6b541565 100644 --- a/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php +++ b/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php @@ -12,14 +12,18 @@ use Ibexa\Contracts\Core\Repository\UserService; use Ibexa\Contracts\Core\Repository\Values\Content\ContentInfo; use Ibexa\Contracts\Core\Repository\Values\User\User as APIUser; +use Ibexa\Core\Base\Exceptions\NotFoundException; use Ibexa\Core\MVC\Symfony\Security\User as MVCUser; use Ibexa\Core\MVC\Symfony\Security\User\BaseProvider; use Ibexa\Core\MVC\Symfony\Security\UserInterface; use Ibexa\Core\Repository\Values\Content\Content; use Ibexa\Core\Repository\Values\Content\VersionInfo; use Ibexa\Core\Repository\Values\User\User; +use Ibexa\Core\Repository\Values\User\UserReference; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; +use Symfony\Component\Security\Core\Exception\UnsupportedUserException; +use Symfony\Component\Security\Core\Exception\UserNotFoundException; use Symfony\Component\Security\Core\User\UserInterface as SymfonyUserInterface; abstract class BaseProviderTestCase extends TestCase @@ -32,6 +36,10 @@ abstract class BaseProviderTestCase extends TestCase abstract protected function buildProvider(): BaseProvider; + abstract protected function getUserIdentifier(): string; + + abstract protected function getUserServiceMethod(): string; + protected function setUp(): void { parent::setUp(); @@ -73,6 +81,34 @@ public function testLoadUserByAPIUser(): void self::assertSame(['ROLE_USER'], $user->getRoles()); } + public function testRefreshUserNotFound(): void + { + $userId = 123; + $apiUser = $this->buildUserValueObjectStub($userId); + $user = $this->createMock(UserInterface::class); + $user + ->expects(self::once()) + ->method('getAPIUser') + ->willReturn($apiUser); + + $this->userService + ->expects(self::once()) + ->method('loadUser') + ->with($userId) + ->willThrowException(new NotFoundException('user', 'foo')); + + $this->expectException(UserNotFoundException::class); + $this->userProvider->refreshUser($user); + } + + public function testRefreshUserNotSupported(): void + { + $user = $this->createMock(SymfonyUserInterface::class); + + $this->expectException(UnsupportedUserException::class); + $this->userProvider->refreshUser($user); + } + protected function createUserWrapperMockFromAPIUser(User $apiUser, int $userId): UserInterface & MockObject { $refreshedAPIUser = clone $apiUser; @@ -98,6 +134,50 @@ protected function createUserWrapperMockFromAPIUser(User $apiUser, int $userId): return $user; } + public function testRefreshUser(): void + { + $userId = 123; + $apiUser = $this->buildUserValueObjectStub($userId); + $user = $this->createUserWrapperMockFromAPIUser($apiUser, $userId); + + $this->permissionResolver + ->expects(self::once()) + ->method('setCurrentUserReference') + ->with(new UserReference($apiUser->getUserId())); + + self::assertSame($user, $this->userProvider->refreshUser($user)); + } + + public function testLoadUserByUsername(): void + { + $username = $this->getUserIdentifier(); + $apiUser = $this->createMock(APIUser::class); + + $this->userService + ->expects(self::once()) + ->method($this->getUserServiceMethod()) + ->with($username) + ->willReturn($apiUser); + + $user = $this->userProvider->loadUserByIdentifier($username); + self::assertInstanceOf(UserInterface::class, $user); + self::assertSame($apiUser, $user->getAPIUser()); + self::assertSame(['ROLE_USER'], $user->getRoles()); + } + + public function testLoadUserByUsernameUserNotFound(): void + { + $username = $this->getUserIdentifier(); + $this->userService + ->expects(self::once()) + ->method($this->getUserServiceMethod()) + ->with($username) + ->willThrowException(new NotFoundException('user', $username)); + + $this->expectException(UserNotFoundException::class); + $this->userProvider->loadUserByIdentifier($username); + } + protected function buildUserValueObjectStub(int $userId): User { return new User( diff --git a/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php b/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php index ac901bec9a..261609b26e 100644 --- a/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php +++ b/tests/lib/MVC/Symfony/Security/User/EmailProviderTest.php @@ -8,16 +8,8 @@ namespace Ibexa\Tests\Core\MVC\Symfony\Security\User; -use Ibexa\Contracts\Core\Repository\Values\User\User as APIUser; -use Ibexa\Core\Base\Exceptions\NotFoundException; use Ibexa\Core\MVC\Symfony\Security\User\BaseProvider; use Ibexa\Core\MVC\Symfony\Security\User\EmailProvider; -use Ibexa\Core\MVC\Symfony\Security\UserInterface; -use Ibexa\Core\Repository\Values\User\UserReference; -use Symfony\Component\Security\Core\Exception\UnsupportedUserException; -use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; -use Symfony\Component\Security\Core\Exception\UserNotFoundException; -use Symfony\Component\Security\Core\User\UserInterface as SymfonyUserInterface; /** * @covers \Ibexa\Core\MVC\Symfony\Security\User\EmailProvider @@ -29,76 +21,13 @@ protected function buildProvider(): BaseProvider return new EmailProvider($this->userService, $this->permissionResolver); } - public function testLoadUserByUsernameUserNotFound(): void + protected function getUserIdentifier(): string { - $username = 'foobar@example.org'; - $this->userService - ->expects(self::once()) - ->method('loadUserByEmail') - ->with($username) - ->willThrowException(new NotFoundException('user', $username)); - - $this->expectException(UserNotFoundException::class); - $this->userProvider->loadUserByIdentifier($username); - } - - public function testLoadUserByUsername(): void - { - $username = 'foobar@example.org'; - $apiUser = $this->createMock(APIUser::class); - - $this->userService - ->expects(self::once()) - ->method('loadUserByEmail') - ->with($username) - ->willReturn($apiUser); - - $user = $this->userProvider->loadUserByIdentifier($username); - self::assertInstanceOf(UserInterface::class, $user); - self::assertSame($apiUser, $user->getAPIUser()); - self::assertSame(['ROLE_USER'], $user->getRoles()); - } - - public function testRefreshUserNotSupported(): void - { - $user = $this->createMock(SymfonyUserInterface::class); - - $this->expectException(UnsupportedUserException::class); - $this->userProvider->refreshUser($user); + return 'foobar@example.org'; } - public function testRefreshUser(): void + protected function getUserServiceMethod(): string { - $userId = 123; - $apiUser = $this->buildUserValueObjectStub($userId); - $user = $this->createUserWrapperMockFromAPIUser($apiUser, $userId); - - $this->permissionResolver - ->expects(self::once()) - ->method('setCurrentUserReference') - ->with(new UserReference($apiUser->getUserId())); - - self::assertSame($user, $this->userProvider->refreshUser($user)); - } - - public function testRefreshUserNotFound(): void - { - $this->expectException(UsernameNotFoundException::class); - - $userId = 123; - $apiUser = $this->buildUserValueObjectStub($userId); - $user = $this->createMock(UserInterface::class); - $user - ->expects(self::once()) - ->method('getAPIUser') - ->willReturn($apiUser); - - $this->userService - ->expects(self::once()) - ->method('loadUser') - ->with($userId) - ->willThrowException(new NotFoundException('user', 'foo')); - - $this->userProvider->refreshUser($user); + return 'loadUserByEmail'; } } diff --git a/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php b/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php index 76ab877d7b..5886976ba4 100644 --- a/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php +++ b/tests/lib/MVC/Symfony/Security/User/UsernameProviderTest.php @@ -8,15 +8,8 @@ namespace Ibexa\Tests\Core\MVC\Symfony\Security\User; -use Ibexa\Contracts\Core\Repository\Values\User\User as APIUser; -use Ibexa\Core\Base\Exceptions\NotFoundException; use Ibexa\Core\MVC\Symfony\Security\User\BaseProvider; use Ibexa\Core\MVC\Symfony\Security\User\UsernameProvider; -use Ibexa\Core\MVC\Symfony\Security\UserInterface; -use Ibexa\Core\Repository\Values\User\UserReference; -use Symfony\Component\Security\Core\Exception\UnsupportedUserException; -use Symfony\Component\Security\Core\Exception\UserNotFoundException; -use Symfony\Component\Security\Core\User\UserInterface as SymfonyUserInterface; /** * @covers \Ibexa\Core\MVC\Symfony\Security\User\UsernameProvider @@ -28,75 +21,13 @@ protected function buildProvider(): BaseProvider return new UsernameProvider($this->userService, $this->permissionResolver); } - public function testLoadUserByUsernameUserNotFound(): void + protected function getUserIdentifier(): string { - $username = 'foobar'; - $this->userService - ->expects(self::once()) - ->method('loadUserByLogin') - ->with($username) - ->willThrowException(new NotFoundException('user', $username)); - - $this->expectException(UserNotFoundException::class); - $this->userProvider->loadUserByIdentifier($username); + return 'foobar'; } - public function testLoadUserByUsername(): void + protected function getUserServiceMethod(): string { - $username = 'foobar'; - $apiUser = $this->createMock(APIUser::class); - - $this->userService - ->expects(self::once()) - ->method('loadUserByLogin') - ->with($username) - ->willReturn($apiUser); - - $user = $this->userProvider->loadUserByIdentifier($username); - self::assertInstanceOf(UserInterface::class, $user); - self::assertSame($apiUser, $user->getAPIUser()); - self::assertSame(['ROLE_USER'], $user->getRoles()); - } - - public function testRefreshUserNotSupported(): void - { - $user = $this->createMock(SymfonyUserInterface::class); - - $this->expectException(UnsupportedUserException::class); - $this->userProvider->refreshUser($user); - } - - public function testRefreshUser(): void - { - $userId = 123; - $apiUser = $this->buildUserValueObjectStub($userId); - $user = $this->createUserWrapperMockFromAPIUser($apiUser, $userId); - - $this->permissionResolver - ->expects(self::once()) - ->method('setCurrentUserReference') - ->with(new UserReference($apiUser->getUserId())); - - self::assertSame($user, $this->userProvider->refreshUser($user)); - } - - public function testRefreshUserNotFound(): void - { - $userId = 123; - $apiUser = $this->buildUserValueObjectStub($userId); - $user = $this->createMock(UserInterface::class); - $user - ->expects(self::once()) - ->method('getAPIUser') - ->willReturn($apiUser); - - $this->userService - ->expects(self::once()) - ->method('loadUser') - ->with($userId) - ->willThrowException(new NotFoundException('user', 'foo')); - - $this->expectException(UserNotFoundException::class); - $this->userProvider->refreshUser($user); + return 'loadUserByLogin'; } } From ecd174117254a1697e2b03ba5601228940495271 Mon Sep 17 00:00:00 2001 From: Andrew Longosz Date: Fri, 5 Jul 2024 12:05:26 +0200 Subject: [PATCH 9/9] [PHPStan][CS] Improved changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Paweł Niedzielski --- .../lib/MVC/Symfony/Security/User/BaseProviderTestCase.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php b/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php index 7d6b541565..3cada1549e 100644 --- a/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php +++ b/tests/lib/MVC/Symfony/Security/User/BaseProviderTestCase.php @@ -49,7 +49,7 @@ protected function setUp(): void } /** - * @phpstan-return list + * @phpstan-return list, bool}> */ public function supportsClassProvider(): array { @@ -63,7 +63,7 @@ public function supportsClassProvider(): array /** * @dataProvider supportsClassProvider * - * @phpstan-param class-string $class + * @phpstan-param class-string<\Symfony\Component\Security\Core\User\UserInterface> $class */ public function testSupportsClass(string $class, bool $supports): void { @@ -178,7 +178,7 @@ public function testLoadUserByUsernameUserNotFound(): void $this->userProvider->loadUserByIdentifier($username); } - protected function buildUserValueObjectStub(int $userId): User + final protected function buildUserValueObjectStub(int $userId): User { return new User( [