* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bridge\Doctrine\Tests\Security\User; use Doctrine\ORM\Tools\SchemaTool; use PHPUnit\Framework\TestCase; use Symfony\Bridge\Doctrine\Security\User\EntityUserProvider; use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper; use Symfony\Bridge\Doctrine\Tests\Fixtures\User; class EntityUserProviderTest extends TestCase { public function testRefreshUserGetsUserByPrimaryKey() { $em = DoctrineTestHelper::createTestEntityManager(); $this->createSchema($em); $user1 = new User(1, 1, 'user1'); $user2 = new User(1, 2, 'user2'); $em->persist($user1); $em->persist($user2); $em->flush(); $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name'); // try to change the user identity $user1->name = 'user2'; $this->assertSame($user1, $provider->refreshUser($user1)); } public function testLoadUserByUsername() { $em = DoctrineTestHelper::createTestEntityManager(); $this->createSchema($em); $user = new User(1, 1, 'user1'); $em->persist($user); $em->flush(); $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name'); $this->assertSame($user, $provider->loadUserByUsername('user1')); } public function testLoadUserByUsernameWithUserLoaderRepositoryAndWithoutProperty() { $user = new User(1, 1, 'user1'); $repository = $this->getMockBuilder('Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface') ->disableOriginalConstructor() ->getMock(); $repository ->expects($this->once()) ->method('loadUserByUsername') ->with('user1') ->willReturn($user); $em = $this->getMockBuilder('Doctrine\ORM\EntityManager') ->disableOriginalConstructor() ->getMock(); $em ->expects($this->once()) ->method('getRepository') ->with('Symfony\Bridge\Doctrine\Tests\Fixtures\User') ->willReturn($repository); $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User'); $this->assertSame($user, $provider->loadUserByUsername('user1')); } /** * @group legacy * @expectedDeprecation Implementing Symfony\Component\Security\Core\User\UserProviderInterface in a Doctrine repository when using the entity provider is deprecated since Symfony 2.8 and will not be supported in 3.0. Make the repository implement Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface instead. */ public function testLoadUserByUsernameWithUserProviderRepositoryAndWithoutProperty() { $user = new User(1, 1, 'user1'); $repository = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserProviderInterface') ->disableOriginalConstructor() ->getMock(); $repository ->expects($this->once()) ->method('loadUserByUsername') ->with('user1') ->willReturn($user); $em = $this->getMockBuilder('Doctrine\ORM\EntityManager') ->disableOriginalConstructor() ->getMock(); $em ->expects($this->once()) ->method('getRepository') ->with('Symfony\Bridge\Doctrine\Tests\Fixtures\User') ->willReturn($repository); $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User'); $this->assertSame($user, $provider->loadUserByUsername('user1')); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage You must either make the "Symfony\Bridge\Doctrine\Tests\Fixtures\User" entity Doctrine Repository ("Doctrine\ORM\EntityRepository") implement "Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface" or set the "property" option in the corresponding entity provider configuration. */ public function testLoadUserByUsernameWithNonUserLoaderRepositoryAndWithoutProperty() { $em = DoctrineTestHelper::createTestEntityManager(); $this->createSchema($em); $user = new User(1, 1, 'user1'); $em->persist($user); $em->flush(); $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User'); $provider->loadUserByUsername('user1'); } public function testRefreshUserRequiresId() { $em = DoctrineTestHelper::createTestEntityManager(); $user1 = new User(null, null, 'user1'); $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name'); $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}( 'InvalidArgumentException', 'You cannot refresh a user from the EntityUserProvider that does not contain an identifier. The user object has to be serialized with its own identifier mapped by Doctrine' ); $provider->refreshUser($user1); } public function testRefreshInvalidUser() { $em = DoctrineTestHelper::createTestEntityManager(); $this->createSchema($em); $user1 = new User(1, 1, 'user1'); $em->persist($user1); $em->flush(); $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name'); $user2 = new User(1, 2, 'user2'); $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}( 'Symfony\Component\Security\Core\Exception\UsernameNotFoundException', 'User with id {"id1":1,"id2":2} not found' ); $provider->refreshUser($user2); } public function testSupportProxy() { $em = DoctrineTestHelper::createTestEntityManager(); $this->createSchema($em); $user1 = new User(1, 1, 'user1'); $em->persist($user1); $em->flush(); $em->clear(); $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name'); $user2 = $em->getReference('Symfony\Bridge\Doctrine\Tests\Fixtures\User', array('id1' => 1, 'id2' => 1)); $this->assertTrue($provider->supportsClass(\get_class($user2))); } public function testLoadUserByUserNameShouldLoadUserWhenProperInterfaceProvided() { $repository = $this->getMockBuilder('\Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface')->getMock(); $repository->expects($this->once()) ->method('loadUserByUsername') ->with('name') ->willReturn( $this->getMockBuilder('\Symfony\Component\Security\Core\User\UserInterface')->getMock() ); $provider = new EntityUserProvider( $this->getManager($this->getObjectManager($repository)), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User' ); $provider->loadUserByUsername('name'); } /** * @expectedException \InvalidArgumentException */ public function testLoadUserByUserNameShouldDeclineInvalidInterface() { $repository = $this->getMockBuilder('\Symfony\Component\Security\Core\User\AdvancedUserInterface')->getMock(); $provider = new EntityUserProvider( $this->getManager($this->getObjectManager($repository)), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User' ); $provider->loadUserByUsername('name'); } private function getManager($em, $name = null) { $manager = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry')->getMock(); $manager->expects($this->any()) ->method('getManager') ->with($this->equalTo($name)) ->will($this->returnValue($em)); return $manager; } private function getObjectManager($repository) { $em = $this->getMockBuilder('\Doctrine\Common\Persistence\ObjectManager') ->setMethods(array('getClassMetadata', 'getRepository')) ->getMockForAbstractClass(); $em->expects($this->any()) ->method('getRepository') ->willReturn($repository); return $em; } private function createSchema($em) { $schemaTool = new SchemaTool($em); $schemaTool->createSchema(array( $em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\User'), )); } }