blob: 04566024ed3aa730a62ec6afd23423044913e619 [file] [log] [blame]
<?php
/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
* @version //autogentag//
* @filesource
* @package PersistentObject
* @subpackage Tests
*/
require_once dirname( __FILE__ ) . "/../data/relation_test_employer.php";
require_once dirname( __FILE__ ) . "/../data/relation_test_person.php";
require_once dirname( __FILE__ ) . "/../data/relation_test_address.php";
/**
* Tests ezcPersistentManyToOneRelation class.
*
* @package PersistentObject
* @subpackage Tests
*/
class ezcPersistentSessionIdentityDecoratorRelationTest extends ezcTestCase
{
protected $session;
protected $idSession;
protected $idMap;
public static function suite()
{
return new PHPUnit_Framework_TestSuite( __CLASS__ );
}
public function setup()
{
try
{
$this->db = ezcDbInstance::get();
}
catch ( Exception $e )
{
$this->markTestSkipped( 'There was no database configured' );
}
RelationTestPerson::setupTables();
RelationTestPerson::insertData();
$this->session = new ezcPersistentSession(
ezcDbInstance::get(),
new ezcPersistentCodeManager( dirname( __FILE__ ) . "/../data/" )
);
$this->idMap = new ezcPersistentBasicIdentityMap(
$this->session->definitionManager
);
$this->idSession = new ezcPersistentSessionIdentityDecorator(
$this->session,
$this->idMap
);
}
public function teardown()
{
RelationTestEmployer::cleanup();
}
// Tests using the actual relation definition
public function testGetRelatedObjectsEmployer1()
{
$person = $this->idSession->load( "RelationTestPerson", 1 );
$related1 = $this->idSession->getRelatedObjects( $person, "RelationTestEmployer" );
$this->assertEquals(
1,
count( $related1 ),
"Related RelationTestPerson objects not fetched correctly."
);
$related2 = $this->idSession->getRelatedObjects( $person, "RelationTestEmployer" );
foreach ( $related1 as $id => $relObj )
{
$this->assertSame(
$relObj,
$related2[$id],
'Object in second load not the same not.'
);
}
foreach ( $related2 as $id => $relObj )
{
$this->assertSame(
$relObj,
$related1[$id],
'Object in first load not the same not.'
);
}
}
public function testGetRelatedObjectsEmployer1Refetch()
{
$person = $this->idSession->load( "RelationTestPerson", 1 );
$related1 = $this->idSession->getRelatedObjects( $person, "RelationTestEmployer" );
$this->assertEquals(
1,
count( $related1 ),
"Related RelationTestPerson objects not fetched correctly."
);
// Refetch
$this->idSession->options->refetch = true;
$related2 = $this->idSession->getRelatedObjects( $person, "RelationTestEmployer" );
foreach ( $related1 as $id => $relObj )
{
$this->assertNotSame(
$relObj,
$related2[$id],
'Object in second load not the same not.'
);
$this->assertEquals(
$relObj,
$related2[$id],
'Object in second load not the same not.'
);
}
foreach ( $related2 as $id => $relObj )
{
$this->assertNotSame(
$relObj,
$related1[$id],
'Object in first load not the same not.'
);
$this->assertEquals(
$relObj,
$related1[$id],
'Object in first load not the same not.'
);
}
}
public function testGetRelatedObjectEmployer1()
{
$person = $this->idSession->load( "RelationTestPerson", 1 );
$employer1 = $this->idSession->getRelatedObject( $person, "RelationTestEmployer" );
$employer2 = $this->idSession->getRelatedObject( $person, "RelationTestEmployer" );
$this->assertSame( $employer1, $employer2 );
}
public function testGetRelatedObjectEmployer1Refetch()
{
$person = $this->idSession->load( "RelationTestPerson", 1 );
$employer1 = $this->idSession->getRelatedObject( $person, "RelationTestEmployer" );
// Refetch
$this->idSession->options->refetch = true;
$employer2 = $this->idSession->getRelatedObject( $person, "RelationTestEmployer" );
$this->assertNotSame( $employer1, $employer2 );
$this->assertEquals( $employer1, $employer2 );
}
public function testAddRelatedObjectEmployerFailureReverse()
{
$person = $this->idSession->load( "RelationTestPerson", 2 );
$employer = $this->idSession->load( "RelationTestEmployer", 2 );
try
{
$this->idSession->addRelatedObject( $person, $employer );
$this->fail( "Exception not thrown on adding a new relation that is marked as reverse." );
}
catch ( ezcPersistentRelationOperationNotSupportedException $e ) {}
// New relation not reflected in identity map
$employers = $this->idSession->getRelatedObjects( $person, 'RelationTestEmployer' );
foreach( $employers as $relEmpl )
{
$this->assertNotSame(
$employer,
$relEmpl
);
}
$persons = $this->idSession->getRelatedObjects( $employer, 'RelationTestPerson' );
foreach ( $persons as $relPer )
{
$this->assertNotSame(
$person,
$relPer
);
}
}
public function testRelatedObjectsIdentityLoadedBefore()
{
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$address = $this->idSession->load( 'RelationTestAddress', 2 );
$addresses = $this->idSession->getRelatedObjects( $person, 'RelationTestAddress' );
$found = false;
foreach ( $addresses as $relAddress )
{
if ( $address === $relAddress )
{
$found = true;
break;
}
}
$this->assertTrue( $found );
}
public function testRelatedObjectsIdentityLoadedBeforeRefetch()
{
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$address = $this->idSession->load( 'RelationTestAddress', 2 );
// Refetch
$this->idSession->options->refetch = true;
$addresses = $this->idSession->getRelatedObjects( $person, 'RelationTestAddress' );
$found = false;
foreach ( $addresses as $relAddress )
{
if ( $address == $relAddress )
{
$this->assertNotSame(
$address,
$relAddress
);
$found = true;
break;
}
}
$this->assertTrue( $found );
}
public function testRelatedObjectsIdentityFetchedBefore()
{
$person1 = $this->idSession->load( 'RelationTestPerson', 1 );
$person2 = $this->idSession->load( 'RelationTestPerson', 2 );
$addresses1 = $this->idSession->getRelatedObjects( $person1, 'RelationTestAddress' );
$addresses2 = $this->idSession->getRelatedObjects( $person2, 'RelationTestAddress' );
$found = 0;
foreach ( $addresses1 as $id => $relAddr )
{
if ( isset( $addresses2[$id] ) )
{
++$found;
$this->assertSame(
$relAddr,
$addresses2[$id]
);
}
}
$this->assertEquals( 2, $found );
}
public function testRelatedObjectsIdentityFetchedBeforeRefetch()
{
$person1 = $this->idSession->load( 'RelationTestPerson', 1 );
$person2 = $this->idSession->load( 'RelationTestPerson', 2 );
$addresses1 = $this->idSession->getRelatedObjects( $person1, 'RelationTestAddress' );
// Refetch
$this->idSession->options->refetch = true;
$addresses2 = $this->idSession->getRelatedObjects( $person2, 'RelationTestAddress' );
$found = 0;
foreach ( $addresses1 as $id => $relAddr )
{
if ( isset( $addresses2[$id] ) )
{
++$found;
$this->assertNotSame(
$relAddr,
$addresses2[$id]
);
}
}
$this->assertEquals( 2, $found );
}
public function testAddRelatedObjectReflectedInIdentityMap()
{
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$addressesBefore = $this->idSession->getRelatedObjects( $person, 'RelationTestAddress' );
$newRelAddress = $this->idSession->load( 'RelationTestAddress', 3 );
$addressesBefore[$newRelAddress->id] = $newRelAddress;
$this->idSession->addRelatedObject( $person, $newRelAddress );
$addressesAfter = $this->idSession->getRelatedObjects( $person, 'RelationTestAddress' );
foreach ( $addressesBefore as $id => $relAddress )
{
$this->assertSame( $relAddress, $addressesAfter[$id] );
}
}
public function testRemoveRelatedObjectReflectedInIdentityMap()
{
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$addressesBefore = $this->idSession->getRelatedObjects( $person, 'RelationTestAddress' );
reset( $addressesBefore );
$firstKey = key( $addressesBefore );
$firstObj = current( $addressesBefore );
$this->idSession->removeRelatedObject( $person, $firstObj );
$addressesAfter = $this->idSession->getRelatedObjects( $person, 'RelationTestAddress' );
foreach ( $addressesAfter as $key => $obj )
{
$this->assertNotSame( $firstKey, $key );
$this->assertNotSame( $firstObj, $obj );
}
}
public function testLoadWithRelatedObjectsOnce()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$person = $this->idSession->loadWithRelatedObjects(
'RelationTestPerson',
2,
array(
new ezcPersistentRelationFindDefinition(
'RelationTestEmployer'
),
new ezcPersistentRelationFindDefinition(
'RelationTestAddress'
),
)
);
$this->assertEquals(
2,
$person->id
);
$this->assertNotNull(
$person->firstname
);
$this->assertNotNull(
$person->surname
);
$this->assertNotNull(
$this->idMap->getRelatedObjects( $person, 'RelationTestEmployer' )
);
$this->assertNotNull(
$this->idMap->getRelatedObjects( $person, 'RelationTestAddress' )
);
}
public function testLoadWithRelatedObjectsTwice()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$firstPerson = $this->idSession->loadWithRelatedObjects(
'RelationTestPerson',
2,
array(
new ezcPersistentRelationFindDefinition(
'RelationTestEmployer'
),
new ezcPersistentRelationFindDefinition(
'RelationTestAddress'
),
)
);
$firstEmployers = $this->idSession->getRelatedObjects( $firstPerson, 'RelationTestEmployer' );
$firstAddresses = $this->idSession->getRelatedObjects( $firstPerson, 'RelationTestAddress' );
$secondPerson = $this->idSession->loadWithRelatedObjects(
'RelationTestPerson',
2,
array(
new ezcPersistentRelationFindDefinition(
'RelationTestEmployer'
),
new ezcPersistentRelationFindDefinition(
'RelationTestAddress'
),
)
);
$secondEmployers = $this->idSession->getRelatedObjects( $secondPerson, 'RelationTestEmployer' );
$secondAddresses = $this->idSession->getRelatedObjects( $secondPerson, 'RelationTestAddress' );
$this->assertSame( $firstPerson, $secondPerson );
foreach ( $firstEmployers as $id => $employer )
{
$this->assertSame(
$employer,
$secondEmployers[$id]
);
}
foreach ( $firstAddresses as $id => $address )
{
$this->assertSame(
$address,
$secondAddresses[$id]
);
}
}
public function testCreateRelationFindQueryNoSetName()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$q = $this->idSession->createRelationFindQuery( $person, 'RelationTestAddress' );
$this->assertNull(
$q->relationSetName
);
$this->assertNull(
$q->relationSource
);
}
public function testCreateRelationFindQueryWithSetName()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$q = $this->idSession->createRelationFindQuery(
$person,
'RelationTestAddress',
null,
'some set name'
);
$this->assertEquals(
'some set name',
$q->relationSetName
);
$this->assertSame(
$person,
$q->relationSource
);
}
public function testFindRelatedObjectsWithoutSetName()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$q = $this->idSession->createRelationFindQuery( $person, 'RelationTestAddress' );
$addresses = $this->idSession->find( $q );
$this->assertNull(
$this->idMap->getRelatedObjects( $person, 'RelationTestAddress' )
);
}
public function testFindRelatedObjectsWithSetName()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$q = $this->idSession->createRelationFindQuery(
$person,
'RelationTestAddress',
null,
'foobar'
);
$addresses = $this->idSession->find( $q );
$this->assertNotNull(
$this->idMap->getRelatedObjectSet( $person, 'foobar' )
);
}
public function testFindRelatedObjectsWithSetNameRefetch()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$q = $this->idSession->createRelationFindQuery(
$person,
'RelationTestAddress',
null,
'foobar'
);
$addresses1 = $this->idSession->find( $q );
$this->idSession->options->refetch = true;
$addresses2 = $this->idSession->find( $q );
foreach( $addresses1 as $key => $origObj )
{
$this->assertNotSame(
$origObj,
$addresses2[$key]
);
$this->assertEquals(
$origObj,
$addresses2[$key]
);
}
}
public function testFindRelatedObjectsWithSetNameFetchTwiceCached()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$person = $this->idSession->load( 'RelationTestPerson', 1 );
$q = $this->idSession->createRelationFindQuery(
$person,
'RelationTestAddress',
null,
'foobar'
);
$addresses1 = $this->idSession->find( $q );
$addresses2 = $this->idSession->find( $q );
$this->assertSame( $addresses1, $addresses2 );
}
public function testFindWithRelationsUnrestricted()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$q = $this->idSession->createFindQueryWithRelations(
'RelationTestPerson',
array(
'addresses' => new ezcPersistentRelationFindDefinition(
'RelationTestAddress'
),
)
);
$persons = $this->idSession->find( $q );
$this->assertNotNull( $persons );
$this->assertTrue( count( $persons ) > 0 );
$this->assertNotNull(
$this->idMap->getRelatedObjects( current( $persons ), 'RelationTestAddress' )
);
}
public function testFindWithRelationsRestricted()
{
// @TODO: This is currently needed to fix the attribute set in
// ezcDbHandler. Should be removed as soon as this is fixed!
$this->session->database->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
$q = $this->idSession->createFindQueryWithRelations(
'RelationTestPerson',
array(
'addresses' => new ezcPersistentRelationFindDefinition(
'RelationTestAddress'
),
)
);
$q->where(
$q->expr->gt(
'addresses_id',
$q->bindValue( 2 )
)
);
$persons = $this->idSession->find( $q );
$this->assertNotNull( $persons );
$this->assertTrue( count( $persons ) > 0 );
// None stored in id map, session would query db!
$this->assertNull(
$this->idMap->getRelatedObjects( current( $persons ), 'RelationTestAddress' )
);
// Accessible over id session
$this->assertNotNull(
$this->idSession->getRelatedObjectSubset( current( $persons ), 'addresses' )
);
// Session and id map result equals
$this->assertEquals(
$this->idMap->getRelatedObjectSet( current( $persons ), 'addresses' ),
$this->idSession->getRelatedObjectSubset( current( $persons ), 'addresses' )
);
}
public function testIsRelatedStored()
{
$srcObject = new RelationTestPerson();
$srcObject->id = 23;
$relObject = new RelationTestAddress();
$relObject->id = 42;
$idMap = $this->getMock(
'ezcPersistentBasicIdentityMap',
array( 'getRelatedObjects' ),
array(),
'',
false,
false
);
$idMap->expects( $this->once() )
->method( 'getRelatedObjects' )
->with( $srcObject, 'RelationTestAddress', null )
->will( $this->returnValue( array( 42 => $relObject ) ) );
$session = $this->getMock(
'ezcPersistentSession',
array( 'isRelated' ),
array(),
'',
false,
false
);
$session->expects( $this->never() )
->method( 'isRelated' );
$idSession = new ezcPersistentSessionIdentityDecorator(
$session,
$idMap
);
$this->assertTrue( $idSession->isRelated( $srcObject, $relObject ) );
}
public function testIsRelatedNotStored()
{
$srcObject = new RelationTestPerson();
$srcObject->id = 23;
$relObject = new RelationTestAddress();
$relObject->id = 42;
$idMap = $this->getMock(
'ezcPersistentBasicIdentityMap',
array( 'getRelatedObjects' ),
array(),
'',
false,
false
);
$idMap->expects( $this->once() )
->method( 'getRelatedObjects' )
->with( $srcObject, 'RelationTestAddress', null )
->will( $this->returnValue( null ) );
$session = $this->getMock(
'ezcPersistentSession',
array( 'isRelated' ),
array(),
'',
false,
false
);
$session->expects( $this->once() )
->method( 'isRelated' )
->with( $srcObject, $relObject )
->will( $this->returnValue( true ) );
$idSession = new ezcPersistentSessionIdentityDecorator(
$session,
$idMap
);
$this->assertTrue( $idSession->isRelated( $srcObject, $relObject ) );
}
}
?>