3 namespace Doctrine\Tests\ORM\Functional;
5 use Doctrine\Tests\Models\CMS\CmsUser;
6 use Doctrine\Tests\Models\CMS\CmsAddress;
7 use Doctrine\Tests\Models\CMS\CmsPhonenumber;
8 use Doctrine\Common\Collections\Criteria;
10 require_once __DIR__ . '/../../TestInit.php';
15 class EntityRepositoryTest extends \Doctrine\Tests\OrmFunctionalTestCase
17 protected function setUp() {
18 $this->useModelSet('cms');
22 public function tearDown()
25 $this->_em->getConfiguration()->setEntityNamespaces(array());
30 public function loadFixture()
33 $user->name = 'Roman';
34 $user->username = 'romanb';
35 $user->status = 'freak';
36 $this->_em->persist($user);
39 $user2->name = 'Guilherme';
40 $user2->username = 'gblanco';
41 $user2->status = 'dev';
42 $this->_em->persist($user2);
45 $user3->name = 'Benjamin';
46 $user3->username = 'beberlei';
47 $user3->status = null;
48 $this->_em->persist($user3);
51 $user4->name = 'Alexander';
52 $user4->username = 'asm89';
53 $user4->status = 'dev';
54 $this->_em->persist($user4);
58 $user1Id = $user->getId();
70 public function loadAssociatedFixture()
72 $address = new CmsAddress();
73 $address->city = "Berlin";
74 $address->country = "Germany";
75 $address->street = "Foostreet";
76 $address->zip = "12345";
78 $user = new CmsUser();
79 $user->name = 'Roman';
80 $user->username = 'romanb';
81 $user->status = 'freak';
82 $user->setAddress($address);
84 $this->_em->persist($user);
85 $this->_em->persist($address);
89 return array($user->id, $address->id);
92 public function buildUser($name, $username, $status, $address)
94 $user = new CmsUser();
96 $user->username = $username;
97 $user->status = $status;
98 $user->setAddress($address);
100 $this->_em->persist($user);
106 public function buildAddress($country, $city, $street, $zip)
108 $address = new CmsAddress();
109 $address->country = $country;
110 $address->city = $city;
111 $address->street = $street;
112 $address->zip = $zip;
114 $this->_em->persist($address);
120 public function testBasicFind()
122 $user1Id = $this->loadFixture();
123 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
125 $user = $repos->find($user1Id);
126 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser',$user);
127 $this->assertEquals('Roman', $user->name);
128 $this->assertEquals('freak', $user->status);
131 public function testFindByField()
133 $user1Id = $this->loadFixture();
134 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
136 $users = $repos->findBy(array('status' => 'dev'));
137 $this->assertEquals(2, count($users));
138 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser',$users[0]);
139 $this->assertEquals('Guilherme', $users[0]->name);
140 $this->assertEquals('dev', $users[0]->status);
143 public function testFindByAssociationWithIntegerAsParameter()
145 $address1 = $this->buildAddress('Germany', 'Berlim', 'Foo st.', '123456');
146 $user1 = $this->buildUser('Benjamin', 'beberlei', 'dev', $address1);
148 $address2 = $this->buildAddress('Brazil', 'São Paulo', 'Bar st.', '654321');
149 $user2 = $this->buildUser('Guilherme', 'guilhermeblanco', 'freak', $address2);
151 $address3 = $this->buildAddress('USA', 'Nashville', 'Woo st.', '321654');
152 $user3 = $this->buildUser('Jonathan', 'jwage', 'dev', $address3);
160 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsAddress');
161 $addresses = $repository->findBy(array('user' => array($user1->getId(), $user2->getId())));
163 $this->assertEquals(2, count($addresses));
164 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddress',$addresses[0]);
167 public function testFindByAssociationWithObjectAsParameter()
169 $address1 = $this->buildAddress('Germany', 'Berlim', 'Foo st.', '123456');
170 $user1 = $this->buildUser('Benjamin', 'beberlei', 'dev', $address1);
172 $address2 = $this->buildAddress('Brazil', 'São Paulo', 'Bar st.', '654321');
173 $user2 = $this->buildUser('Guilherme', 'guilhermeblanco', 'freak', $address2);
175 $address3 = $this->buildAddress('USA', 'Nashville', 'Woo st.', '321654');
176 $user3 = $this->buildUser('Jonathan', 'jwage', 'dev', $address3);
184 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsAddress');
185 $addresses = $repository->findBy(array('user' => array($user1, $user2)));
187 $this->assertEquals(2, count($addresses));
188 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddress',$addresses[0]);
191 public function testFindFieldByMagicCall()
193 $user1Id = $this->loadFixture();
194 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
196 $users = $repos->findByStatus('dev');
197 $this->assertEquals(2, count($users));
198 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser',$users[0]);
199 $this->assertEquals('Guilherme', $users[0]->name);
200 $this->assertEquals('dev', $users[0]->status);
203 public function testFindAll()
205 $user1Id = $this->loadFixture();
206 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
208 $users = $repos->findAll();
209 $this->assertEquals(4, count($users));
212 public function testFindByAlias()
214 $user1Id = $this->loadFixture();
215 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
217 $this->_em->getConfiguration()->addEntityNamespace('CMS', 'Doctrine\Tests\Models\CMS');
219 $repos = $this->_em->getRepository('CMS:CmsUser');
221 $users = $repos->findAll();
222 $this->assertEquals(4, count($users));
226 * @expectedException \Doctrine\ORM\ORMException
228 public function testExceptionIsThrownWhenCallingFindByWithoutParameter() {
229 $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser')
234 * @expectedException \Doctrine\ORM\ORMException
236 public function testExceptionIsThrownWhenUsingInvalidFieldName() {
237 $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser')
238 ->findByThisFieldDoesNotExist('testvalue');
245 public function testPessimisticReadLockWithoutTransaction_ThrowsException()
247 $this->setExpectedException('Doctrine\ORM\TransactionRequiredException');
249 $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser')
250 ->find(1, \Doctrine\DBAL\LockMode::PESSIMISTIC_READ);
257 public function testPessimisticWriteLockWithoutTransaction_ThrowsException()
259 $this->setExpectedException('Doctrine\ORM\TransactionRequiredException');
261 $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser')
262 ->find(1, \Doctrine\DBAL\LockMode::PESSIMISTIC_WRITE);
269 public function testOptimisticLockUnversionedEntity_ThrowsException()
271 $this->setExpectedException('Doctrine\ORM\OptimisticLockException');
273 $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser')
274 ->find(1, \Doctrine\DBAL\LockMode::OPTIMISTIC);
281 public function testIdentityMappedOptimisticLockUnversionedEntity_ThrowsException()
284 $user->name = 'Roman';
285 $user->username = 'romanb';
286 $user->status = 'freak';
287 $this->_em->persist($user);
292 $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $userId);
294 $this->setExpectedException('Doctrine\ORM\OptimisticLockException');
295 $this->_em->find('Doctrine\Tests\Models\CMS\CmsUser', $userId, \Doctrine\DBAL\LockMode::OPTIMISTIC);
301 public function testFindMagicCallByNullValue()
303 $this->loadFixture();
305 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
307 $users = $repos->findByStatus(null);
308 $this->assertEquals(1, count($users));
314 public function testInvalidMagicCall()
316 $this->setExpectedException('BadMethodCallException');
318 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
325 public function testFindByAssociationKey_ExceptionOnInverseSide()
327 list($userId, $addressId) = $this->loadAssociatedFixture();
328 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
330 $this->setExpectedException('Doctrine\ORM\ORMException', "You cannot search for the association field 'Doctrine\Tests\Models\CMS\CmsUser#address', because it is the inverse side of an association. Find methods only work on owning side associations.");
331 $user = $repos->findBy(array('address' => $addressId));
337 public function testFindOneByAssociationKey()
339 list($userId, $addressId) = $this->loadAssociatedFixture();
340 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsAddress');
341 $address = $repos->findOneBy(array('user' => $userId));
343 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddress', $address);
344 $this->assertEquals($addressId, $address->id);
350 public function testFindByAssociationKey()
352 list($userId, $addressId) = $this->loadAssociatedFixture();
353 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsAddress');
354 $addresses = $repos->findBy(array('user' => $userId));
356 $this->assertContainsOnly('Doctrine\Tests\Models\CMS\CmsAddress', $addresses);
357 $this->assertEquals(1, count($addresses));
358 $this->assertEquals($addressId, $addresses[0]->id);
364 public function testFindAssociationByMagicCall()
366 list($userId, $addressId) = $this->loadAssociatedFixture();
367 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsAddress');
368 $addresses = $repos->findByUser($userId);
370 $this->assertContainsOnly('Doctrine\Tests\Models\CMS\CmsAddress', $addresses);
371 $this->assertEquals(1, count($addresses));
372 $this->assertEquals($addressId, $addresses[0]->id);
378 public function testFindOneAssociationByMagicCall()
380 list($userId, $addressId) = $this->loadAssociatedFixture();
381 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsAddress');
382 $address = $repos->findOneByUser($userId);
384 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddress', $address);
385 $this->assertEquals($addressId, $address->id);
388 public function testValidNamedQueryRetrieval()
390 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
392 $query = $repos->createNamedQuery('all');
394 $this->assertInstanceOf('Doctrine\ORM\Query', $query);
395 $this->assertEquals('SELECT u FROM Doctrine\Tests\Models\CMS\CmsUser u', $query->getDQL());
398 public function testInvalidNamedQueryRetrieval()
400 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
402 $this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
404 $repos->createNamedQuery('invalidNamedQuery');
410 public function testIsNullCriteriaDoesNotGenerateAParameter()
412 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
413 $users = $repos->findBy(array('status' => null, 'username' => 'romanb'));
415 $params = $this->_sqlLoggerStack->queries[$this->_sqlLoggerStack->currentQuery]['params'];
416 $this->assertEquals(1, count($params), "Should only execute with one parameter.");
417 $this->assertEquals(array('romanb'), $params);
420 public function testIsNullCriteria()
422 $this->loadFixture();
424 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
426 $users = $repos->findBy(array('status' => null));
427 $this->assertEquals(1, count($users));
433 public function testFindByLimitOffset()
435 $this->loadFixture();
437 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
439 $users1 = $repos->findBy(array(), null, 1, 0);
440 $users2 = $repos->findBy(array(), null, 1, 1);
442 $this->assertEquals(4, count($repos->findBy(array())));
443 $this->assertEquals(1, count($users1));
444 $this->assertEquals(1, count($users2));
445 $this->assertNotSame($users1[0], $users2[0]);
451 public function testFindByOrderBy()
453 $this->loadFixture();
455 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
456 $usersAsc = $repos->findBy(array(), array("username" => "ASC"));
457 $usersDesc = $repos->findBy(array(), array("username" => "DESC"));
459 $this->assertEquals(4, count($usersAsc), "Pre-condition: only four users in fixture");
460 $this->assertEquals(4, count($usersDesc), "Pre-condition: only four users in fixture");
461 $this->assertSame($usersAsc[0], $usersDesc[3]);
462 $this->assertSame($usersAsc[3], $usersDesc[0]);
468 public function testFindFieldByMagicCallOrderBy()
470 $this->loadFixture();
471 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
473 $usersAsc = $repos->findByStatus('dev', array('username' => "ASC"));
474 $usersDesc = $repos->findByStatus('dev', array('username' => "DESC"));
476 $this->assertEquals(2, count($usersAsc));
477 $this->assertEquals(2, count($usersDesc));
479 $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser',$usersAsc[0]);
480 $this->assertEquals('Alexander', $usersAsc[0]->name);
481 $this->assertEquals('dev', $usersAsc[0]->status);
483 $this->assertSame($usersAsc[0], $usersDesc[1]);
484 $this->assertSame($usersAsc[1], $usersDesc[0]);
490 public function testFindFieldByMagicCallLimitOffset()
492 $this->loadFixture();
493 $repos = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
495 $users1 = $repos->findByStatus('dev', array(), 1, 0);
496 $users2 = $repos->findByStatus('dev', array(), 1, 1);
498 $this->assertEquals(1, count($users1));
499 $this->assertEquals(1, count($users2));
500 $this->assertNotSame($users1[0], $users2[0]);
506 public function testDefaultRepositoryClassName()
508 $this->assertEquals($this->_em->getConfiguration()->getDefaultRepositoryClassName(), "Doctrine\ORM\EntityRepository");
509 $this->_em->getConfiguration()->setDefaultRepositoryClassName("Doctrine\Tests\Models\DDC753\DDC753DefaultRepository");
510 $this->assertEquals($this->_em->getConfiguration()->getDefaultRepositoryClassName(), "Doctrine\Tests\Models\DDC753\DDC753DefaultRepository");
512 $repos = $this->_em->getRepository('Doctrine\Tests\Models\DDC753\DDC753EntityWithDefaultCustomRepository');
513 $this->assertInstanceOf("Doctrine\Tests\Models\DDC753\DDC753DefaultRepository", $repos);
514 $this->assertTrue($repos->isDefaultRepository());
517 $repos = $this->_em->getRepository('Doctrine\Tests\Models\DDC753\DDC753EntityWithCustomRepository');
518 $this->assertInstanceOf("Doctrine\Tests\Models\DDC753\DDC753CustomRepository", $repos);
519 $this->assertTrue($repos->isCustomRepository());
521 $this->assertEquals($this->_em->getConfiguration()->getDefaultRepositoryClassName(), "Doctrine\Tests\Models\DDC753\DDC753DefaultRepository");
522 $this->_em->getConfiguration()->setDefaultRepositoryClassName("Doctrine\ORM\EntityRepository");
523 $this->assertEquals($this->_em->getConfiguration()->getDefaultRepositoryClassName(), "Doctrine\ORM\EntityRepository");
530 * @expectedException Doctrine\ORM\ORMException
531 * @expectedExceptionMessage Invalid repository class 'Doctrine\Tests\Models\DDC753\DDC753InvalidRepository'. It must be a Doctrine\Common\Persistence\ObjectRepository.
533 public function testSetDefaultRepositoryInvalidClassError()
535 $this->assertEquals($this->_em->getConfiguration()->getDefaultRepositoryClassName(), "Doctrine\ORM\EntityRepository");
536 $this->_em->getConfiguration()->setDefaultRepositoryClassName("Doctrine\Tests\Models\DDC753\DDC753InvalidRepository");
542 public function testInvalidOrientation()
544 $this->setExpectedException('Doctrine\ORM\ORMException', 'Invalid order by orientation specified for Doctrine\Tests\Models\CMS\CmsUser#username');
546 $repo = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
547 $repo->findBy(array('status' => 'test'), array('username' => 'INVALID'));
553 public function testFindByAssocationArray()
555 $repo = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsArticle');
556 $data = $repo->findBy(array('user' => array(1, 2, 3)));
558 $query = array_pop($this->_sqlLoggerStack->queries);
559 $this->assertEquals(array(1,2,3), $query['params'][0]);
560 $this->assertEquals(\Doctrine\DBAL\Connection::PARAM_INT_ARRAY, $query['types'][0]);
566 public function testMatchingEmptyCriteria()
568 $this->loadFixture();
570 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
571 $users = $repository->matching(new Criteria());
573 $this->assertEquals(4, count($users));
579 public function testMatchingCriteriaEqComparison()
581 $this->loadFixture();
583 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
584 $users = $repository->matching(new Criteria(
585 Criteria::expr()->eq('username', 'beberlei')
588 $this->assertEquals(1, count($users));
594 public function testMatchingCriteriaNeqComparison()
596 $this->loadFixture();
598 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
599 $users = $repository->matching(new Criteria(
600 Criteria::expr()->neq('username', 'beberlei')
603 $this->assertEquals(3, count($users));
609 public function testMatchingCriteriaInComparison()
611 $this->loadFixture();
613 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
614 $users = $repository->matching(new Criteria(
615 Criteria::expr()->in('username', array('beberlei', 'gblanco'))
618 $this->assertEquals(2, count($users));
624 public function testMatchingCriteriaNotInComparison()
626 $this->loadFixture();
628 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
629 $users = $repository->matching(new Criteria(
630 Criteria::expr()->notIn('username', array('beberlei', 'gblanco', 'asm89'))
633 $this->assertEquals(1, count($users));
639 public function testMatchingCriteriaLtComparison()
641 $firstUserId = $this->loadFixture();
643 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
644 $users = $repository->matching(new Criteria(
645 Criteria::expr()->lt('id', $firstUserId + 1)
648 $this->assertEquals(1, count($users));
654 public function testMatchingCriteriaLeComparison()
656 $firstUserId = $this->loadFixture();
658 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
659 $users = $repository->matching(new Criteria(
660 Criteria::expr()->lte('id', $firstUserId + 1)
663 $this->assertEquals(2, count($users));
669 public function testMatchingCriteriaGtComparison()
671 $firstUserId = $this->loadFixture();
673 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
674 $users = $repository->matching(new Criteria(
675 Criteria::expr()->gt('id', $firstUserId)
678 $this->assertEquals(3, count($users));
684 public function testMatchingCriteriaGteComparison()
686 $firstUserId = $this->loadFixture();
688 $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser');
689 $users = $repository->matching(new Criteria(
690 Criteria::expr()->gte('id', $firstUserId)
693 $this->assertEquals(4, count($users));