diff --git a/lib/Doctrine/Repositories/UserRepository.php b/lib/Doctrine/Repositories/UserRepository.php index 746b50a62e..623ae541b6 100644 --- a/lib/Doctrine/Repositories/UserRepository.php +++ b/lib/Doctrine/Repositories/UserRepository.php @@ -12,6 +12,7 @@ namespace Repositories; use Doctrine\ORM\EntityRepository; +use Entities\User; /** * User @@ -21,4 +22,89 @@ use Doctrine\ORM\EntityRepository; */ class UserRepository extends EntityRepository { + /** + * Finds admins + * + * @return array + */ + public function findAdmins() + { + $qb = $this->createQueryBuilder('u'); + + $qb->where($qb->expr()->eq('u.admin', $qb->expr()->literal(true))) + ->andWhere($qb->expr()->isNull('u.modelOf')) + ->andWhere($qb->expr()->eq('u.deleted', $qb->expr()->literal(false))); + + return $qb->getQuery()->getResult(); + } + + /** + * Sets a selection of user + * + * @param array $users An array of user + * + * @return integer The number of processed rows + */ + public function setAdmins(array $users) + { + $qb = $this->createQueryBuilder('u'); + + $qb->update('Entities\User', 'u') + ->set('u.admin', $qb->expr()->literal(true)) + ->where($qb->expr()->in('u.id', array_map(function($value) { + if ($value instanceof User) { + return $value->getId(); + } + + return (int) $value; + }, $users))); + + return $qb->getQuery()->execute(); + } + + /** + * Resets all admins + * + * @return integer The number of processed rows + */ + public function resetAdmins() + { + $qb = $this->createQueryBuilder('u'); + + $qb->update('Entities\User', 'u') + ->set('u.admin', $qb->expr()->literal(false)) + ->where($qb->expr()->eq('u.admin', $qb->expr()->literal(true))); + + return $qb->getQuery()->execute(); + } + + /** + * Finds a user by login + * + * @param string $login + * + * @return null|User + */ + public function findByLogin($login) + { + return $this->findOneBy(array('login' => $login)); + } + + /** + * Finds a user by email + * + * @param string $email + * + * @return null|User + */ + public function findByEmail($email) + { + $qb = $this->createQueryBuilder('u'); + + $qb->where($qb->expr()->eq('u.email', $email)) + ->andWhere($qb->expr()->isNotNull('u.email')) + ->andWhere($qb->expr()->eq('u.deleted', $qb->expr()->literal(false))); + + return $qb->getQuery()->getOneOrNullResult(); + } } diff --git a/tests/Doctrine/Tests/Repositories/UserRepositoryTest.php b/tests/Doctrine/Tests/Repositories/UserRepositoryTest.php new file mode 100644 index 0000000000..f7a2f68a01 --- /dev/null +++ b/tests/Doctrine/Tests/Repositories/UserRepositoryTest.php @@ -0,0 +1,104 @@ +markTestSkipped('missing deleted field'); + $user = new User(); + $user->setLogin('login'); + $user->setPassword('toto'); + $this->insertOneUser($user); + $users = self::$DI['app']['EM']->getRepository('Entities\User')->findAdmins(); + $this->assertEquals(0, count($users)); + + $user->setAdmin(true); + $this->insertOneUser($user); + $users = self::$DI['app']['EM']->getRepository('Entities\User')->findAdmins(); + $this->assertEquals(1, count($users)); + + $user->setModelOf(1); + $this->insertOneUser($user); + $users = self::$DI['app']['EM']->getRepository('Entities\User')->findAdmins(); + $this->assertEquals(0, count($users)); + + $user->setModelOf(null); + $user->setModelOf(true); + $this->insertOneUser($user); + $users = self::$DI['app']['EM']->getRepository('Entities\User')->findAdmins(); + $this->assertEquals(0, count($users)); + } + + public function testSetAdmins() + { + $user = new User(); + $user->setLogin('login'); + $user->setPassword('toto'); + $this->insertOneUser($user); + $this->assertFalse($user->isAdmin()); + self::$DI['app']['EM']->getRepository('Entities\User')->setAdmins(array($user)); + $user = self::$DI['app']['EM']->getReference('Entities\User', $user->getId()); + self::$DI['app']['EM']->refresh($user); + $this->assertTrue($user->isAdmin()); + } + + public function testResetAdmins() + { + $user = new User(); + $user->setLogin('login'); + $user->setPassword('toto'); + $user->setAdmin(true); + $this->insertOneUser($user); + $this->assertTrue($user->isAdmin()); + self::$DI['app']['EM']->getRepository('Entities\User')->resetAdmins(); + $user = self::$DI['app']['EM']->getReference('Entities\User', $user->getId()); + self::$DI['app']['EM']->refresh($user); + $this->assertFalse($user->isAdmin()); + } + + public function testFindByLogin() + { + $user = new User(); + $user->setLogin('login'); + $user->setPassword('toto'); + $this->insertOneUser($user); + $user = self::$DI['app']['EM']->getRepository('Entities\User')->findByLogin('login'); + $this->assertInstanceOf('Entities\User', $user); + $this->assertNull(self::$DI['app']['EM']->getRepository('Entities\User')->findByLogin('wrong-login')); + } + + public function testFindByEmail() + { + $this->markTestSkipped('missing deleted field'); + $user = new User(); + $user->setLogin('login'); + $user->setPassword('toto'); + $user->setEmail('toto@toto.to'); + $this->insertOneUser($user); + $userFound = self::$DI['app']['EM']->getRepository('Entities\User')->findByEmail('toto@toto.to'); + $this->assertInstanceOf('Entities\User', $userFound); + + $user->setDeleted(true); + $this->insertOneUser($user); + $userFound = self::$DI['app']['EM']->getRepository('Entities\User')->findByEmail('toto@toto.to'); + $this->assertNull($userFound); + + $user->setEmail(null); + $this->insertOneUser($user); + $userFound = self::$DI['app']['EM']->getRepository('Entities\User')->findByEmail(null); + $this->assertNull($userFound); + } +} \ No newline at end of file diff --git a/tests/classes/PhraseanetPHPUnitAbstract.php b/tests/classes/PhraseanetPHPUnitAbstract.php index e120e09f7c..b691b7ec34 100644 --- a/tests/classes/PhraseanetPHPUnitAbstract.php +++ b/tests/classes/PhraseanetPHPUnitAbstract.php @@ -4,6 +4,7 @@ use Alchemy\Phrasea\CLI; use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Border\File; use Doctrine\Common\DataFixtures\Loader; +use Entities\User; use Silex\WebTestCase; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Client; @@ -568,6 +569,22 @@ abstract class PhraseanetPHPUnitAbstract extends WebTestCase return; } + protected function insertOneUser(User $user) + { + try { + $userFixture = new PhraseaFixture\User\LoadOneUser(); + $userFixture->setUser($user); + + $loader = new Loader(); + $loader->addFixture($userFixture); + + $this->insertFixtureInDatabase($loader); + + } catch (\Exception $e) { + $this->fail('Fail load one Basket : ' . $e->getMessage()); + } + } + /** * Calls a URI as XMLHTTP request. *