Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / orm / tests / Doctrine / Tests / ORM / Proxy / ProxyClassGeneratorTest.php
1 <?php
2
3 namespace Doctrine\Tests\ORM\Proxy;
4
5 use Doctrine\ORM\Proxy\ProxyFactory;
6 use Doctrine\Tests\Mocks\ConnectionMock;
7 use Doctrine\Tests\Mocks\EntityManagerMock;
8 use Doctrine\Tests\Mocks\UnitOfWorkMock;
9 use Doctrine\Tests\Models\ECommerce\ECommerceCart;
10 use Doctrine\Tests\Models\ECommerce\ECommerceCustomer;
11 use Doctrine\Tests\Models\ECommerce\ECommerceFeature;
12 use Doctrine\Tests\Models\ECommerce\ECommerceProduct;
13 use Doctrine\Tests\Models\ECommerce\ECommerceShipping;
14
15 require_once __DIR__ . '/../../TestInit.php';
16
17 /**
18  * Test the proxy generator. Its work is generating on-the-fly subclasses of a given model, which implement the Proxy pattern.
19  * @author Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
20  */
21 class ProxyClassGeneratorTest extends \Doctrine\Tests\OrmTestCase
22 {
23     private $_connectionMock;
24     private $_uowMock;
25     private $_emMock;
26
27     /**
28      * @var \Doctrine\ORM\Proxy\ProxyFactory
29      */
30     private $_proxyFactory;
31
32     protected function setUp()
33     {
34         parent::setUp();
35         $this->_connectionMock = new ConnectionMock(array(), new \Doctrine\Tests\Mocks\DriverMock());
36         $this->_emMock = EntityManagerMock::create($this->_connectionMock);
37         $this->_uowMock = new UnitOfWorkMock($this->_emMock);
38         $this->_emMock->setUnitOfWork($this->_uowMock);
39         // SUT
40         $this->_proxyFactory = new ProxyFactory($this->_emMock, __DIR__ . '/generated', 'Proxies', true);
41     }
42
43     protected function tearDown()
44     {
45         foreach (new \DirectoryIterator(__DIR__ . '/generated') as $file) {
46             if (strstr($file->getFilename(), '.php')) {
47                 unlink($file->getPathname());
48             }
49         }
50     }
51
52     public function testReferenceProxyDelegatesLoadingToThePersister()
53     {
54         $identifier = array('id' => 42);
55         $proxyClass = 'Proxies\__CG__\Doctrine\Tests\Models\ECommerce\ECommerceFeature';
56         $persister = $this->_getMockPersister();
57         $this->_uowMock->setEntityPersister('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $persister);
58
59         $proxy = $this->_proxyFactory->getProxy('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $identifier);
60
61         $persister->expects($this->atLeastOnce())
62                   ->method('load')
63                   ->with($this->equalTo($identifier), $this->isInstanceOf($proxyClass))
64                   ->will($this->returnValue(new \stdClass())); // fake return of entity instance
65
66         $proxy->getDescription();
67     }
68
69     public function testReferenceProxyExecutesLoadingOnlyOnce()
70     {
71         $identifier = array('id' => 42);
72         $proxyClass = 'Proxies\__CG__\Doctrine\Tests\Models\ECommerce\ECommerceFeature';
73         $persister = $this->_getMockPersister();
74         $this->_uowMock->setEntityPersister('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $persister);
75         $proxy = $this->_proxyFactory->getProxy('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $identifier);
76
77         $persister->expects($this->atLeastOnce())
78                   ->method('load')
79                   ->with($this->equalTo($identifier), $this->isInstanceOf($proxyClass))
80                   ->will($this->returnValue(new \stdClass())); // fake return of entity instance
81         $proxy->getDescription();
82         $proxy->getProduct();
83     }
84
85     public function testReferenceProxyRespectsMethodsParametersTypeHinting()
86     {
87         $proxyClass = 'Proxies\DoctrineTestsModelsECommerceECommerceFeatureProxy';
88         $persister = $this->_getMockPersister();
89         $this->_uowMock->setEntityPersister('Doctrine\Tests\Models\ECommerce\ECommerceFeature', $persister);
90         $proxy = $this->_proxyFactory->getProxy('Doctrine\Tests\Models\ECommerce\ECommerceFeature', null);
91
92         $method = new \ReflectionMethod(get_class($proxy), 'setProduct');
93         $params = $method->getParameters();
94
95         $this->assertEquals(1, count($params));
96         $this->assertEquals('Doctrine\Tests\Models\ECommerce\ECommerceProduct', $params[0]->getClass()->getName());
97     }
98
99     /**
100      * Test that the proxy behaves in regard to methods like &foo() correctly
101      */
102     public function testProxyRespectsMethodsWhichReturnValuesByReference() {
103         $proxy = $this->_proxyFactory->getProxy('Doctrine\Tests\Models\Forum\ForumEntry', null);
104         $method = new \ReflectionMethod(get_class($proxy), 'getTopicByReference');
105
106         $this->assertTrue($method->returnsReference());
107     }
108
109     public function testCreatesAssociationProxyAsSubclassOfTheOriginalOne()
110     {
111         $proxyClass = 'Proxies\__CG__\Doctrine\Tests\Models\ECommerce\ECommerceFeature';
112         $this->assertTrue(is_subclass_of($proxyClass, 'Doctrine\Tests\Models\ECommerce\ECommerceFeature'));
113     }
114
115
116     public function testAllowsConcurrentCreationOfBothProxyTypes()
117     {
118         $referenceProxyClass = 'Proxies\DoctrineTestsModelsECommerceECommerceFeatureProxy';
119         $associationProxyClass = 'Proxies\DoctrineTestsModelsECommerceECommerceFeatureAProxy';
120         $this->assertNotEquals($referenceProxyClass, $associationProxyClass);
121     }
122
123     public function testNonNamespacedProxyGeneration()
124     {
125         require_once dirname(__FILE__)."/fixtures/NonNamespacedProxies.php";
126
127         $className = "\DoctrineOrmTestEntity";
128         $proxyName = "DoctrineOrmTestEntity";
129         $classMetadata = new \Doctrine\ORM\Mapping\ClassMetadata($className);
130         $classMetadata->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
131         $classMetadata->mapField(array('fieldName' => 'id', 'type' => 'integer'));
132         $classMetadata->setIdentifier(array('id'));
133
134         $this->_proxyFactory->generateProxyClasses(array($classMetadata));
135
136         $classCode = file_get_contents(dirname(__FILE__)."/generated/__CG__".$proxyName.".php");
137
138         $this->assertNotContains("class DoctrineOrmTestEntity extends \\\\DoctrineOrmTestEntity", $classCode);
139         $this->assertContains("class DoctrineOrmTestEntity extends \\DoctrineOrmTestEntity", $classCode);
140     }
141
142     public function testClassWithSleepProxyGeneration()
143     {
144         $className = "\Doctrine\Tests\ORM\Proxy\SleepClass";
145         $proxyName = "DoctrineTestsORMProxySleepClass";
146         $classMetadata = new \Doctrine\ORM\Mapping\ClassMetadata($className);
147         $classMetadata->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
148         $classMetadata->mapField(array('fieldName' => 'id', 'type' => 'integer'));
149         $classMetadata->setIdentifier(array('id'));
150
151         $this->_proxyFactory->generateProxyClasses(array($classMetadata));
152
153         $classCode = file_get_contents(dirname(__FILE__)."/generated/__CG__".$proxyName.".php");
154
155         $this->assertEquals(1, substr_count($classCode, 'function __sleep'));
156     }
157
158     /**
159      * @group DDC-1771
160      */
161     public function testSkipAbstractClassesOnGeneration()
162     {
163         $cm = new \Doctrine\ORM\Mapping\ClassMetadata(__NAMESPACE__ . '\\AbstractClass');
164         $cm->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService);
165         $this->assertNotNull($cm->reflClass);
166
167         $num = $this->_proxyFactory->generateProxyClasses(array($cm));
168
169         $this->assertEquals(0, $num, "No proxies generated.");
170     }
171
172     public function testNoConfigDir_ThrowsException()
173     {
174         $this->setExpectedException('Doctrine\ORM\Proxy\ProxyException');
175         new ProxyFactory($this->_getTestEntityManager(), null, null);
176     }
177
178     public function testNoNamespace_ThrowsException()
179     {
180         $this->setExpectedException('Doctrine\ORM\Proxy\ProxyException');
181         new ProxyFactory($this->_getTestEntityManager(), __DIR__ . '/generated', null);
182     }
183
184     protected function _getMockPersister()
185     {
186         $persister = $this->getMock('Doctrine\ORM\Persisters\BasicEntityPersister', array('load'), array(), '', false);
187         return $persister;
188     }
189 }
190
191 class SleepClass
192 {
193     public $id;
194
195     public function __sleep()
196     {
197         return array('id');
198     }
199 }
200
201 abstract class AbstractClass
202 {
203
204 }