1
0
mirror of synced 2025-02-02 21:41:45 +03:00

Merge branch 'fix/#6017-check-entity-name-in-clear-call-should-be-a-string'

Close #6017
This commit is contained in:
Marco Pivetta 2016-11-27 18:39:55 +01:00
commit 555e8ae641
7 changed files with 153 additions and 3 deletions

View File

@ -19,6 +19,7 @@
namespace Doctrine\ORM; namespace Doctrine\ORM;
use Doctrine\ORM\Mapping\MappingException;
use Exception; use Exception;
use Doctrine\Common\EventManager; use Doctrine\Common\EventManager;
use Doctrine\DBAL\Connection; use Doctrine\DBAL\Connection;
@ -539,10 +540,22 @@ use Doctrine\Common\Util\ClassUtils;
* @param string|null $entityName if given, only entities of this type will get detached * @param string|null $entityName if given, only entities of this type will get detached
* *
* @return void * @return void
*
* @throws ORMInvalidArgumentException if a non-null non-string value is given
* @throws \Doctrine\Common\Persistence\Mapping\MappingException if a $entityName is given, but that entity is not
* found in the mappings
*/ */
public function clear($entityName = null) public function clear($entityName = null)
{ {
$this->unitOfWork->clear($entityName); if (null !== $entityName && ! is_string($entityName)) {
throw ORMInvalidArgumentException::invalidEntityName($entityName);
}
$this->unitOfWork->clear(
null === $entityName
? null
: $this->metadataFactory->getMetadataFor($entityName)->getName()
);
} }
/** /**

View File

@ -101,7 +101,7 @@ class ORMException extends Exception
return new self("Unrecognized field: $field"); return new self("Unrecognized field: $field");
} }
/** /**
* *
* @param string $class * @param string $class
* @param string $association * @param string $association

View File

@ -210,6 +210,18 @@ class ORMInvalidArgumentException extends \InvalidArgumentException
)); ));
} }
/**
* Used when a given entityName hasn't the good type
*
* @param mixed $entityName The given entity (which shouldn't be a string)
*
* @return self
*/
public static function invalidEntityName($entityName)
{
return new self(sprintf('Entity name must be a string, %s given', gettype($entityName)));
}
/** /**
* Helper method to show an object as string. * Helper method to show an object as string.
* *

View File

@ -2360,6 +2360,8 @@ class UnitOfWork implements PropertyChangedListener
* @param string|null $entityName if given, only entities of this type will get detached. * @param string|null $entityName if given, only entities of this type will get detached.
* *
* @return void * @return void
*
* @throws ORMInvalidArgumentException if an invalid entity name is given
*/ */
public function clear($entityName = null) public function clear($entityName = null)
{ {

View File

@ -3,15 +3,20 @@
namespace Doctrine\Tests\ORM; namespace Doctrine\Tests\ORM;
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver; use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver;
use Doctrine\Common\Persistence\Mapping\MappingException;
use Doctrine\ORM\Configuration; use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManager;
use Doctrine\ORM\ORMException; use Doctrine\ORM\ORMException;
use Doctrine\ORM\ORMInvalidArgumentException; use Doctrine\ORM\ORMInvalidArgumentException;
use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\ORM\Query\ResultSetMapping;
use Doctrine\Tests\Models\GeoNames\Country;
use Doctrine\Tests\OrmTestCase; use Doctrine\Tests\OrmTestCase;
class EntityManagerTest extends OrmTestCase class EntityManagerTest extends OrmTestCase
{ {
/**
* @var EntityManager
*/
private $_em; private $_em;
function setUp() function setUp()
@ -69,7 +74,7 @@ class EntityManagerTest extends OrmTestCase
} }
/** /**
* @covers Doctrine\ORM\EntityManager::createNamedNativeQuery * @covers \Doctrine\ORM\EntityManager::createNamedNativeQuery
*/ */
public function testCreateNamedNativeQuery() public function testCreateNamedNativeQuery()
{ {
@ -217,4 +222,60 @@ class EntityManagerTest extends OrmTestCase
$config->setMetadataDriverImpl($this->createMock(MappingDriver::class)); $config->setMetadataDriverImpl($this->createMock(MappingDriver::class));
EntityManager::create(1, $config); EntityManager::create(1, $config);
} }
/**
* @group 6017
*/
public function testClearManagerWithObject()
{
$entity = new Country(456, 'United Kingdom');
$this->expectException(ORMInvalidArgumentException::class);
$this->_em->clear($entity);
}
/**
* @group 6017
*/
public function testClearManagerWithUnknownEntityName()
{
$this->expectException(MappingException::class);
$this->_em->clear(uniqid('nonExisting', true));
}
/**
* @group 6017
*/
public function testClearManagerWithProxyClassName()
{
$proxy = $this->_em->getReference(Country::class, ['id' => rand(457, 100000)]);
$entity = new Country(456, 'United Kingdom');
$this->_em->persist($entity);
$this->assertTrue($this->_em->contains($entity));
$this->_em->clear(get_class($proxy));
$this->assertFalse($this->_em->contains($entity));
}
/**
* @group 6017
*/
public function testClearManagerWithNullValue()
{
$entity = new Country(456, 'United Kingdom');
$this->_em->persist($entity);
$this->assertTrue($this->_em->contains($entity));
$this->_em->clear(null);
$this->assertFalse($this->_em->contains($entity));
}
} }

View File

@ -0,0 +1,60 @@
<?php
namespace Doctrine\Tests\ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\NotifyPropertyChanged;
use Doctrine\Common\PropertyChangedListener;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\ORMInvalidArgumentException;
use Doctrine\ORM\UnitOfWork;
use Doctrine\ORM\ORMException;
use Doctrine\Tests\Mocks\ConnectionMock;
use Doctrine\Tests\Mocks\DriverMock;
use Doctrine\Tests\Mocks\EntityManagerMock;
use Doctrine\Tests\Mocks\EntityPersisterMock;
use Doctrine\Tests\Mocks\UnitOfWorkMock;
use Doctrine\Tests\Models\CMS\CmsPhonenumber;
use Doctrine\Tests\Models\CMS\CmsUser;
use Doctrine\Tests\Models\Forum\ForumAvatar;
use Doctrine\Tests\Models\Forum\ForumUser;
use Doctrine\Tests\Models\GeoNames\City;
use Doctrine\Tests\Models\GeoNames\Country;
use Doctrine\Tests\OrmTestCase;
use stdClass;
/**
* @covers \Doctrine\ORM\ORMInvalidArgumentException
*/
class ORMInvalidArgumentExceptionTest extends \PHPUnit_Framework_TestCase
{
/**
* @dataProvider invalidEntityNames
*
* @param mixed $value
* @param string $expectedMessage
*
* @return void
*/
public function testInvalidEntityName($value, $expectedMessage)
{
$exception = ORMInvalidArgumentException::invalidEntityName($value);
self::assertInstanceOf(ORMInvalidArgumentException::class, $exception);
self::assertSame($expectedMessage, $exception->getMessage());
}
/**
* @return string[][]
*/
public function invalidEntityNames()
{
return [
[null, 'Entity name must be a string, NULL given'],
[true, 'Entity name must be a string, boolean given'],
[123, 'Entity name must be a string, integer given'],
[123.45, 'Entity name must be a string, double given'],
[new \stdClass(), 'Entity name must be a string, object given'],
];
}
}

View File

@ -4,10 +4,12 @@ namespace Doctrine\Tests\ORM;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\NotifyPropertyChanged; use Doctrine\Common\NotifyPropertyChanged;
use Doctrine\Common\Persistence\Mapping\MappingException;
use Doctrine\Common\PropertyChangedListener; use Doctrine\Common\PropertyChangedListener;
use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\ORMInvalidArgumentException; use Doctrine\ORM\ORMInvalidArgumentException;
use Doctrine\ORM\UnitOfWork; use Doctrine\ORM\UnitOfWork;
use Doctrine\ORM\ORMException;
use Doctrine\Tests\Mocks\ConnectionMock; use Doctrine\Tests\Mocks\ConnectionMock;
use Doctrine\Tests\Mocks\DriverMock; use Doctrine\Tests\Mocks\DriverMock;
use Doctrine\Tests\Mocks\EntityManagerMock; use Doctrine\Tests\Mocks\EntityManagerMock;