2010-12-04 19:44:10 +01:00
< ? php
namespace Doctrine\Tests\ORM\Functional ;
use Doctrine\ORM\Mapping\ClassMetadataInfo ;
2015-01-24 12:51:19 +01:00
use Doctrine\Tests\Models\Tweet\Tweet ;
use Doctrine\Tests\Models\Tweet\User ;
2015-01-27 07:42:48 +01:00
use Doctrine\Tests\Models\Tweet\UserList ;
use Doctrine\Tests\OrmFunctionalTestCase ;
2010-12-04 19:44:10 +01:00
require_once __DIR__ . '/../../TestInit.php' ;
/**
* Description of ExtraLazyCollectionTest
*
* @ author beberlei
*/
class ExtraLazyCollectionTest extends \Doctrine\Tests\OrmFunctionalTestCase
{
private $userId ;
private $groupId ;
2010-12-29 12:27:14 +01:00
private $articleId ;
2010-12-04 19:44:10 +01:00
2013-06-20 14:20:00 +02:00
private $topic ;
private $phonenumber ;
2010-12-04 19:44:10 +01:00
public function setUp ()
{
2015-01-24 12:51:19 +01:00
$this -> useModelSet ( 'tweet' );
2010-12-04 19:44:10 +01:00
$this -> useModelSet ( 'cms' );
2015-01-29 18:39:30 +00:00
$this -> useModelSet ( 'tweet' );
2010-12-04 19:44:10 +01:00
parent :: setUp ();
$class = $this -> _em -> getClassMetadata ( 'Doctrine\Tests\Models\CMS\CmsUser' );
2011-01-02 15:10:47 +01:00
$class -> associationMappings [ 'groups' ][ 'fetch' ] = ClassMetadataInfo :: FETCH_EXTRA_LAZY ;
2013-06-20 14:20:00 +02:00
$class -> associationMappings [ 'groups' ][ 'indexBy' ] = 'name' ;
2011-01-02 15:10:47 +01:00
$class -> associationMappings [ 'articles' ][ 'fetch' ] = ClassMetadataInfo :: FETCH_EXTRA_LAZY ;
2013-06-20 14:20:00 +02:00
$class -> associationMappings [ 'articles' ][ 'indexBy' ] = 'topic' ;
$class -> associationMappings [ 'phonenumbers' ][ 'fetch' ] = ClassMetadataInfo :: FETCH_EXTRA_LAZY ;
$class -> associationMappings [ 'phonenumbers' ][ 'indexBy' ] = 'phonenumber' ;
2011-12-19 22:56:19 +01:00
2010-12-04 19:44:10 +01:00
$class = $this -> _em -> getClassMetadata ( 'Doctrine\Tests\Models\CMS\CmsGroup' );
2011-01-02 15:10:47 +01:00
$class -> associationMappings [ 'users' ][ 'fetch' ] = ClassMetadataInfo :: FETCH_EXTRA_LAZY ;
2010-12-04 19:44:10 +01:00
$this -> loadFixture ();
}
public function tearDown ()
{
parent :: tearDown ();
$class = $this -> _em -> getClassMetadata ( 'Doctrine\Tests\Models\CMS\CmsUser' );
$class -> associationMappings [ 'groups' ][ 'fetch' ] = ClassMetadataInfo :: FETCH_LAZY ;
$class -> associationMappings [ 'articles' ][ 'fetch' ] = ClassMetadataInfo :: FETCH_LAZY ;
2013-06-20 14:20:00 +02:00
$class -> associationMappings [ 'phonenumbers' ][ 'fetch' ] = ClassMetadataInfo :: FETCH_LAZY ;
2010-12-04 19:44:10 +01:00
2013-06-20 09:29:56 +02:00
unset ( $class -> associationMappings [ 'groups' ][ 'indexBy' ]);
unset ( $class -> associationMappings [ 'articles' ][ 'indexBy' ]);
2013-06-20 14:20:00 +02:00
unset ( $class -> associationMappings [ 'phonenumbers' ][ 'indexBy' ]);
2013-06-20 09:29:56 +02:00
2010-12-04 19:44:10 +01:00
$class = $this -> _em -> getClassMetadata ( 'Doctrine\Tests\Models\CMS\CmsGroup' );
$class -> associationMappings [ 'users' ][ 'fetch' ] = ClassMetadataInfo :: FETCH_LAZY ;
}
/**
* @ group DDC - 546
*/
public function testCountNotInitializesCollection ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$queryCount = $this -> getCurrentQueryCount ();
$this -> assertFalse ( $user -> groups -> isInitialized ());
$this -> assertEquals ( 3 , count ( $user -> groups ));
$this -> assertFalse ( $user -> groups -> isInitialized ());
foreach ( $user -> groups AS $group ) { }
$this -> assertEquals ( $queryCount + 2 , $this -> getCurrentQueryCount (), " Expecting two queries to be fired for count, then iteration. " );
}
/**
* @ group DDC - 546
*/
2012-01-18 01:04:25 -05:00
public function testCountWhenNewEntityPresent ()
2010-12-04 19:44:10 +01:00
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$newGroup = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$newGroup -> name = " Test4 " ;
$user -> addGroup ( $newGroup );
$this -> _em -> persist ( $newGroup );
$this -> assertFalse ( $user -> groups -> isInitialized ());
$this -> assertEquals ( 4 , count ( $user -> groups ));
$this -> assertFalse ( $user -> groups -> isInitialized ());
}
/**
* @ group DDC - 546
*/
public function testCountWhenInitialized ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$queryCount = $this -> getCurrentQueryCount ();
foreach ( $user -> groups AS $group ) { }
$this -> assertTrue ( $user -> groups -> isInitialized ());
$this -> assertEquals ( 3 , count ( $user -> groups ));
2013-03-11 00:08:58 +00:00
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Should only execute one query to initialize collection, no extra query for count() more. " );
2010-12-04 19:44:10 +01:00
}
/**
* @ group DDC - 546
*/
public function testCountInverseCollection ()
{
$group = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsGroup' , $this -> groupId );
$this -> assertFalse ( $group -> users -> isInitialized (), " Pre-Condition " );
$this -> assertEquals ( 4 , count ( $group -> users ));
$this -> assertFalse ( $group -> users -> isInitialized (), " Extra Lazy collection should not be initialized by counting the collection. " );
}
/**
* @ group DDC - 546
*/
public function testCountOneToMany ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Pre-Condition " );
$this -> assertEquals ( 2 , count ( $user -> articles ));
}
/**
* @ group DDC - 546
*/
public function testFullSlice ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
$someGroups = $user -> groups -> slice ( null );
$this -> assertEquals ( 3 , count ( $someGroups ));
}
/**
* @ group DDC - 546
*/
public function testSlice ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
2011-10-31 21:17:01 +01:00
2010-12-04 19:44:10 +01:00
$queryCount = $this -> getCurrentQueryCount ();
2011-10-31 21:17:01 +01:00
2010-12-04 19:44:10 +01:00
$someGroups = $user -> groups -> slice ( 0 , 2 );
$this -> assertContainsOnly ( 'Doctrine\Tests\Models\CMS\CmsGroup' , $someGroups );
$this -> assertEquals ( 2 , count ( $someGroups ));
$this -> assertFalse ( $user -> groups -> isInitialized (), " Slice should not initialize the collection if it wasn't before! " );
$otherGroup = $user -> groups -> slice ( 2 , 1 );
$this -> assertContainsOnly ( 'Doctrine\Tests\Models\CMS\CmsGroup' , $otherGroup );
$this -> assertEquals ( 1 , count ( $otherGroup ));
$this -> assertFalse ( $user -> groups -> isInitialized ());
foreach ( $user -> groups AS $group ) { }
$this -> assertTrue ( $user -> groups -> isInitialized ());
$this -> assertEquals ( 3 , count ( $user -> groups ));
$this -> assertEquals ( $queryCount + 3 , $this -> getCurrentQueryCount ());
}
/**
* @ group DDC - 546
*/
public function testSliceInitializedCollection ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$queryCount = $this -> getCurrentQueryCount ();
foreach ( $user -> groups AS $group ) { }
$someGroups = $user -> groups -> slice ( 0 , 2 );
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount ());
$this -> assertEquals ( 2 , count ( $someGroups ));
2013-06-20 09:29:56 +02:00
$this -> assertTrue ( $user -> groups -> contains ( array_shift ( $someGroups )));
$this -> assertTrue ( $user -> groups -> contains ( array_shift ( $someGroups )));
2010-12-04 19:44:10 +01:00
}
/**
* @ group DDC - 546
*/
public function testSliceInverseCollection ()
{
$group = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsGroup' , $this -> groupId );
$this -> assertFalse ( $group -> users -> isInitialized (), " Pre-Condition " );
$queryCount = $this -> getCurrentQueryCount ();
$someUsers = $group -> users -> slice ( 0 , 2 );
$otherUsers = $group -> users -> slice ( 2 , 2 );
$this -> assertContainsOnly ( 'Doctrine\Tests\Models\CMS\CmsUser' , $someUsers );
$this -> assertContainsOnly ( 'Doctrine\Tests\Models\CMS\CmsUser' , $otherUsers );
$this -> assertEquals ( 2 , count ( $someUsers ));
$this -> assertEquals ( 2 , count ( $otherUsers ));
2011-03-13 00:15:50 +01:00
// +2 queries executed by slice
$this -> assertEquals ( $queryCount + 2 , $this -> getCurrentQueryCount (), " Slicing two parts should only execute two additional queries. " );
2010-12-04 19:44:10 +01:00
}
/**
* @ group DDC - 546
*/
public function testSliceOneToMany ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertFalse ( $user -> articles -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
$queryCount = $this -> getCurrentQueryCount ();
$someArticle = $user -> articles -> slice ( 0 , 1 );
$otherArticle = $user -> articles -> slice ( 1 , 1 );
$this -> assertEquals ( $queryCount + 2 , $this -> getCurrentQueryCount ());
}
2010-12-29 12:27:14 +01:00
/**
* @ group DDC - 546
*/
public function testContainsOneToMany ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertFalse ( $user -> articles -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
2012-12-03 11:02:29 +00:00
// Test One to Many existence retrieved from DB
2012-01-18 01:04:25 -05:00
$article = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsArticle' , $this -> articleId );
2010-12-29 12:27:14 +01:00
$queryCount = $this -> getCurrentQueryCount ();
2012-01-18 01:04:25 -05:00
2010-12-29 12:27:14 +01:00
$this -> assertTrue ( $user -> articles -> contains ( $article ));
$this -> assertFalse ( $user -> articles -> isInitialized (), " Post-Condition: Collection is not initialized. " );
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount ());
2012-12-03 11:02:29 +00:00
// Test One to Many existence with state new
2010-12-29 12:27:14 +01:00
$article = new \Doctrine\Tests\Models\CMS\CmsArticle ();
$article -> topic = " Testnew " ;
$article -> text = " blub " ;
$queryCount = $this -> getCurrentQueryCount ();
$this -> assertFalse ( $user -> articles -> contains ( $article ));
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Checking for contains of new entity should cause no query to be executed. " );
2012-12-03 11:02:29 +00:00
// Test One to Many existence with state clear
2010-12-29 12:27:14 +01:00
$this -> _em -> persist ( $article );
$this -> _em -> flush ();
$queryCount = $this -> getCurrentQueryCount ();
$this -> assertFalse ( $user -> articles -> contains ( $article ));
2012-01-18 01:04:25 -05:00
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Checking for contains of persisted entity should cause one query to be executed. " );
$this -> assertFalse ( $user -> articles -> isInitialized (), " Post-Condition: Collection is not initialized. " );
2012-12-03 11:02:29 +00:00
// Test One to Many existence with state managed
2012-01-18 01:04:25 -05:00
$article = new \Doctrine\Tests\Models\CMS\CmsArticle ();
$article -> topic = " How to not fail anymore on tests " ;
$article -> text = " That is simple! Just write more tests! " ;
$this -> _em -> persist ( $article );
$queryCount = $this -> getCurrentQueryCount ();
$this -> assertFalse ( $user -> articles -> contains ( $article ));
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Checking for contains of managed entity (but not persisted) should cause no query to be executed. " );
2010-12-29 12:27:14 +01:00
$this -> assertFalse ( $user -> articles -> isInitialized (), " Post-Condition: Collection is not initialized. " );
}
/**
* @ group DDC - 546
*/
public function testContainsManyToMany ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
2012-12-03 11:02:29 +00:00
// Test Many to Many existence retrieved from DB
2011-11-29 11:29:17 -05:00
$group = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsGroup' , $this -> groupId );
2010-12-29 12:27:14 +01:00
$queryCount = $this -> getCurrentQueryCount ();
2011-11-29 11:29:17 -05:00
2010-12-29 12:27:14 +01:00
$this -> assertTrue ( $user -> groups -> contains ( $group ));
2011-11-29 11:29:17 -05:00
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Checking for contains of managed entity should cause one query to be executed. " );
2010-12-29 12:27:14 +01:00
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
2012-12-03 11:02:29 +00:00
// Test Many to Many existence with state new
2010-12-29 12:27:14 +01:00
$group = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$group -> name = " A New group! " ;
$queryCount = $this -> getCurrentQueryCount ();
2011-11-29 11:29:17 -05:00
2010-12-29 12:27:14 +01:00
$this -> assertFalse ( $user -> groups -> contains ( $group ));
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Checking for contains of new entity should cause no query to be executed. " );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
2012-12-03 11:02:29 +00:00
// Test Many to Many existence with state clear
2010-12-29 12:27:14 +01:00
$this -> _em -> persist ( $group );
$this -> _em -> flush ();
$queryCount = $this -> getCurrentQueryCount ();
2011-11-29 11:29:17 -05:00
2010-12-29 12:27:14 +01:00
$this -> assertFalse ( $user -> groups -> contains ( $group ));
2012-01-18 01:04:25 -05:00
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Checking for contains of persisted entity should cause one query to be executed. " );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
2012-12-03 11:02:29 +00:00
// Test Many to Many existence with state managed
2012-01-18 01:04:25 -05:00
$group = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$group -> name = " My managed group " ;
$this -> _em -> persist ( $group );
$queryCount = $this -> getCurrentQueryCount ();
$this -> assertFalse ( $user -> groups -> contains ( $group ));
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Checking for contains of managed entity (but not persisted) should cause no query to be executed. " );
2010-12-29 12:27:14 +01:00
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
}
2011-01-02 13:37:29 +01:00
/**
* @ group DDC - 546
*/
public function testContainsManyToManyInverse ()
{
$group = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsGroup' , $this -> groupId );
$this -> assertFalse ( $group -> users -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$queryCount = $this -> getCurrentQueryCount ();
$this -> assertTrue ( $group -> users -> contains ( $user ));
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Checking for contains of managed entity should cause one query to be executed. " );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
$newUser = new \Doctrine\Tests\Models\CMS\CmsUser ();
$newUser -> name = " A New group! " ;
$queryCount = $this -> getCurrentQueryCount ();
$this -> assertFalse ( $group -> users -> contains ( $newUser ));
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Checking for contains of new entity should cause no query to be executed. " );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
}
2011-11-29 11:29:17 -05:00
/**
*
*/
public function testRemoveElementOneToMany ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertFalse ( $user -> articles -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
2012-01-18 01:04:25 -05:00
// Test One to Many removal with Entity retrieved from DB
2011-11-29 11:29:17 -05:00
$article = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsArticle' , $this -> articleId );
$queryCount = $this -> getCurrentQueryCount ();
$user -> articles -> removeElement ( $article );
$this -> assertFalse ( $user -> articles -> isInitialized (), " Post-Condition: Collection is not initialized. " );
2015-02-05 00:11:19 +00:00
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount ());
2011-11-29 11:29:17 -05:00
2012-01-18 01:04:25 -05:00
// Test One to Many removal with Entity state as new
2011-11-29 11:29:17 -05:00
$article = new \Doctrine\Tests\Models\CMS\CmsArticle ();
$article -> topic = " Testnew " ;
$article -> text = " blub " ;
$queryCount = $this -> getCurrentQueryCount ();
$user -> articles -> removeElement ( $article );
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Removing a new entity should cause no query to be executed. " );
2012-01-18 01:04:25 -05:00
// Test One to Many removal with Entity state as clean
2011-11-29 11:29:17 -05:00
$this -> _em -> persist ( $article );
$this -> _em -> flush ();
$queryCount = $this -> getCurrentQueryCount ();
$user -> articles -> removeElement ( $article );
2015-02-05 00:11:19 +00:00
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Removing a persisted entity should cause one query to be executed. " );
2011-11-29 11:29:17 -05:00
$this -> assertFalse ( $user -> articles -> isInitialized (), " Post-Condition: Collection is not initialized. " );
2012-01-18 01:04:25 -05:00
// Test One to Many removal with Entity state as managed
$article = new \Doctrine\Tests\Models\CMS\CmsArticle ();
$article -> topic = " How to not fail anymore on tests " ;
$article -> text = " That is simple! Just write more tests! " ;
$this -> _em -> persist ( $article );
$queryCount = $this -> getCurrentQueryCount ();
$user -> articles -> removeElement ( $article );
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Removing a managed entity should cause no query to be executed. " );
2011-11-29 11:29:17 -05:00
}
/**
*
*/
public function testRemoveElementManyToMany ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
2012-01-18 01:04:25 -05:00
// Test Many to Many removal with Entity retrieved from DB
2011-11-29 11:29:17 -05:00
$group = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsGroup' , $this -> groupId );
$queryCount = $this -> getCurrentQueryCount ();
$user -> groups -> removeElement ( $group );
2012-01-18 01:04:25 -05:00
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Removing a persisted entity should cause one query to be executed. " );
2011-11-29 11:29:17 -05:00
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
2012-01-18 01:04:25 -05:00
// Test Many to Many removal with Entity state as new
2011-11-29 11:29:17 -05:00
$group = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$group -> name = " A New group! " ;
$queryCount = $this -> getCurrentQueryCount ();
$user -> groups -> removeElement ( $group );
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Removing new entity should cause no query to be executed. " );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
2012-01-18 01:04:25 -05:00
// Test Many to Many removal with Entity state as clean
2011-11-29 11:29:17 -05:00
$this -> _em -> persist ( $group );
$this -> _em -> flush ();
$queryCount = $this -> getCurrentQueryCount ();
$user -> groups -> removeElement ( $group );
2012-01-18 01:04:25 -05:00
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Removing a persisted entity should cause one query to be executed. " );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
// Test Many to Many removal with Entity state as managed
$group = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$group -> name = " A New group! " ;
$this -> _em -> persist ( $group );
$queryCount = $this -> getCurrentQueryCount ();
$user -> groups -> removeElement ( $group );
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Removing a managed entity should cause no query to be executed. " );
2011-11-29 11:29:17 -05:00
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
}
/**
*
*/
public function testRemoveElementManyToManyInverse ()
{
$group = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsGroup' , $this -> groupId );
$this -> assertFalse ( $group -> users -> isInitialized (), " Pre-Condition: Collection is not initialized. " );
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$queryCount = $this -> getCurrentQueryCount ();
$group -> users -> removeElement ( $user );
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Removing a managed entity should cause one query to be executed. " );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
$newUser = new \Doctrine\Tests\Models\CMS\CmsUser ();
$newUser -> name = " A New group! " ;
$queryCount = $this -> getCurrentQueryCount ();
$group -> users -> removeElement ( $newUser );
$this -> assertEquals ( $queryCount , $this -> getCurrentQueryCount (), " Removing a new entity should cause no query to be executed. " );
$this -> assertFalse ( $user -> groups -> isInitialized (), " Post-Condition: Collection is not initialized. " );
}
2011-10-31 21:17:01 +01:00
/**
* @ group DDC - 1399
*/
public function testCountAfterAddThenFlush ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$newGroup = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$newGroup -> name = " Test4 " ;
$user -> addGroup ( $newGroup );
$this -> _em -> persist ( $newGroup );
$this -> assertFalse ( $user -> groups -> isInitialized ());
$this -> assertEquals ( 4 , count ( $user -> groups ));
$this -> assertFalse ( $user -> groups -> isInitialized ());
$this -> _em -> flush ();
$this -> assertEquals ( 4 , count ( $user -> groups ));
}
2011-10-31 21:34:22 +01:00
/**
* @ group DDC - 1462
*/
public function testSliceOnDirtyCollection ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
/* @var $user CmsUser */
$newGroup = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$newGroup -> name = " Test4 " ;
$user -> addGroup ( $newGroup );
$this -> _em -> persist ( $newGroup );
$qc = $this -> getCurrentQueryCount ();
$groups = $user -> groups -> slice ( 0 , 10 );
$this -> assertEquals ( 4 , count ( $groups ));
$this -> assertEquals ( $qc + 1 , $this -> getCurrentQueryCount ());
}
2013-06-20 14:20:00 +02:00
/**
* @ group DDC - 1398
*/
public function testGetIndexByIdentifier ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
/* @var $user CmsUser */
$queryCount = $this -> getCurrentQueryCount ();
$phonenumber = $user -> phonenumbers -> get ( $this -> phonenumber );
$this -> assertFalse ( $user -> phonenumbers -> isInitialized ());
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount ());
$this -> assertSame ( $phonenumber , $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsPhonenumber' , $this -> phonenumber ));
$article = $user -> phonenumbers -> get ( $this -> phonenumber );
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount (), " Getting the same entity should not cause an extra query to be executed " );
}
2013-06-20 09:29:56 +02:00
/**
* @ group DDC - 1398
*/
public function testGetIndexByOneToMany ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
/* @var $user CmsUser */
$queryCount = $this -> getCurrentQueryCount ();
2013-06-20 14:20:00 +02:00
$article = $user -> articles -> get ( $this -> topic );
2013-06-20 09:29:56 +02:00
$this -> assertFalse ( $user -> articles -> isInitialized ());
$this -> assertEquals ( $queryCount + 1 , $this -> getCurrentQueryCount ());
2013-06-20 10:18:08 +02:00
$this -> assertSame ( $article , $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsArticle' , $this -> articleId ));
2013-06-20 09:29:56 +02:00
}
2013-06-20 10:09:52 +02:00
/**
* @ group DDC - 1398
*/
public function testGetNonExistentIndexBy ()
{
$user = $this -> _em -> find ( 'Doctrine\Tests\Models\CMS\CmsUser' , $this -> userId );
$this -> assertNull ( $user -> articles -> get ( - 1 ));
}
2010-12-04 19:44:10 +01:00
private function loadFixture ()
{
$user1 = new \Doctrine\Tests\Models\CMS\CmsUser ();
$user1 -> username = " beberlei " ;
$user1 -> name = " Benjamin " ;
$user1 -> status = " active " ;
$user2 = new \Doctrine\Tests\Models\CMS\CmsUser ();
$user2 -> username = " jwage " ;
$user2 -> name = " Jonathan " ;
$user2 -> status = " active " ;
$user3 = new \Doctrine\Tests\Models\CMS\CmsUser ();
$user3 -> username = " romanb " ;
$user3 -> name = " Roman " ;
$user3 -> status = " active " ;
$user4 = new \Doctrine\Tests\Models\CMS\CmsUser ();
$user4 -> username = " gblanco " ;
$user4 -> name = " Guilherme " ;
$user4 -> status = " active " ;
$this -> _em -> persist ( $user1 );
$this -> _em -> persist ( $user2 );
$this -> _em -> persist ( $user3 );
$this -> _em -> persist ( $user4 );
$group1 = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$group1 -> name = " Test1 " ;
$group2 = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$group2 -> name = " Test2 " ;
$group3 = new \Doctrine\Tests\Models\CMS\CmsGroup ();
$group3 -> name = " Test3 " ;
$user1 -> addGroup ( $group1 );
$user1 -> addGroup ( $group2 );
$user1 -> addGroup ( $group3 );
$user2 -> addGroup ( $group1 );
$user3 -> addGroup ( $group1 );
$user4 -> addGroup ( $group1 );
$this -> _em -> persist ( $group1 );
$this -> _em -> persist ( $group2 );
$this -> _em -> persist ( $group3 );
$article1 = new \Doctrine\Tests\Models\CMS\CmsArticle ();
2013-06-20 14:20:00 +02:00
$article1 -> topic = " Test1 " ;
$article1 -> text = " Test1 " ;
2010-12-04 19:44:10 +01:00
$article1 -> setAuthor ( $user1 );
$article2 = new \Doctrine\Tests\Models\CMS\CmsArticle ();
2013-06-20 14:20:00 +02:00
$article2 -> topic = " Test2 " ;
$article2 -> text = " Test2 " ;
2010-12-04 19:44:10 +01:00
$article2 -> setAuthor ( $user1 );
$this -> _em -> persist ( $article1 );
$this -> _em -> persist ( $article2 );
2011-10-31 21:17:01 +01:00
2013-06-20 14:20:00 +02:00
$phonenumber1 = new \Doctrine\Tests\Models\CMS\CmsPhonenumber ();
$phonenumber1 -> phonenumber = '12345' ;
$phonenumber2 = new \Doctrine\Tests\Models\CMS\CmsPhonenumber ();
$phonenumber2 -> phonenumber = '67890' ;
$this -> _em -> persist ( $phonenumber1 );
$this -> _em -> persist ( $phonenumber2 );
2010-12-04 19:44:10 +01:00
$this -> _em -> flush ();
$this -> _em -> clear ();
2010-12-29 12:27:14 +01:00
$this -> articleId = $article1 -> id ;
2010-12-04 19:44:10 +01:00
$this -> userId = $user1 -> getId ();
$this -> groupId = $group1 -> id ;
2013-06-20 14:20:00 +02:00
$this -> topic = $article1 -> topic ;
$this -> phonenumber = $phonenumber1 -> phonenumber ;
2015-01-27 06:19:26 +01:00
}
/**
* @ group DDC - 3343
*/
public function testRemoveManagedElementFromOneToManyExtraLazyCollectionIsNoOp ()
{
list ( $userId , $tweetId ) = $this -> loadTweetFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$user -> tweets -> removeElement ( $this -> _em -> find ( Tweet :: CLASSNAME , $tweetId ));
$this -> _em -> clear ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$this -> assertCount ( 1 , $user -> tweets , 'Element was not removed - need to update the owning side first' );
}
/**
* @ group DDC - 3343
*/
public function testRemoveManagedElementFromOneToManyExtraLazyCollectionWithoutDeletingTheTargetEntityEntryIsNoOp ()
{
list ( $userId , $tweetId ) = $this -> loadTweetFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
2015-01-27 07:42:48 +01:00
$tweet = $this -> _em -> find ( Tweet :: CLASSNAME , $tweetId );
2015-01-27 06:19:26 +01:00
2015-01-27 07:42:48 +01:00
$user -> tweets -> removeElement ( $tweet );
2015-01-27 06:19:26 +01:00
$this -> _em -> clear ();
/* @var $tweet Tweet */
$tweet = $this -> _em -> find ( Tweet :: CLASSNAME , $tweetId );
$this -> assertInstanceOf (
Tweet :: CLASSNAME ,
$tweet ,
'Even though the collection is extra lazy, the tweet should not have been deleted'
);
$this -> assertInstanceOf (
User :: CLASSNAME ,
$tweet -> author ,
'Tweet author link has not been removed - need to update the owning side first'
);
}
/**
* @ group DDC - 3343
*/
public function testRemovingManagedLazyProxyFromExtraLazyOneToManyDoesRemoveTheAssociationButNotTheEntity ()
{
list ( $userId , $tweetId ) = $this -> loadTweetFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$tweet = $this -> _em -> getReference ( Tweet :: CLASSNAME , $tweetId );
$user -> tweets -> removeElement ( $this -> _em -> getReference ( Tweet :: CLASSNAME , $tweetId ));
$this -> _em -> clear ();
/* @var $tweet Tweet */
$tweet = $this -> _em -> find ( Tweet :: CLASSNAME , $tweet -> id );
$this -> assertInstanceOf (
Tweet :: CLASSNAME ,
$tweet ,
'Even though the collection is extra lazy, the tweet should not have been deleted'
);
2015-01-27 06:26:55 +01:00
$this -> assertInstanceOf ( User :: CLASSNAME , $tweet -> author );
2015-01-27 06:19:26 +01:00
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$this -> assertCount ( 1 , $user -> tweets , 'Element was not removed - need to update the owning side first' );
}
/**
* @ return int [] ordered tuple : user id and tweet id
*/
private function loadTweetFixture ()
{
$user = new User ();
$tweet = new Tweet ();
$user -> name = 'ocramius' ;
$tweet -> content = 'The cat is on the table' ;
$user -> addTweet ( $tweet );
$this -> _em -> persist ( $user );
$this -> _em -> persist ( $tweet );
$this -> _em -> flush ();
$this -> _em -> clear ();
return array ( $user -> id , $tweet -> id );
2010-12-04 19:44:10 +01:00
}
2015-01-24 12:51:19 +01:00
/**
* @ group DDC - 3343
*/
public function testRemovesManagedElementFromOneToManyExtraLazyCollection ()
{
list ( $userId , $tweetId ) = $this -> loadTweetFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$user -> tweets -> removeElement ( $this -> _em -> find ( Tweet :: CLASSNAME , $tweetId ));
$this -> _em -> clear ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$this -> assertCount ( 0 , $user -> tweets );
}
/**
* @ group DDC - 3343
*/
public function testRemovesManagedElementFromOneToManyExtraLazyCollectionWithoutDeletingTheTargetEntityEntry ()
{
list ( $userId , $tweetId ) = $this -> loadTweetFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$user -> tweets -> removeElement ( $this -> _em -> find ( Tweet :: CLASSNAME , $tweetId ));
$this -> _em -> clear ();
/* @var $tweet Tweet */
$tweet = $this -> _em -> find ( Tweet :: CLASSNAME , $tweetId );
$this -> assertInstanceOf (
Tweet :: CLASSNAME ,
$tweet ,
'Even though the collection is extra lazy, the tweet should not have been deleted'
);
$this -> assertNull ( $tweet -> author , 'Tweet author link has been removed' );
}
/**
* @ group DDC - 3343
*/
public function testRemovingManagedLazyProxyFromExtraLazyOneToManyDoesRemoveTheAssociationButNotTheEntity ()
{
list ( $userId , $tweetId ) = $this -> loadTweetFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$tweet = $this -> _em -> getReference ( Tweet :: CLASSNAME , $tweetId );
$user -> tweets -> removeElement ( $this -> _em -> getReference ( Tweet :: CLASSNAME , $tweetId ));
$this -> _em -> clear ();
/* @var $tweet Tweet */
$tweet = $this -> _em -> find ( Tweet :: CLASSNAME , $tweet -> id );
$this -> assertInstanceOf (
Tweet :: CLASSNAME ,
$tweet ,
'Even though the collection is extra lazy, the tweet should not have been deleted'
);
$this -> assertNull ( $tweet -> author );
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$this -> assertCount ( 0 , $user -> tweets );
}
2015-01-27 07:42:48 +01:00
/**
* @ group DDC - 3343
*/
public function testRemoveOrphanedManagedElementFromOneToManyExtraLazyCollection ()
{
list ( $userId , $userListId ) = $this -> loadUserListFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
2015-02-05 00:11:19 +00:00
$user -> userLists -> removeElement ( $this -> _em -> find ( UserList :: CLASSNAME , $userListId ));
2015-01-27 07:42:48 +01:00
$this -> _em -> clear ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$this -> assertCount ( 0 , $user -> userLists , 'Element was removed from association due to orphan removal' );
$this -> assertNull (
$this -> _em -> find ( UserList :: CLASSNAME , $userListId ),
'Element was deleted due to orphan removal'
);
}
/**
* @ group DDC - 3343
*/
public function testRemoveOrphanedUnManagedElementFromOneToManyExtraLazyCollection ()
{
list ( $userId , $userListId ) = $this -> loadUserListFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$user -> userLists -> removeElement ( new UserList ());
$this -> _em -> clear ();
/* @var $userList UserList */
$userList = $this -> _em -> find ( UserList :: CLASSNAME , $userListId );
$this -> assertInstanceOf (
UserList :: CLASSNAME ,
$userList ,
'Even though the collection is extra lazy + orphan removal, the user list should not have been deleted'
);
$this -> assertInstanceOf (
User :: CLASSNAME ,
$userList -> owner ,
'User list to owner link has not been removed'
);
}
/**
* @ group DDC - 3343
*/
public function testRemoveOrphanedManagedLazyProxyFromExtraLazyOneToMany ()
{
list ( $userId , $userListId ) = $this -> loadUserListFixture ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
2015-02-05 00:11:19 +00:00
$user -> userLists -> removeElement ( $this -> _em -> getReference ( UserList :: CLASSNAME , $userListId ));
2015-01-27 07:42:48 +01:00
$this -> _em -> clear ();
/* @var $user User */
$user = $this -> _em -> find ( User :: CLASSNAME , $userId );
$this -> assertCount ( 0 , $user -> userLists , 'Element was removed from association due to orphan removal' );
$this -> assertNull (
$this -> _em -> find ( UserList :: CLASSNAME , $userListId ),
'Element was deleted due to orphan removal'
);
}
2015-01-24 12:51:19 +01:00
/**
* @ return int [] ordered tuple : user id and tweet id
*/
private function loadTweetFixture ()
{
$user = new User ();
$tweet = new Tweet ();
$user -> name = 'ocramius' ;
$tweet -> content = 'The cat is on the table' ;
$user -> addTweet ( $tweet );
$this -> _em -> persist ( $user );
$this -> _em -> persist ( $tweet );
$this -> _em -> flush ();
$this -> _em -> clear ();
return array ( $user -> id , $tweet -> id );
}
2015-01-27 07:42:48 +01:00
/**
* @ return int [] ordered tuple : user id and user list id
*/
private function loadUserListFixture ()
{
$user = new User ();
$userList = new UserList ();
$user -> name = 'ocramius' ;
$userList -> listName = 'PHP Developers to follow closely' ;
$user -> addUserList ( $userList );
$this -> _em -> persist ( $user );
$this -> _em -> persist ( $userList );
$this -> _em -> flush ();
$this -> _em -> clear ();
return array ( $user -> id , $userList -> id );
}
2013-06-27 14:19:39 +02:00
}