‪TYPO3CMS  ‪main
PersistenceManagerTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\Test;
21 use Psr\Container\ContainerInterface;
33 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
34 
35 final class ‪PersistenceManagerTest extends UnitTestCase
36 {
37  #[Test]
39  {
40  $entity2 = new ‪Entity2();
41  $objectStorage = new ‪ObjectStorage();
42  $objectStorage->attach($entity2);
43  $mockBackend = $this->createMock(BackendInterface::class);
44  $mockBackend->expects(self::once())->method('setAggregateRootObjects')->with($objectStorage);
45 
46  $manager = new ‪PersistenceManager(
47  $this->createMock(QueryFactoryInterface::class),
48  $mockBackend,
49  $this->createMock(Session::class)
50  );
51  $manager->add($entity2);
52 
53  $manager->persistAll();
54  }
55 
56  #[Test]
58  {
59  $entity2 = new ‪Entity2();
60  $objectStorage = new ‪ObjectStorage();
61  $objectStorage->attach($entity2);
62  $mockBackend = $this->createMock(BackendInterface::class);
63  $mockBackend->expects(self::once())->method('setDeletedEntities')->with($objectStorage);
64 
65  $manager = new ‪PersistenceManager(
66  $this->createMock(QueryFactoryInterface::class),
67  $mockBackend,
68  $this->createMock(Session::class)
69  );
70  $manager->remove($entity2);
71 
72  $manager->persistAll();
73  }
74 
75  #[Test]
77  {
78  $fakeUuid = 'fakeUuid';
79  $object = new \stdClass();
80 
81  $mockBackend = $this->createMock(BackendInterface::class);
82  $mockBackend->expects(self::once())->method('getIdentifierByObject')->with($object)->willReturn($fakeUuid);
83 
84  $manager = new ‪PersistenceManager(
85  $this->createMock(QueryFactoryInterface::class),
86  $mockBackend,
87  $this->createMock(Session::class)
88  );
89 
90  self::assertEquals($manager->getIdentifierByObject($object), $fakeUuid);
91  }
92 
93  #[Test]
95  {
96  $fakeUuid = 'fakeUuid';
97  $object = new \stdClass();
98 
99  $mockSession = $this->createMock(Session::class);
100  $mockSession->expects(self::once())->method('hasIdentifier')->with($fakeUuid, \stdClass::class)->willReturn(true);
101  $mockSession->expects(self::once())->method('getObjectByIdentifier')->with($fakeUuid)->willReturn($object);
102 
103  $manager = new ‪PersistenceManager(
104  $this->createMock(QueryFactoryInterface::class),
105  $this->createMock(BackendInterface::class),
106  $mockSession
107  );
108 
109  self::assertEquals($manager->getObjectByIdentifier($fakeUuid, $object::class), $object);
110  }
111 
112  #[Test]
114  {
115  $fakeUuid = '42';
116  $object = new \stdClass();
117  $fakeEntityType = get_class($object);
118 
119  $mockSession = $this->createMock(Session::class);
120  $mockSession->expects(self::once())->method('hasIdentifier')->with($fakeUuid)->willReturn(false);
121 
122  $mockBackend = $this->createMock(BackendInterface::class);
123  $mockBackend->expects(self::once())->method('getObjectByIdentifier')->with(
124  $fakeUuid,
125  $fakeEntityType
126  )->willReturn($object);
127 
128  $manager = new ‪PersistenceManager(
129  $this->createMock(QueryFactoryInterface::class),
130  $mockBackend,
131  $mockSession
132  );
133 
134  self::assertEquals($manager->getObjectByIdentifier($fakeUuid, $fakeEntityType), $object);
135  }
136 
137  #[Test]
139  {
140  $fakeUuid = '42';
141  $fakeEntityType = 'foobar';
142 
143  $mockSession = $this->createMock(Session::class);
144  $mockSession->expects(self::once())->method('hasIdentifier')->with(
145  $fakeUuid,
146  $fakeEntityType
147  )->willReturn(false);
148 
149  $mockBackend = $this->createMock(BackendInterface::class);
150  $mockBackend->expects(self::once())->method('getObjectByIdentifier')->with(
151  $fakeUuid,
152  $fakeEntityType
153  )->willReturn(null);
154 
155  $manager = new ‪PersistenceManager(
156  $this->createMock(QueryFactoryInterface::class),
157  $mockBackend,
158  $mockSession
159  );
160 
161  self::assertNull($manager->getObjectByIdentifier($fakeUuid, $fakeEntityType));
162  }
163 
164  #[Test]
166  {
167  $someObject = new \stdClass();
168  $backend = $this->createMock(BackendInterface::class);
169  $persistenceManager = new ‪PersistenceManager(
170  $this->createMock(QueryFactoryInterface::class),
171  $backend,
172  $this->createMock(Session::class)
173  );
174  $persistenceManager->add($someObject);
175 
176  $expectedAddedObjects = new ‪ObjectStorage();
177  $expectedAddedObjects->attach($someObject);
178 
179  // this is the actual assertion
180  $backend->expects(self::atLeastOnce())->method('setAggregateRootObjects')->with($expectedAddedObjects);
181 
182  $backend->expects(self::atLeastOnce())->method('setChangedEntities')->with(self::anything());
183  $backend->expects(self::atLeastOnce())->method('setDeletedEntities')->with(self::anything());
184  $backend->expects(self::atLeastOnce())->method('commit');
185  $persistenceManager->persistAll();
186  }
187 
188  #[Test]
190  {
191  $object1 = new \stdClass();
192  $object2 = new \stdClass();
193  $object3 = new \stdClass();
194 
195  $backend = $this->createMock(BackendInterface::class);
196  $persistenceManager = new ‪PersistenceManager(
197  $this->createMock(QueryFactoryInterface::class),
198  $backend,
199  $this->createMock(Session::class)
200  );
201  $persistenceManager->add($object1);
202  $persistenceManager->add($object2);
203  $persistenceManager->add($object3);
204 
205  $persistenceManager->remove($object2);
206 
207  $expectedAddedObjects = new ‪ObjectStorage();
208  $expectedAddedObjects->attach($object1);
209  $expectedAddedObjects->attach($object2);
210  $expectedAddedObjects->attach($object3);
211  $expectedAddedObjects->detach($object2);
212 
213  // this is the actual assertion
214  $backend->expects(self::atLeastOnce())->method('setAggregateRootObjects')->with($expectedAddedObjects);
215 
216  $backend->expects(self::atLeastOnce())->method('setChangedEntities')->with(self::anything());
217  $backend->expects(self::atLeastOnce())->method('setDeletedEntities')->with(self::anything());
218  $backend->expects(self::atLeastOnce())->method('commit');
219 
220  $persistenceManager->persistAll();
221  }
222 
223  #[Test]
225  {
226  $object1 = new \ArrayObject(['val' => '1']);
227  $object2 = new \ArrayObject(['val' => '2']);
228  $object3 = new \ArrayObject(['val' => '3']);
229 
230  $backend = $this->createMock(BackendInterface::class);
231  $persistenceManager = new ‪PersistenceManager(
232  $this->createMock(QueryFactoryInterface::class),
233  $backend,
234  $this->createMock(Session::class)
235  );
236  $persistenceManager->add($object1);
237  $persistenceManager->add($object2);
238  $persistenceManager->add($object3);
239 
240  $object2['foo'] = 'bar';
241  $object3['val'] = '2';
242 
243  $persistenceManager->remove($object2);
244 
245  // replay the actual sequence of actions, that makes the objectStorages comparable
246  $expectedAddedObjects = new ‪ObjectStorage();
247  $expectedAddedObjects->attach($object1);
248  $expectedAddedObjects->attach($object2);
249  $expectedAddedObjects->attach($object3);
250  $expectedAddedObjects->detach($object2);
251 
252  // this is the actual assertion
253  $backend->expects(self::atLeastOnce())->method('setAggregateRootObjects')->with($expectedAddedObjects);
254 
255  $backend->expects(self::atLeastOnce())->method('setChangedEntities')->with(self::anything());
256  $backend->expects(self::atLeastOnce())->method('setDeletedEntities')->with(self::anything());
257  $backend->expects(self::atLeastOnce())->method('commit');
258  $persistenceManager->persistAll();
259  }
260 
265  #[Test]
267  {
268  $object = new \ArrayObject(['val' => '1']);
269  $backend = $this->createMock(BackendInterface::class);
270  $persistenceManager = new ‪PersistenceManager(
271  $this->createMock(QueryFactoryInterface::class),
272  $backend,
273  $this->createMock(Session::class)
274  );
275  $persistenceManager->remove($object);
276 
277  $expectedDeletedObjects = new ‪ObjectStorage();
278  $expectedDeletedObjects->attach($object);
279  $backend->expects(self::atLeastOnce())->method('setAggregateRootObjects');
280  $backend->expects(self::atLeastOnce())->method('setChangedEntities')->with(self::anything());
281 
282  // this is the actual assertion
283  $backend->expects(self::atLeastOnce())->method('setDeletedEntities')->with($expectedDeletedObjects);
284 
285  $backend->expects(self::atLeastOnce())->method('commit');
286  $persistenceManager->persistAll();
287  }
288 
289  #[Test]
291  {
292  $className = ‪StringUtility::getUniqueId('BazFixture');
293  eval('
294  namespace ' . __NAMESPACE__ . '\\Domain\\Model;
295  class ' . $className . ' extends \\' . AbstractEntity::class . ' {
296  protected ?int $uid = 42;
297  }
298  ');
299  eval('
300  namespace ' . __NAMESPACE__ . '\\Domain\\Repository;
301  class ' . $className . 'Repository extends \\TYPO3\\CMS\\Extbase\\Persistence\\Repository {}
302  ');
303  $classNameWithNamespace = __NAMESPACE__ . '\\Domain\\Model\\' . $className;
305  $repositoryClassNameWithNamespace = __NAMESPACE__ . '\\Domain\\Repository\\' . $className . 'Repository';
306 
307  $psrContainer = $this->getMockBuilder(ContainerInterface::class)
308  ->onlyMethods(['has', 'get'])
309  ->disableOriginalConstructor()
310  ->getMock();
311  $psrContainer->method('has')->willReturn(false);
312  $session = new ‪Session();
313  $changedEntities = new ‪ObjectStorage();
314  $entity1 = new $classNameWithNamespace();
315 
316  $repository = $this->getAccessibleMock($repositoryClassNameWithNamespace, null);
317  $repository->_set('objectType', get_class($entity1));
318 
319  $mockBackend = $this->getMockBuilder(Backend::class)
320  ->onlyMethods(['commit', 'setChangedEntities'])
321  ->disableOriginalConstructor()
322  ->getMock();
323  $mockBackend->expects(self::once())
324  ->method('setChangedEntities')
325  ->with(self::equalTo($changedEntities));
326 
327  $persistenceManager = new ‪PersistenceManager(
328  $this->createMock(QueryFactoryInterface::class),
329  $mockBackend,
330  $session
331  );
332 
333  $repository->_set('persistenceManager', $persistenceManager);
334  $session->registerObject($entity1, '42');
335  $changedEntities->attach($entity1);
336  $repository->update($entity1);
337  $persistenceManager->persistAll();
338  }
339 
340  #[Test]
342  {
343  $mockBackend = $this->createMock(TearDownableBackendInterface::class);
344  $mockBackend->expects(self::once())->method('tearDown');
345  $persistenceManager = new ‪PersistenceManager(
346  $this->createMock(QueryFactoryInterface::class),
347  $mockBackend,
348  $this->createMock(Session::class)
349  );
350  $persistenceManager->tearDown();
351  }
352 
353  #[Test]
355  {
356  $className = ‪StringUtility::getUniqueId('BazFixture');
357  eval('
358  namespace ' . __NAMESPACE__ . '\\Domain\\Model;
359  class ' . $className . ' extends \\' . AbstractEntity::class . ' {}
360  ');
361  eval('
362  namespace ' . __NAMESPACE__ . '\\Domain\\Repository;
363  class ' . $className . 'Repository {}
364  ');
365  $aggregateRootObjects = new ‪ObjectStorage();
366  $classNameWithNamespace = __NAMESPACE__ . '\\Domain\\Model\\' . $className;
367  $entity1 = new $classNameWithNamespace();
368  $aggregateRootObjects->attach($entity1);
369 
370  $mockBackend = $this->getMockBuilder(Backend::class)
371  ->onlyMethods(['commit', 'setAggregateRootObjects', 'setDeletedEntities'])
372  ->disableOriginalConstructor()
373  ->getMock();
374  $mockBackend->expects(self::once())
375  ->method('setAggregateRootObjects')
376  ->with(self::equalTo($aggregateRootObjects));
377 
378  $persistenceManager = new ‪PersistenceManager(
379  $this->createMock(QueryFactoryInterface::class),
380  $mockBackend,
381  $this->createMock(Session::class)
382  );
383 
384  $persistenceManager->add($entity1);
385  $persistenceManager->persistAll();
386  }
387 }
‪TYPO3\CMS\Extbase\Persistence\Generic\Backend
Definition: Backend.php:53
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Fixture\Model\Entity2
Definition: Entity2.php:26
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\getObjectByIdentifierReturnsNullForUnknownObject
‪getObjectByIdentifierReturnsNullForUnknownObject()
Definition: PersistenceManagerTest.php:138
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\removeActuallyRemovesAnObjectFromTheInternalObjectsArray
‪removeActuallyRemovesAnObjectFromTheInternalObjectsArray()
Definition: PersistenceManagerTest.php:189
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest
Definition: PersistenceManagerTest.php:36
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\getIdentifierByObjectReturnsIdentifierFromBackend
‪getIdentifierByObjectReturnsIdentifierFromBackend()
Definition: PersistenceManagerTest.php:76
‪TYPO3\CMS\Extbase\DomainObject\AbstractEntity
Definition: AbstractEntity.php:22
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\getObjectByIdentifierReturnsObjectFromPersistenceIfAvailable
‪getObjectByIdentifierReturnsObjectFromPersistenceIfAvailable()
Definition: PersistenceManagerTest.php:113
‪TYPO3\CMS\Extbase\Persistence\ObjectStorage
Definition: ObjectStorage.php:34
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\removeRemovesTheRightObjectEvenIfItHasBeenModifiedSinceItsAddition
‪removeRemovesTheRightObjectEvenIfItHasBeenModifiedSinceItsAddition()
Definition: PersistenceManagerTest.php:224
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\addActuallyAddsAnObjectToTheInternalObjectsArray
‪addActuallyAddsAnObjectToTheInternalObjectsArray()
Definition: PersistenceManagerTest.php:165
‪TYPO3\CMS\Extbase\Persistence\RepositoryInterface
Definition: RepositoryInterface.php:25
‪TYPO3\CMS\Extbase\Persistence\Generic\BackendInterface
Definition: BackendInterface.php:26
‪TYPO3\CMS\Extbase\Persistence\Generic\QueryFactoryInterface
Definition: QueryFactoryInterface.php:22
‪TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
Definition: PersistenceManager.php:30
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\persistAllAddsNamespacedReconstitutedObjectFromSessionToBackendsAggregateRootObjects
‪persistAllAddsNamespacedReconstitutedObjectFromSessionToBackendsAggregateRootObjects()
Definition: PersistenceManagerTest.php:354
‪TYPO3\CMS\Extbase\Persistence\Generic\Session
Definition: Session.php:27
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\Fixtures\TearDownableBackendInterface
Definition: TearDownableBackendInterface.php:21
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic
Definition: BackendTest.php:18
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\updateSchedulesAnObjectForPersistence
‪updateSchedulesAnObjectForPersistence()
Definition: PersistenceManagerTest.php:290
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\removeRetainsObjectForObjectsNotInCurrentSession
‪removeRetainsObjectForObjectsNotInCurrentSession()
Definition: PersistenceManagerTest.php:266
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\tearDownWithBackendSupportingTearDownDelegatesCallToBackend
‪tearDownWithBackendSupportingTearDownDelegatesCallToBackend()
Definition: PersistenceManagerTest.php:341
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\persistAllPassesRemovedObjectsToBackend
‪persistAllPassesRemovedObjectsToBackend()
Definition: PersistenceManagerTest.php:57
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\persistAllPassesAddedObjectsToBackend
‪persistAllPassesAddedObjectsToBackend()
Definition: PersistenceManagerTest.php:38
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Generic\PersistenceManagerTest\getObjectByIdentifierReturnsObjectFromSessionIfAvailable
‪getObjectByIdentifierReturnsObjectFromSessionIfAvailable()
Definition: PersistenceManagerTest.php:94