From 89d9de20778e1cde79032aae28aed58c041d2371 Mon Sep 17 00:00:00 2001 From: Wouter de Jong Date: Sun, 28 Mar 2021 15:14:31 +0200 Subject: [PATCH] Use concrete user related classes in the tests This allows the tests to automatically adapt for changes in the UserInterface and UserProviderInterface in 5.x --- .../Fixtures/PasswordUpgraderProvider.php | 7 +- .../FormLoginAuthenticatorTest.php | 9 +-- .../HttpBasicAuthenticatorTest.php | 15 ++-- .../RemoteUserAuthenticatorTest.php | 19 ++--- .../Authenticator/X509AuthenticatorTest.php | 24 ++---- .../PasswordMigratingListenerTest.php | 16 ++-- .../UserProviderListenerTest.php | 8 +- .../Tests/Firewall/SwitchUserListenerTest.php | 13 ++-- .../Tests/LoginLink/LoginLinkHandlerTest.php | 60 +++++++++------ ...istentTokenBasedRememberMeServicesTest.php | 37 ++-------- .../TokenBasedRememberMeServicesTest.php | 73 +++---------------- 11 files changed, 100 insertions(+), 181 deletions(-) diff --git a/src/Symfony/Component/Security/Http/Tests/Authenticator/Fixtures/PasswordUpgraderProvider.php b/src/Symfony/Component/Security/Http/Tests/Authenticator/Fixtures/PasswordUpgraderProvider.php index 5836d8893e..d50dbf1be2 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authenticator/Fixtures/PasswordUpgraderProvider.php +++ b/src/Symfony/Component/Security/Http/Tests/Authenticator/Fixtures/PasswordUpgraderProvider.php @@ -11,9 +11,14 @@ namespace Symfony\Component\Security\Http\Tests\Authenticator\Fixtures; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Core\User\PasswordUpgraderInterface; +use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; -abstract class PasswordUpgraderProvider implements UserProviderInterface, PasswordUpgraderInterface +class PasswordUpgraderProvider extends InMemoryUserProvider implements PasswordUpgraderInterface { + public function upgradePassword(UserInterface $user, string $newEncodedPassword): void + { + } } diff --git a/src/Symfony/Component/Security/Http/Tests/Authenticator/FormLoginAuthenticatorTest.php b/src/Symfony/Component/Security/Http/Tests/Authenticator/FormLoginAuthenticatorTest.php index 71169d9884..2acb3ed52f 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authenticator/FormLoginAuthenticatorTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authenticator/FormLoginAuthenticatorTest.php @@ -17,8 +17,7 @@ use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\Security\Core\Exception\BadCredentialsException; use Symfony\Component\Security\Core\Security; -use Symfony\Component\Security\Core\User\User; -use Symfony\Component\Security\Core\User\UserProviderInterface; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; use Symfony\Component\Security\Http\Authenticator\FormLoginAuthenticator; @@ -37,8 +36,7 @@ class FormLoginAuthenticatorTest extends TestCase protected function setUp(): void { - $this->userProvider = $this->createMock(UserProviderInterface::class); - $this->userProvider->expects($this->any())->method('loadUserByUsername')->willReturn(new User('test', 's$cr$t')); + $this->userProvider = new InMemoryUserProvider(['test' => ['password' => 's$cr$t']]); $this->successHandler = $this->createMock(AuthenticationSuccessHandlerInterface::class); $this->failureHandler = $this->createMock(AuthenticationFailureHandlerInterface::class); } @@ -149,8 +147,7 @@ class FormLoginAuthenticatorTest extends TestCase $request = Request::create('/login_check', 'POST', ['_username' => 'wouter', '_password' => 's$cr$t']); $request->setSession($this->createSession()); - $this->userProvider = $this->createMock(PasswordUpgraderProvider::class); - $this->userProvider->expects($this->any())->method('loadUserByUsername')->willReturn(new User('test', 's$cr$t')); + $this->userProvider = new PasswordUpgraderProvider(['test' => ['password' => 's$cr$t']]); $this->setUpAuthenticator(); $passport = $this->authenticator->authenticate($request); diff --git a/src/Symfony/Component/Security/Http/Tests/Authenticator/HttpBasicAuthenticatorTest.php b/src/Symfony/Component/Security/Http/Tests/Authenticator/HttpBasicAuthenticatorTest.php index 79e914965a..0093dabeee 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authenticator/HttpBasicAuthenticatorTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authenticator/HttpBasicAuthenticatorTest.php @@ -6,8 +6,8 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Core\User\User; -use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Authenticator\HttpBasicAuthenticator; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\PasswordUpgradeBadge; use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials; @@ -22,7 +22,7 @@ class HttpBasicAuthenticatorTest extends TestCase protected function setUp(): void { - $this->userProvider = $this->createMock(UserProviderInterface::class); + $this->userProvider = new InMemoryUserProvider(); $this->encoderFactory = $this->createMock(EncoderFactoryInterface::class); $this->encoder = $this->createMock(PasswordEncoderInterface::class); $this->encoderFactory @@ -40,16 +40,12 @@ class HttpBasicAuthenticatorTest extends TestCase 'PHP_AUTH_PW' => 'ThePassword', ]); - $this->userProvider - ->expects($this->any()) - ->method('loadUserByUsername') - ->with('TheUsername') - ->willReturn($user = new User('TheUsername', 'ThePassword')); + $this->userProvider->createUser($user = new User('TheUsername', 'ThePassword')); $passport = $this->authenticator->authenticate($request); $this->assertEquals('ThePassword', $passport->getBadge(PasswordCredentials::class)->getPassword()); - $this->assertSame($user, $passport->getUser()); + $this->assertTrue($user->isEqualTo($passport->getUser())); } /** @@ -77,8 +73,7 @@ class HttpBasicAuthenticatorTest extends TestCase 'PHP_AUTH_PW' => 'ThePassword', ]); - $this->userProvider = $this->createMock(PasswordUpgraderProvider::class); - $this->userProvider->expects($this->any())->method('loadUserByUsername')->willReturn(new User('test', 's$cr$t')); + $this->userProvider = new PasswordUpgraderProvider(['test' => ['password' => 's$cr$t']]); $authenticator = new HttpBasicAuthenticator('test', $this->userProvider); $passport = $authenticator->authenticate($request); diff --git a/src/Symfony/Component/Security/Http/Tests/Authenticator/RemoteUserAuthenticatorTest.php b/src/Symfony/Component/Security/Http/Tests/Authenticator/RemoteUserAuthenticatorTest.php index f55c72abff..b51a9fe643 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authenticator/RemoteUserAuthenticatorTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authenticator/RemoteUserAuthenticatorTest.php @@ -14,8 +14,8 @@ namespace Symfony\Component\Security\Http\Tests\Authenticator; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Core\User\User; -use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Authenticator\RemoteUserAuthenticator; class RemoteUserAuthenticatorTest extends TestCase @@ -23,7 +23,7 @@ class RemoteUserAuthenticatorTest extends TestCase /** * @dataProvider provideAuthenticators */ - public function testSupport(UserProviderInterface $userProvider, RemoteUserAuthenticator $authenticator, $parameterName) + public function testSupport(InMemoryUserProvider $userProvider, RemoteUserAuthenticator $authenticator, $parameterName) { $request = $this->createRequest([$parameterName => 'TheUsername']); @@ -32,7 +32,7 @@ class RemoteUserAuthenticatorTest extends TestCase public function testSupportNoUser() { - $authenticator = new RemoteUserAuthenticator($this->createMock(UserProviderInterface::class), new TokenStorage(), 'main'); + $authenticator = new RemoteUserAuthenticator(new InMemoryUserProvider(), new TokenStorage(), 'main'); $this->assertFalse($authenticator->supports($this->createRequest([]))); } @@ -40,27 +40,24 @@ class RemoteUserAuthenticatorTest extends TestCase /** * @dataProvider provideAuthenticators */ - public function testAuthenticate(UserProviderInterface $userProvider, RemoteUserAuthenticator $authenticator, $parameterName) + public function testAuthenticate(InMemoryUserProvider $userProvider, RemoteUserAuthenticator $authenticator, $parameterName) { $request = $this->createRequest([$parameterName => 'TheUsername']); $authenticator->supports($request); - $userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with('TheUsername') - ->willReturn($user = new User('TheUsername', null)); + $userProvider->createUser($user = new User('TheUsername', null)); $passport = $authenticator->authenticate($request); - $this->assertEquals($user, $passport->getUser()); + $this->assertTrue($user->isEqualTo($passport->getUser())); } public function provideAuthenticators() { - $userProvider = $this->createMock(UserProviderInterface::class); + $userProvider = new InMemoryUserProvider(); yield [$userProvider, new RemoteUserAuthenticator($userProvider, new TokenStorage(), 'main'), 'REMOTE_USER']; - $userProvider = $this->createMock(UserProviderInterface::class); + $userProvider = new InMemoryUserProvider(); yield [$userProvider, new RemoteUserAuthenticator($userProvider, new TokenStorage(), 'main', 'CUSTOM_USER_PARAMETER'), 'CUSTOM_USER_PARAMETER']; } diff --git a/src/Symfony/Component/Security/Http/Tests/Authenticator/X509AuthenticatorTest.php b/src/Symfony/Component/Security/Http/Tests/Authenticator/X509AuthenticatorTest.php index 9f620efd2c..d0322d4759 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authenticator/X509AuthenticatorTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authenticator/X509AuthenticatorTest.php @@ -14,8 +14,8 @@ namespace Symfony\Component\Security\Http\Tests\Authenticator; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Core\User\User; -use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Authenticator\X509Authenticator; class X509AuthenticatorTest extends TestCase @@ -25,7 +25,7 @@ class X509AuthenticatorTest extends TestCase protected function setUp(): void { - $this->userProvider = $this->createMock(UserProviderInterface::class); + $this->userProvider = new InMemoryUserProvider(); $this->authenticator = new X509Authenticator($this->userProvider, new TokenStorage(), 'main'); } @@ -45,10 +45,7 @@ class X509AuthenticatorTest extends TestCase $request = $this->createRequest($serverVars); $this->assertTrue($this->authenticator->supports($request)); - $this->userProvider->expects($this->any()) - ->method('loadUserByUsername') - ->with($username) - ->willReturn(new User($username, null)); + $this->userProvider->createUser(new User($username, null)); $passport = $this->authenticator->authenticate($request); $this->assertEquals($username, $passport->getUser()->getUsername()); @@ -69,10 +66,7 @@ class X509AuthenticatorTest extends TestCase $this->assertTrue($this->authenticator->supports($request)); - $this->userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with($emailAddress) - ->willReturn(new User($emailAddress, null)); + $this->userProvider->createUser(new User($emailAddress, null)); $passport = $this->authenticator->authenticate($request); $this->assertEquals($emailAddress, $passport->getUser()->getUsername()); @@ -105,10 +99,7 @@ class X509AuthenticatorTest extends TestCase ]); $this->assertTrue($authenticator->supports($request)); - $this->userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with('TheUser') - ->willReturn(new User('TheUser', null)); + $this->userProvider->createUser(new User('TheUser', null)); $passport = $this->authenticator->authenticate($request); $this->assertEquals('TheUser', $passport->getUser()->getUsername()); @@ -123,10 +114,7 @@ class X509AuthenticatorTest extends TestCase ]); $this->assertTrue($authenticator->supports($request)); - $this->userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with('cert@example.com') - ->willReturn(new User('cert@example.com', null)); + $this->userProvider->createUser(new User('cert@example.com', null)); $passport = $authenticator->authenticate($request); $this->assertEquals('cert@example.com', $passport->getUser()->getUsername()); diff --git a/src/Symfony/Component/Security/Http/Tests/EventListener/PasswordMigratingListenerTest.php b/src/Symfony/Component/Security/Http/Tests/EventListener/PasswordMigratingListenerTest.php index dea08f0186..285472f037 100644 --- a/src/Symfony/Component/Security/Http/Tests/EventListener/PasswordMigratingListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/EventListener/PasswordMigratingListenerTest.php @@ -16,9 +16,10 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Core\User\PasswordUpgraderInterface; +use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Core\User\UserInterface; -use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Authenticator\AuthenticatorInterface; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\PasswordUpgradeBadge; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; @@ -36,13 +37,12 @@ class PasswordMigratingListenerTest extends TestCase protected function setUp(): void { - $this->user = $this->createMock(UserInterface::class); - $this->user->expects($this->any())->method('getPassword')->willReturn('old-encoded-password'); + $this->user = new User('test', 'old-encoded-password'); $encoder = $this->createMock(PasswordEncoderInterface::class); $encoder->expects($this->any())->method('needsRehash')->willReturn(true); $encoder->expects($this->any())->method('encodePassword')->with('pa$$word', null)->willReturn('new-encoded-password'); $this->encoderFactory = $this->createMock(EncoderFactoryInterface::class); - $this->encoderFactory->expects($this->any())->method('getEncoder')->with($this->user)->willReturn($encoder); + $this->encoderFactory->expects($this->any())->method('getEncoder')->with($this->callback(function ($user) { return $this->user->isEqualTo($user); }))->willReturn($encoder); $this->listener = new PasswordMigratingListener($this->encoderFactory); } @@ -96,12 +96,12 @@ class PasswordMigratingListenerTest extends TestCase public function testUpgradeWithoutUpgrader() { - $userLoader = $this->createMock(MigratingUserProvider::class); - $userLoader->expects($this->any())->method('loadUserByUsername')->willReturn($this->user); + $userLoader = $this->getMockBuilder(MigratingUserProvider::class)->setMethods(['upgradePassword'])->getMock(); + $userLoader->createUser($this->user); $userLoader->expects($this->once()) ->method('upgradePassword') - ->with($this->user, 'new-encoded-password') + ->with($this->callback(function ($user) { return $this->user->isEqualTo($user); }), 'new-encoded-password') ; $event = $this->createEvent(new SelfValidatingPassport(new UserBadge('test', [$userLoader, 'loadUserByUsername']), [new PasswordUpgradeBadge('pa$$word')])); @@ -119,7 +119,7 @@ class PasswordMigratingListenerTest extends TestCase } } -abstract class MigratingUserProvider implements UserProviderInterface, PasswordUpgraderInterface +class MigratingUserProvider extends InMemoryUserProvider implements PasswordUpgraderInterface { public function upgradePassword(UserInterface $user, string $newEncodedPassword): void { diff --git a/src/Symfony/Component/Security/Http/Tests/EventListener/UserProviderListenerTest.php b/src/Symfony/Component/Security/Http/Tests/EventListener/UserProviderListenerTest.php index 95f99de8d0..2f7113e05e 100644 --- a/src/Symfony/Component/Security/Http/Tests/EventListener/UserProviderListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/EventListener/UserProviderListenerTest.php @@ -12,9 +12,9 @@ namespace Symfony\Component\Security\Http\Tests\EventListener; use PHPUnit\Framework\TestCase; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Core\User\UserInterface; -use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Authenticator\AuthenticatorInterface; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport; @@ -28,7 +28,7 @@ class UserProviderListenerTest extends TestCase protected function setUp(): void { - $this->userProvider = $this->createMock(UserProviderInterface::class); + $this->userProvider = new InMemoryUserProvider(); $this->listener = new UserProviderListener($this->userProvider); } @@ -42,8 +42,8 @@ class UserProviderListenerTest extends TestCase $this->assertEquals([$this->userProvider, 'loadUserByUsername'], $badge->getUserLoader()); $user = new User('wouter', null); - $this->userProvider->expects($this->once())->method('loadUserByUsername')->with('wouter')->willReturn($user); - $this->assertSame($user, $passport->getUser()); + $this->userProvider->createUser($user); + $this->assertTrue($user->isEqualTo($passport->getUser())); } /** diff --git a/src/Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php b/src/Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php index 6e48cc5e63..cc333cd7e9 100644 --- a/src/Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php @@ -25,7 +25,6 @@ use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundE use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Core\User\UserCheckerInterface; -use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Event\SwitchUserEvent; use Symfony\Component\Security\Http\Firewall\SwitchUserListener; @@ -112,13 +111,13 @@ class SwitchUserListenerTest extends TestCase public function testExitUserDispatchesEventWithRefreshedUser() { - $originalUser = $this->createMock(UserInterface::class); - $refreshedUser = $this->createMock(UserInterface::class); + $originalUser = new User('username', null); + $refreshedUser = new User('username', null); $this ->userProvider ->expects($this->any()) ->method('refreshUser') - ->with($originalUser) + ->with($this->identicalTo($originalUser)) ->willReturn($refreshedUser); $originalToken = new UsernamePasswordToken($originalUser, '', 'key'); $this->tokenStorage->setToken(new SwitchUserToken('username', '', 'key', ['ROLE_USER'], $originalToken)); @@ -399,13 +398,13 @@ class SwitchUserListenerTest extends TestCase public function testSwitchUserRefreshesOriginalToken() { - $originalUser = $this->createMock(UserInterface::class); - $refreshedOriginalUser = $this->createMock(UserInterface::class); + $originalUser = new User('username', null); + $refreshedOriginalUser = new User('username', null); $this ->userProvider ->expects($this->any()) ->method('refreshUser') - ->with($originalUser) + ->with($this->identicalTo($originalUser)) ->willReturn($refreshedOriginalUser); $originalToken = new UsernamePasswordToken($originalUser, '', 'key'); $this->tokenStorage->setToken(new SwitchUserToken('username', '', 'key', ['ROLE_USER'], $originalToken)); diff --git a/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php index 05c6340b6a..42c8094ba1 100644 --- a/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php @@ -29,7 +29,7 @@ class LoginLinkHandlerTest extends TestCase { /** @var MockObject|UrlGeneratorInterface */ private $router; - /** @var MockObject|UserProviderInterface */ + /** @var TestLoginLinkHandlerUserProvider */ private $userProvider; /** @var PropertyAccessorInterface */ private $propertyAccessor; @@ -39,7 +39,7 @@ class LoginLinkHandlerTest extends TestCase protected function setUp(): void { $this->router = $this->createMock(UrlGeneratorInterface::class); - $this->userProvider = $this->createMock(UserProviderInterface::class); + $this->userProvider = new TestLoginLinkHandlerUserProvider(); $this->propertyAccessor = PropertyAccess::createPropertyAccessor(); $this->expiredLinkStorage = $this->createMock(ExpiredLoginLinkStorage::class); } @@ -94,10 +94,7 @@ class LoginLinkHandlerTest extends TestCase $request = Request::create(sprintf('/login/verify?user=weaverryan&hash=%s&expires=%d', $signature, $expires)); $user = new TestLoginLinkHandlerUser('weaverryan', 'ryan@symfonycasts.com', 'pwhash'); - $this->userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with('weaverryan') - ->willReturn($user); + $this->userProvider->createUser($user); $this->expiredLinkStorage->expects($this->once()) ->method('incrementUsages') @@ -105,7 +102,7 @@ class LoginLinkHandlerTest extends TestCase $linker = $this->createLinker(['max_uses' => 3]); $actualUser = $linker->consumeLoginLink($request); - $this->assertSame($user, $actualUser); + $this->assertEquals($user, $actualUser); } public function testConsumeLoginLinkWithExpired() @@ -116,10 +113,7 @@ class LoginLinkHandlerTest extends TestCase $request = Request::create(sprintf('/login/verify?user=weaverryan&hash=%s&expires=%d', $signature, $expires)); $user = new TestLoginLinkHandlerUser('weaverryan', 'ryan@symfonycasts.com', 'pwhash'); - $this->userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with('weaverryan') - ->willReturn($user); + $this->userProvider->createUser($user); $linker = $this->createLinker(['max_uses' => 3]); $linker->consumeLoginLink($request); @@ -130,11 +124,6 @@ class LoginLinkHandlerTest extends TestCase $this->expectException(InvalidLoginLinkException::class); $request = Request::create('/login/verify?user=weaverryan&hash=thehash&expires=10000'); - $this->userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with('weaverryan') - ->willThrowException(new UsernameNotFoundException()); - $linker = $this->createLinker(); $linker->consumeLoginLink($request); } @@ -145,10 +134,7 @@ class LoginLinkHandlerTest extends TestCase $request = Request::create(sprintf('/login/verify?user=weaverryan&hash=fake_hash&expires=%d', time() + 500)); $user = new TestLoginLinkHandlerUser('weaverryan', 'ryan@symfonycasts.com', 'pwhash'); - $this->userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with('weaverryan') - ->willReturn($user); + $this->userProvider->createUser($user); $linker = $this->createLinker(); $linker->consumeLoginLink($request); @@ -162,10 +148,7 @@ class LoginLinkHandlerTest extends TestCase $request = Request::create(sprintf('/login/verify?user=weaverryan&hash=%s&expires=%d', $signature, $expires)); $user = new TestLoginLinkHandlerUser('weaverryan', 'ryan@symfonycasts.com', 'pwhash'); - $this->userProvider->expects($this->once()) - ->method('loadUserByUsername') - ->with('weaverryan') - ->willReturn($user); + $this->userProvider->createUser($user); $this->expiredLinkStorage->expects($this->once()) ->method('countUsages') @@ -198,6 +181,35 @@ class LoginLinkHandlerTest extends TestCase } } +class TestLoginLinkHandlerUserProvider implements UserProviderInterface +{ + private $users = []; + + public function createUser(TestLoginLinkHandlerUser $user): void + { + $this->users[$user->getUsername()] = $user; + } + + public function loadUserByUsername(string $username): TestLoginLinkHandlerUser + { + if (!isset($this->users[$username])) { + throw new UsernameNotFoundException(); + } + + return clone $this->users[$username]; + } + + public function refreshUser(UserInterface $user) + { + return $this->users[$username]; + } + + public function supportsClass(string $class) + { + return TestLoginLinkHandlerUser::class === $class; + } +} + class TestLoginLinkHandlerUser implements UserInterface { public $username; diff --git a/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php b/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php index f85422fe60..50b16916ae 100644 --- a/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php +++ b/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php @@ -22,9 +22,9 @@ use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Exception\CookieTheftException; use Symfony\Component\Security\Core\Exception\TokenNotFoundException; -use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; +use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Core\User\UserInterface; -use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\RememberMe\PersistentTokenBasedRememberMeServices; use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface; @@ -94,12 +94,6 @@ class PersistentTokenBasedRememberMeServicesTest extends TestCase ; $service->setTokenProvider($tokenProvider); - $userProvider - ->expects($this->once()) - ->method('loadUserByUsername') - ->willThrowException(new UsernameNotFoundException('user not found')) - ; - $this->assertNull($service->autoLogin($request)); $this->assertTrue($request->attributes->has(RememberMeServicesInterface::COOKIE_ATTR_NAME)); } @@ -161,20 +155,10 @@ class PersistentTokenBasedRememberMeServicesTest extends TestCase */ public function testAutoLogin(bool $hashTokenValue) { - $user = $this->createMock(UserInterface::class); - $user - ->expects($this->once()) - ->method('getRoles') - ->willReturn(['ROLE_FOO']) - ; + $user = new User('foouser', null, ['ROLE_FOO']); $userProvider = $this->getProvider(); - $userProvider - ->expects($this->once()) - ->method('loadUserByUsername') - ->with($this->equalTo('foouser')) - ->willReturn($user) - ; + $userProvider->createUser($user); $service = $this->getService($userProvider, ['name' => 'foo', 'path' => null, 'domain' => null, 'secure' => false, 'httponly' => false, 'always_remember_me' => true, 'lifetime' => 3600]); $request = new Request(); @@ -186,14 +170,14 @@ class PersistentTokenBasedRememberMeServicesTest extends TestCase ->expects($this->once()) ->method('loadTokenBySeries') ->with($this->equalTo('fooseries')) - ->willReturn(new PersistentToken('fooclass', 'foouser', 'fooseries', $tokenValue, new \DateTime())) + ->willReturn(new PersistentToken(User::class, 'foouser', 'fooseries', $tokenValue, new \DateTime())) ; $service->setTokenProvider($tokenProvider); $returnedToken = $service->autoLogin($request); $this->assertInstanceOf(RememberMeToken::class, $returnedToken); - $this->assertSame($user, $returnedToken->getUser()); + $this->assertTrue($user->isEqualTo($returnedToken->getUser())); $this->assertEquals('foosecret', $returnedToken->getSecret()); $this->assertTrue($request->attributes->has(RememberMeServicesInterface::COOKIE_ATTR_NAME)); } @@ -339,14 +323,7 @@ class PersistentTokenBasedRememberMeServicesTest extends TestCase protected function getProvider() { - $provider = $this->createMock(UserProviderInterface::class); - $provider - ->expects($this->any()) - ->method('supportsClass') - ->willReturn(true) - ; - - return $provider; + return new InMemoryUserProvider(); } protected function generateHash(string $tokenValue): string diff --git a/src/Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php b/src/Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php index 55cfb678f3..ea4f6dc89b 100644 --- a/src/Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php +++ b/src/Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php @@ -18,9 +18,9 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; -use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; +use Symfony\Component\Security\Core\User\InMemoryUserProvider; +use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Core\User\UserInterface; -use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface; use Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices; @@ -51,12 +51,6 @@ class TokenBasedRememberMeServicesTest extends TestCase $request = new Request(); $request->cookies->set('foo', $this->getCookie('fooclass', 'foouser', time() + 3600, 'foopass')); - $userProvider - ->expects($this->once()) - ->method('loadUserByUsername') - ->willThrowException(new UsernameNotFoundException('user not found')) - ; - $this->assertNull($service->autoLogin($request)); $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared()); } @@ -68,19 +62,8 @@ class TokenBasedRememberMeServicesTest extends TestCase $request = new Request(); $request->cookies->set('foo', base64_encode('class:'.base64_encode('foouser').':123456789:fooHash')); - $user = $this->createMock(UserInterface::class); - $user - ->expects($this->once()) - ->method('getPassword') - ->willReturn('foopass') - ; - - $userProvider - ->expects($this->once()) - ->method('loadUserByUsername') - ->with($this->equalTo('foouser')) - ->willReturn($user) - ; + $user = new User('foouser', 'foopass'); + $userProvider->createUser($user); $this->assertNull($service->autoLogin($request)); $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared()); @@ -93,19 +76,8 @@ class TokenBasedRememberMeServicesTest extends TestCase $request = new Request(); $request->cookies->set('foo', $this->getCookie('fooclass', 'foouser', time() - 1, 'foopass')); - $user = $this->createMock(UserInterface::class); - $user - ->expects($this->once()) - ->method('getPassword') - ->willReturn('foopass') - ; - - $userProvider - ->expects($this->once()) - ->method('loadUserByUsername') - ->with($this->equalTo('foouser')) - ->willReturn($user) - ; + $user = new User('foouser', 'foopass'); + $userProvider->createUser($user); $this->assertNull($service->autoLogin($request)); $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared()); @@ -118,34 +90,18 @@ class TokenBasedRememberMeServicesTest extends TestCase */ public function testAutoLogin($username) { - $user = $this->createMock(UserInterface::class); - $user - ->expects($this->once()) - ->method('getRoles') - ->willReturn(['ROLE_FOO']) - ; - $user - ->expects($this->once()) - ->method('getPassword') - ->willReturn('foopass') - ; - $userProvider = $this->getProvider(); - $userProvider - ->expects($this->once()) - ->method('loadUserByUsername') - ->with($this->equalTo($username)) - ->willReturn($user) - ; + $user = new User($username, 'foopass', ['ROLE_FOO']); + $userProvider->createUser($user); $service = $this->getService($userProvider, ['name' => 'foo', 'always_remember_me' => true, 'lifetime' => 3600]); $request = new Request(); - $request->cookies->set('foo', $this->getCookie('fooclass', $username, time() + 3600, 'foopass')); + $request->cookies->set('foo', $this->getCookie(User::class, $username, time() + 3600, 'foopass')); $returnedToken = $service->autoLogin($request); $this->assertInstanceOf(RememberMeToken::class, $returnedToken); - $this->assertSame($user, $returnedToken->getUser()); + $this->assertTrue($user->isEqualTo($returnedToken->getUser())); $this->assertEquals('foosecret', $returnedToken->getSecret()); } @@ -279,13 +235,6 @@ class TokenBasedRememberMeServicesTest extends TestCase protected function getProvider() { - $provider = $this->createMock(UserProviderInterface::class); - $provider - ->expects($this->any()) - ->method('supportsClass') - ->willReturn(true) - ; - - return $provider; + return new InMemoryUserProvider(); } }