468 lines
17 KiB
PHP
468 lines
17 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Sensio\Bundle\FrameworkExtraBundle\Tests\Request\ParamConverter;
|
|
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\DoctrineParamConverter;
|
|
use Doctrine\Common\Persistence\ManagerRegistry;
|
|
|
|
class DoctrineParamConverterTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
/**
|
|
* @var ManagerRegistry
|
|
*/
|
|
private $registry;
|
|
|
|
/**
|
|
* @var DoctrineParamConverter
|
|
*/
|
|
private $converter;
|
|
|
|
public function setUp()
|
|
{
|
|
$this->registry = $this->getMockBuilder('Doctrine\Common\Persistence\ManagerRegistry')->getMock();
|
|
$this->converter = new DoctrineParamConverter($this->registry);
|
|
}
|
|
|
|
public function createConfiguration($class = null, array $options = null, $name = 'arg', $isOptional = false)
|
|
{
|
|
$methods = array('getClass', 'getAliasName', 'getOptions', 'getName', 'allowArray');
|
|
if (null !== $isOptional) {
|
|
$methods[] = 'isOptional';
|
|
}
|
|
$config = $this
|
|
->getMockBuilder('Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter')
|
|
->setMethods($methods)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
if ($options !== null) {
|
|
$config->expects($this->once())
|
|
->method('getOptions')
|
|
->will($this->returnValue($options));
|
|
}
|
|
if ($class !== null) {
|
|
$config->expects($this->any())
|
|
->method('getClass')
|
|
->will($this->returnValue($class));
|
|
}
|
|
$config->expects($this->any())
|
|
->method('getName')
|
|
->will($this->returnValue($name));
|
|
if (null !== $isOptional) {
|
|
$config->expects($this->any())
|
|
->method('isOptional')
|
|
->will($this->returnValue($isOptional));
|
|
}
|
|
|
|
return $config;
|
|
}
|
|
|
|
public function testApplyWithNoIdAndData()
|
|
{
|
|
$request = new Request();
|
|
$config = $this->createConfiguration(null, array());
|
|
$objectManager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
|
|
$this->setExpectedException('LogicException');
|
|
$this->converter->apply($request, $config);
|
|
}
|
|
|
|
public function testApplyWithNoIdAndDataOptional()
|
|
{
|
|
$request = new Request();
|
|
$config = $this->createConfiguration(null, array(), 'arg', true);
|
|
$objectManager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
|
|
$ret = $this->converter->apply($request, $config);
|
|
|
|
$this->assertTrue($ret);
|
|
$this->assertNull($request->attributes->get('arg'));
|
|
}
|
|
|
|
public function testApplyWithStripNulls()
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('arg', null);
|
|
$config = $this->createConfiguration('stdClass', array('mapping' => array('arg' => 'arg'), 'strip_null' => true), 'arg', true);
|
|
|
|
$classMetadata = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadata')->getMock();
|
|
$manager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$manager->expects($this->once())
|
|
->method('getClassMetadata')
|
|
->with('stdClass')
|
|
->will($this->returnValue($classMetadata));
|
|
|
|
$manager->expects($this->never())
|
|
->method('getRepository');
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->with('stdClass')
|
|
->will($this->returnValue($manager));
|
|
|
|
$classMetadata->expects($this->once())
|
|
->method('hasField')
|
|
->with($this->equalTo('arg'))
|
|
->will($this->returnValue(true));
|
|
|
|
$this->converter->apply($request, $config);
|
|
|
|
$this->assertNull($request->attributes->get('arg'));
|
|
}
|
|
|
|
/**
|
|
* @dataProvider idsProvider
|
|
*/
|
|
public function testApplyWithId($id)
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('id', $id);
|
|
|
|
$config = $this->createConfiguration('stdClass', array('id' => 'id'), 'arg');
|
|
|
|
$manager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$objectRepository = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectRepository')->getMock();
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->with('stdClass')
|
|
->will($this->returnValue($manager));
|
|
|
|
$manager->expects($this->once())
|
|
->method('getRepository')
|
|
->with('stdClass')
|
|
->will($this->returnValue($objectRepository));
|
|
|
|
$objectRepository->expects($this->once())
|
|
->method('find')
|
|
->with($this->equalTo($id))
|
|
->will($this->returnValue($object = new \stdClass()));
|
|
|
|
$ret = $this->converter->apply($request, $config);
|
|
|
|
$this->assertTrue($ret);
|
|
$this->assertSame($object, $request->attributes->get('arg'));
|
|
}
|
|
|
|
public function testUsedProperIdentifier()
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('id', 1);
|
|
$request->attributes->set('entity_id', null);
|
|
$request->attributes->set('arg', null);
|
|
|
|
$config = $this->createConfiguration('stdClass', array('id' => 'entity_id'), 'arg', null);
|
|
|
|
$ret = $this->converter->apply($request, $config);
|
|
|
|
$this->assertTrue($ret);
|
|
$this->assertNull($request->attributes->get('arg'));
|
|
}
|
|
|
|
public function idsProvider()
|
|
{
|
|
return array(
|
|
array(1),
|
|
array(0),
|
|
array('foo'),
|
|
);
|
|
}
|
|
|
|
public function testApplyGuessOptional()
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('arg', null);
|
|
|
|
$config = $this->createConfiguration('stdClass', array(), 'arg', null);
|
|
|
|
$classMetadata = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadata')->getMock();
|
|
$manager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$manager->expects($this->once())
|
|
->method('getClassMetadata')
|
|
->with('stdClass')
|
|
->will($this->returnValue($classMetadata));
|
|
|
|
$objectRepository = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectRepository')->getMock();
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->with('stdClass')
|
|
->will($this->returnValue($manager));
|
|
|
|
$manager->expects($this->never())->method('getRepository');
|
|
|
|
$objectRepository->expects($this->never())->method('find');
|
|
$objectRepository->expects($this->never())->method('findOneBy');
|
|
|
|
$ret = $this->converter->apply($request, $config);
|
|
|
|
$this->assertTrue($ret);
|
|
$this->assertNull($request->attributes->get('arg'));
|
|
}
|
|
|
|
public function testApplyWithMappingAndExclude()
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('foo', 1);
|
|
$request->attributes->set('bar', 2);
|
|
|
|
$config = $this->createConfiguration(
|
|
'stdClass',
|
|
array('mapping' => array('foo' => 'Foo'), 'exclude' => array('bar')),
|
|
'arg'
|
|
);
|
|
|
|
$manager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$metadata = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadata')->getMock();
|
|
$repository = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectRepository')->getMock();
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->with('stdClass')
|
|
->will($this->returnValue($manager));
|
|
|
|
$manager->expects($this->once())
|
|
->method('getClassMetadata')
|
|
->with('stdClass')
|
|
->will($this->returnValue($metadata));
|
|
$manager->expects($this->once())
|
|
->method('getRepository')
|
|
->with('stdClass')
|
|
->will($this->returnValue($repository));
|
|
|
|
$metadata->expects($this->once())
|
|
->method('hasField')
|
|
->with($this->equalTo('Foo'))
|
|
->will($this->returnValue(true));
|
|
|
|
$repository->expects($this->once())
|
|
->method('findOneBy')
|
|
->with($this->equalTo(array('Foo' => 1)))
|
|
->will($this->returnValue($object = new \stdClass()));
|
|
|
|
$ret = $this->converter->apply($request, $config);
|
|
|
|
$this->assertTrue($ret);
|
|
$this->assertSame($object, $request->attributes->get('arg'));
|
|
}
|
|
|
|
public function testApplyWithRepositoryMethod()
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('id', 1);
|
|
|
|
$config = $this->createConfiguration(
|
|
'stdClass',
|
|
array('repository_method' => 'getClassName'),
|
|
'arg'
|
|
);
|
|
|
|
$objectRepository = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectRepository')->getMock();
|
|
$manager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$manager->expects($this->once())
|
|
->method('getRepository')
|
|
->with('stdClass')
|
|
->will($this->returnValue($objectRepository));
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->will($this->returnValue($manager));
|
|
|
|
$objectRepository->expects($this->once())
|
|
->method('getClassName')
|
|
->will($this->returnValue($className = 'ObjectRepository'));
|
|
|
|
$ret = $this->converter->apply($request, $config);
|
|
|
|
$this->assertTrue($ret);
|
|
$this->assertSame($className, $request->attributes->get('arg'));
|
|
}
|
|
|
|
public function testApplyWithRepositoryMethodAndMapping()
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('id', 1);
|
|
|
|
$config = $this->createConfiguration(
|
|
'stdClass',
|
|
array('repository_method' => 'getClassName', 'mapping' => array('foo' => 'Foo')),
|
|
'arg'
|
|
);
|
|
|
|
$objectManager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$objectRepository = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectRepository')->getMock();
|
|
$metadata = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadata')->getMock();
|
|
|
|
$objectManager->expects($this->once())
|
|
->method('getRepository')
|
|
->with('stdClass')
|
|
->will($this->returnValue($objectRepository));
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->will($this->returnValue($objectManager));
|
|
|
|
$metadata->expects($this->once())
|
|
->method('hasField')
|
|
->with($this->equalTo('Foo'))
|
|
->will($this->returnValue(true));
|
|
|
|
$objectManager->expects($this->once())
|
|
->method('getClassMetadata')
|
|
->will($this->returnValue($metadata));
|
|
$objectManager->expects($this->once())
|
|
->method('getRepository')
|
|
->with('stdClass')
|
|
->will($this->returnValue($objectRepository));
|
|
|
|
$objectRepository->expects($this->once())
|
|
->method('getClassName')
|
|
->will($this->returnValue($className = 'ObjectRepository'));
|
|
|
|
$ret = $this->converter->apply($request, $config);
|
|
|
|
$this->assertTrue($ret);
|
|
$this->assertSame($className, $request->attributes->get('arg'));
|
|
}
|
|
|
|
public function testApplyWithRepositoryMethodAndMapMethodSignature()
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('first_name', 'Fabien');
|
|
$request->attributes->set('last_name', 'Potencier');
|
|
|
|
$config = $this->createConfiguration(
|
|
'stdClass',
|
|
array(
|
|
'repository_method' => 'findByFullName',
|
|
'mapping' => array('first_name' => 'firstName', 'last_name' => 'lastName'),
|
|
'map_method_signature' => true,
|
|
),
|
|
'arg'
|
|
);
|
|
|
|
$objectManager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$objectRepository = new TestUserRepository();
|
|
$metadata = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadata')->getMock();
|
|
|
|
$objectManager->expects($this->once())
|
|
->method('getRepository')
|
|
->with('stdClass')
|
|
->will($this->returnValue($objectRepository));
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->will($this->returnValue($objectManager));
|
|
|
|
$objectManager->expects($this->once())
|
|
->method('getClassMetadata')
|
|
->will($this->returnValue($metadata));
|
|
|
|
$ret = $this->converter->apply($request, $config);
|
|
|
|
$this->assertTrue($ret);
|
|
$this->assertSame('Fabien Potencier', $request->attributes->get('arg'));
|
|
}
|
|
|
|
/**
|
|
* @expectedException \InvalidArgumentException
|
|
* @expectedExceptionMessage Repository method "Sensio\Bundle\FrameworkExtraBundle\Tests\Request\ParamConverter\TestUserRepository::findByFullName" requires that you provide a value for the "$lastName" argument.
|
|
*/
|
|
public function testApplyWithRepositoryMethodAndMapMethodSignatureException()
|
|
{
|
|
$request = new Request();
|
|
$request->attributes->set('first_name', 'Fabien');
|
|
$request->attributes->set('last_name', 'Potencier');
|
|
|
|
$config = $this->createConfiguration(
|
|
'stdClass',
|
|
array(
|
|
'repository_method' => 'findByFullName',
|
|
'mapping' => array('first_name' => 'firstName', 'last_name' => 'lastNameXxx'),
|
|
'map_method_signature' => true,
|
|
),
|
|
'arg'
|
|
);
|
|
|
|
$objectManager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$objectRepository = new TestUserRepository();
|
|
$metadata = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadata')->getMock();
|
|
|
|
$objectManager->expects($this->once())
|
|
->method('getRepository')
|
|
->with('stdClass')
|
|
->will($this->returnValue($objectRepository));
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->will($this->returnValue($objectManager));
|
|
|
|
$objectManager->expects($this->once())
|
|
->method('getClassMetadata')
|
|
->will($this->returnValue($metadata));
|
|
|
|
$this->converter->apply($request, $config);
|
|
}
|
|
|
|
public function testSupports()
|
|
{
|
|
$config = $this->createConfiguration('stdClass', array());
|
|
$metadataFactory = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory')->getMock();
|
|
$metadataFactory->expects($this->once())
|
|
->method('isTransient')
|
|
->with($this->equalTo('stdClass'))
|
|
->will($this->returnValue(false));
|
|
|
|
$objectManager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$objectManager->expects($this->once())
|
|
->method('getMetadataFactory')
|
|
->will($this->returnValue($metadataFactory));
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManagers')
|
|
->will($this->returnValue(array($objectManager)));
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManagerForClass')
|
|
->with('stdClass')
|
|
->will($this->returnValue($objectManager));
|
|
|
|
$ret = $this->converter->supports($config);
|
|
|
|
$this->assertTrue($ret, 'Should be supported');
|
|
}
|
|
|
|
public function testSupportsWithConfiguredEntityManager()
|
|
{
|
|
$config = $this->createConfiguration('stdClass', array('entity_manager' => 'foo'));
|
|
$metadataFactory = $this->getMockBuilder('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory')->getMock();
|
|
$metadataFactory->expects($this->once())
|
|
->method('isTransient')
|
|
->with($this->equalTo('stdClass'))
|
|
->will($this->returnValue(false));
|
|
|
|
$objectManager = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')->getMock();
|
|
$objectManager->expects($this->once())
|
|
->method('getMetadataFactory')
|
|
->will($this->returnValue($metadataFactory));
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManagers')
|
|
->will($this->returnValue(array($objectManager)));
|
|
|
|
$this->registry->expects($this->once())
|
|
->method('getManager')
|
|
->with('foo')
|
|
->will($this->returnValue($objectManager));
|
|
|
|
$ret = $this->converter->supports($config);
|
|
|
|
$this->assertTrue($ret, 'Should be supported');
|
|
}
|
|
}
|