FOSElasticaBundle/Tests/Doctrine/AbstractListenerTest.php
2014-02-01 03:37:47 +00:00

283 lines
8.5 KiB
PHP

<?php
namespace FOS\ElasticaBundle\Tests\Doctrine;
/**
* See concrete MongoDB/ORM instances of this abstract test
*
* @author Richard Miller <info@limethinking.co.uk>
*/
abstract class ListenerTest extends \PHPUnit_Framework_TestCase
{
public function testObjectInsertedOnPersist()
{
$persister = $this->getMockPersister();
$entity = new Listener\Entity(1);
$eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager());
$listener = $this->createListener($persister, get_class($entity), array());
$listener->postPersist($eventArgs);
$this->assertEquals($entity, current($listener->scheduledForInsertion));
$persister->expects($this->once())
->method('insertMany')
->with($listener->scheduledForInsertion);
$listener->postFlush($eventArgs);
}
/**
* @dataProvider provideIsIndexableCallbacks
*/
public function testNonIndexableObjectNotInsertedOnPersist($isIndexableCallback)
{
$persister = $this->getMockPersister();
$entity = new Listener\Entity(1, false);
$eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager());
$listener = $this->createListener($persister, get_class($entity), array());
$listener->setIsIndexableCallback($isIndexableCallback);
$listener->postPersist($eventArgs);
$this->assertEmpty($listener->scheduledForInsertion);
$persister->expects($this->never())
->method('insertOne');
$persister->expects($this->never())
->method('insertMany');
$listener->postFlush($eventArgs);
}
public function testObjectReplacedOnUpdate()
{
$persister = $this->getMockPersister();
$entity = new Listener\Entity(1);
$eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager());
$listener = $this->createListener($persister, get_class($entity), array());
$listener->postUpdate($eventArgs);
$this->assertEquals($entity, current($listener->scheduledForUpdate));
$persister->expects($this->once())
->method('replaceMany')
->with(array($entity));
$persister->expects($this->never())
->method('deleteById');
$listener->postFlush($eventArgs);
}
/**
* @dataProvider provideIsIndexableCallbacks
*/
public function testNonIndexableObjectRemovedOnUpdate($isIndexableCallback)
{
$classMetadata = $this->getMockClassMetadata();
$objectManager = $this->getMockObjectManager();
$persister = $this->getMockPersister();
$entity = new Listener\Entity(1, false);
$eventArgs = $this->createLifecycleEventArgs($entity, $objectManager);
$objectManager->expects($this->any())
->method('getClassMetadata')
->with(get_class($entity))
->will($this->returnValue($classMetadata));
$classMetadata->expects($this->any())
->method('getFieldValue')
->with($entity, 'id')
->will($this->returnValue($entity->getId()));
$listener = $this->createListener($persister, get_class($entity), array());
$listener->setIsIndexableCallback($isIndexableCallback);
$listener->postUpdate($eventArgs);
$this->assertEmpty($listener->scheduledForUpdate);
$this->assertEquals($entity, current($listener->scheduledForDeletion));
$persister->expects($this->never())
->method('replaceOne');
$persister->expects($this->once())
->method('deleteMany')
->with(array($entity));
$listener->postFlush($eventArgs);
}
public function testObjectDeletedOnRemove()
{
$classMetadata = $this->getMockClassMetadata();
$objectManager = $this->getMockObjectManager();
$persister = $this->getMockPersister();
$entity = new Listener\Entity(1);
$eventArgs = $this->createLifecycleEventArgs($entity, $objectManager);
$objectManager->expects($this->any())
->method('getClassMetadata')
->with(get_class($entity))
->will($this->returnValue($classMetadata));
$classMetadata->expects($this->any())
->method('getFieldValue')
->with($entity, 'id')
->will($this->returnValue($entity->getId()));
$listener = $this->createListener($persister, get_class($entity), array());
$listener->preRemove($eventArgs);
$this->assertEquals($entity, current($listener->scheduledForDeletion));
$persister->expects($this->once())
->method('deleteMany')
->with(array($entity));
$listener->postFlush($eventArgs);
}
public function testObjectWithNonStandardIdentifierDeletedOnRemove()
{
$classMetadata = $this->getMockClassMetadata();
$objectManager = $this->getMockObjectManager();
$persister = $this->getMockPersister();
$entity = new Listener\Entity(1);
$eventArgs = $this->createLifecycleEventArgs($entity, $objectManager);
$objectManager->expects($this->any())
->method('getClassMetadata')
->with(get_class($entity))
->will($this->returnValue($classMetadata));
$classMetadata->expects($this->any())
->method('getFieldValue')
->with($entity, 'identifier')
->will($this->returnValue($entity->getId()));
$listener = $this->createListener($persister, get_class($entity), array(), 'identifier');
$listener->preRemove($eventArgs);
$this->assertEquals($entity, current($listener->scheduledForDeletion));
$persister->expects($this->once())
->method('deleteMany')
->with(array($entity));
$listener->postFlush($eventArgs);
}
/**
* @dataProvider provideInvalidIsIndexableCallbacks
* @expectedException \RuntimeException
*/
public function testInvalidIsIndexableCallbacks($isIndexableCallback)
{
$listener = $this->createListener($this->getMockPersister(), 'FOS\ElasticaBundle\Tests\Doctrine\Listener\Entity', array());
$listener->setIsIndexableCallback($isIndexableCallback);
}
public function provideInvalidIsIndexableCallbacks()
{
return array(
array('nonexistentEntityMethod'),
array(array(new Listener\IndexableDecider(), 'internalMethod')),
array(42),
array('entity.getIsIndexable() && nonexistentEntityFunction()'),
);
}
public function provideIsIndexableCallbacks()
{
return array(
array('getIsIndexable'),
array(array(new Listener\IndexableDecider(), 'isIndexable')),
array(function(Listener\Entity $entity) { return $entity->getIsIndexable(); }),
array('entity.getIsIndexable()')
);
}
abstract protected function getLifecycleEventArgsClass();
abstract protected function getListenerClass();
abstract protected function getObjectManagerClass();
abstract protected function getClassMetadataClass();
private function createLifecycleEventArgs()
{
$refl = new \ReflectionClass($this->getLifecycleEventArgsClass());
return $refl->newInstanceArgs(func_get_args());
}
private function createListener()
{
$refl = new \ReflectionClass($this->getListenerClass());
return $refl->newInstanceArgs(func_get_args());
}
private function getMockClassMetadata()
{
return $this->getMockBuilder($this->getClassMetadataClass())
->disableOriginalConstructor()
->getMock();
}
private function getMockObjectManager()
{
return $this->getMockBuilder($this->getObjectManagerClass())
->disableOriginalConstructor()
->getMock();
}
private function getMockPersister()
{
return $this->getMock('FOS\ElasticaBundle\Persister\ObjectPersisterInterface');
}
}
namespace FOS\ElasticaBundle\Tests\Doctrine\Listener;
class Entity
{
private $id;
private $isIndexable;
public function __construct($id, $isIndexable = true)
{
$this->id = $id;
$this->isIndexable = $isIndexable;
}
public function getId()
{
return $this->id;
}
public function getIsIndexable()
{
return $this->isIndexable;
}
}
class IndexableDecider
{
public function isIndexable(Entity $entity)
{
return $entity->getIsIndexable();
}
protected function internalMethod()
{
}
}