‪TYPO3CMS  ‪main
RepositoryTest.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 PHPUnit\Framework\MockObject\MockObject;
39 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
40 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
41 
42 final class ‪RepositoryTest extends UnitTestCase
43 {
44  protected ‪Repository&MockObject&AccessibleObjectInterface ‪$repository;
45 
49  protected ‪$mockQueryFactory;
50 
54  protected ‪$mockBackend;
55 
59  protected ‪$mockSession;
60 
65 
69  protected ‪$mockQuery;
70 
75 
80 
81  protected function ‪setUp(): void
82  {
83  parent::setUp();
84  $this->mockQueryFactory = $this->createMock(QueryFactory::class);
85  $this->mockQuery = $this->createMock(QueryInterface::class);
86  $this->mockQuerySettings = $this->createMock(QuerySettingsInterface::class);
87  $this->mockQuery->method('getQuerySettings')->willReturn($this->mockQuerySettings);
88  $this->mockQueryFactory->method('create')->willReturn($this->mockQuery);
89  $this->mockSession = $this->createMock(Session::class);
90  $this->mockConfigurationManager = $this->createMock(ConfigurationManager::class);
91  $this->mockBackend = $this->getAccessibleMock(Backend::class, null, [$this->mockConfigurationManager], '', false);
92  $this->mockBackend->_set('session', $this->mockSession);
93  $this->mockPersistenceManager = $this->getAccessibleMock(
94  PersistenceManager::class,
95  ['createQueryForType'],
96  [
97  $this->mockQueryFactory,
98  $this->mockBackend,
99  $this->mockSession,
100  ]
101  );
102  $this->mockBackend->setPersistenceManager($this->mockPersistenceManager);
103  $this->mockPersistenceManager->method('createQueryForType')->willReturn($this->mockQuery);
104  $this->repository = $this->getAccessibleMock(Repository::class, null);
105  $this->repository->injectPersistenceManager($this->mockPersistenceManager);
106  }
107 
108  #[Test]
110  {
111  self::assertInstanceOf(RepositoryInterface::class, $this->repository);
112  }
113 
114  #[Test]
116  {
117  ‪$mockPersistenceManager = $this->createMock(PersistenceManager::class);
118  ‪$mockPersistenceManager->expects(self::once())->method('createQueryForType')->with('ExpectedType');
119 
120  $this->repository->_set('objectType', 'ExpectedType');
121  $this->repository->injectPersistenceManager(‪$mockPersistenceManager);
122 
123  $this->repository->createQuery();
124  }
125 
126  #[Test]
127  public function ‪createQuerySetsDefaultOrderingIfDefined(): void
128  {
129  $orderings = ['foo' => ‪QueryInterface::ORDER_ASCENDING];
130  ‪$mockQuery = $this->createMock(QueryInterface::class);
131  ‪$mockQuery->expects(self::once())->method('setOrderings')->with($orderings);
132  ‪$mockPersistenceManager = $this->createMock(PersistenceManager::class);
133  ‪$mockPersistenceManager->expects(self::exactly(2))->method('createQueryForType')->with('ExpectedType')->willReturn(‪$mockQuery);
134 
135  $this->repository->_set('objectType', 'ExpectedType');
136  $this->repository->injectPersistenceManager(‪$mockPersistenceManager);
137  $this->repository->setDefaultOrderings($orderings);
138  $this->repository->createQuery();
139 
140  $this->repository->setDefaultOrderings([]);
141  $this->repository->createQuery();
142  }
143 
144  #[Test]
146  {
147  $expectedResult = $this->createMock(QueryResultInterface::class);
148 
149  ‪$mockQuery = $this->createMock(QueryInterface::class);
150  ‪$mockQuery->expects(self::once())->method('execute')->with()->willReturn($expectedResult);
151 
152  ‪$repository = $this->getMockBuilder(Repository::class)
153  ->onlyMethods(['createQuery'])
154  ->getMock();
155  ‪$repository->expects(self::once())->method('createQuery')->willReturn(‪$mockQuery);
156 
157  self::assertSame($expectedResult, ‪$repository->‪findAll());
158  }
159 
160  #[Test]
162  {
163  ‪$identifier = '42';
164  $object = new \stdClass();
165 
166  $expectedResult = $this->createMock(QueryResultInterface::class);
167  $expectedResult->expects(self::once())->method('getFirst')->willReturn($object);
168 
169  $this->mockQuery->method('getQuerySettings')->willReturn($this->mockQuerySettings);
170  $this->mockQuery->expects(self::once())->method('matching')->willReturn($this->mockQuery);
171  $this->mockQuery->expects(self::once())->method('execute')->willReturn($expectedResult);
172 
173  // skip backend, as we want to test the backend
174  $this->mockSession->method('hasIdentifier')->willReturn(false);
175  self::assertSame($object, $this->repository->findByIdentifier(‪$identifier));
176  }
177 
178  #[Test]
179  public function ‪addDelegatesToPersistenceManager(): void
180  {
181  $object = new \stdClass();
182  ‪$mockPersistenceManager = $this->createMock(PersistenceManagerInterface::class);
183  ‪$mockPersistenceManager->expects(self::once())->method('add')->with($object);
184  $this->repository->injectPersistenceManager(‪$mockPersistenceManager);
185  $this->repository->_set('objectType', get_class($object));
186  $this->repository->‪add($object);
187  }
188 
189  #[Test]
190  public function ‪removeDelegatesToPersistenceManager(): void
191  {
192  $object = new \stdClass();
193  ‪$mockPersistenceManager = $this->createMock(PersistenceManagerInterface::class);
194  ‪$mockPersistenceManager->expects(self::once())->method('remove')->with($object);
195  $this->repository->injectPersistenceManager(‪$mockPersistenceManager);
196  $this->repository->_set('objectType', get_class($object));
197  $this->repository->‪remove($object);
198  }
199 
200  #[Test]
201  public function ‪updateDelegatesToPersistenceManager(): void
202  {
203  $object = new \stdClass();
204  ‪$mockPersistenceManager = $this->createMock(PersistenceManagerInterface::class);
205  ‪$mockPersistenceManager->expects(self::once())->method('update')->with($object);
206  $this->repository->injectPersistenceManager(‪$mockPersistenceManager);
207  $this->repository->_set('objectType', get_class($object));
208  $this->repository->‪update($object);
209  }
210 
211  #[Test]
213  {
214  $this->expectException(UnsupportedMethodException::class);
215  $this->expectExceptionCode(1233180480);
216  ‪$repository = $this->getMockBuilder(Repository::class)
217  ->onlyMethods(['createQuery'])
218  ->getMock();
219  ‪$repository->‪__call('foo', []);
220  }
221 
222  #[Test]
223  public function ‪addChecksObjectType(): void
224  {
225  $this->expectException(IllegalObjectTypeException::class);
226  $this->expectExceptionCode(1248363335);
227  $this->repository->_set('objectType', 'ExpectedObjectType');
228  $this->repository->add(new \stdClass());
229  }
230 
231  #[Test]
232  public function ‪removeChecksObjectType(): void
233  {
234  $this->expectException(IllegalObjectTypeException::class);
235  $this->expectExceptionCode(1248363336);
236  $this->repository->_set('objectType', 'ExpectedObjectType');
237  $this->repository->remove(new \stdClass());
238  }
239 
240  #[Test]
241  public function ‪updateChecksObjectType(): void
242  {
243  $this->expectException(IllegalObjectTypeException::class);
244  $this->expectExceptionCode(1249479625);
245  ‪$repository = $this->getAccessibleMock(Repository::class, null);
246  ‪$repository->_set('objectType', 'ExpectedObjectType');
247 
248  ‪$repository->‪update(new \stdClass());
249  }
250 
251  #[Test]
252  public function ‪constructSetsObjectTypeFromClassName(): void
253  {
255  $reflectionClass = new \ReflectionClass(‪$repository);
256  $reflectionProperty = $reflectionClass->getProperty('objectType');
257  $objectType = $reflectionProperty->getValue(‪$repository);
258 
259  self::assertEquals(Entity::class, $objectType);
260  }
261 
262  #[Test]
264  {
265  $this->mockQuery = $this->createMock(Query::class);
266  $mockDefaultQuerySettings = $this->createMock(QuerySettingsInterface::class);
267  $this->repository->setDefaultQuerySettings($mockDefaultQuerySettings);
268  $query = $this->repository->createQuery();
269  $instanceQuerySettings = $query->getQuerySettings();
270  self::assertEquals($mockDefaultQuerySettings, $instanceQuerySettings);
271  self::assertNotSame($mockDefaultQuerySettings, $instanceQuerySettings);
272  }
273 
274  #[Test]
276  {
277  $fakeUid = '123';
278  $object = new \stdClass();
279  ‪$repository = $this->getMockBuilder(Repository::class)
280  ->onlyMethods(['findByIdentifier'])
281  ->getMock();
282  $expectedResult = $object;
283  ‪$repository->expects(self::once())->method('findByIdentifier')->willReturn($object);
284  $actualResult = ‪$repository->‪findByUid($fakeUid);
285  self::assertSame($expectedResult, $actualResult);
286  }
287 
288  #[Test]
289  public function ‪updateRejectsObjectsOfWrongType(): void
290  {
291  $this->expectException(IllegalObjectTypeException::class);
292  $this->expectExceptionCode(1249479625);
293  $this->repository->_set('objectType', 'Foo');
294  $this->repository->update(new \stdClass());
295  }
296 }
‪TYPO3\CMS\Extbase\Persistence\Generic\Backend
Definition: Backend.php:53
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\removeDelegatesToPersistenceManager
‪removeDelegatesToPersistenceManager()
Definition: RepositoryTest.php:183
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\abstractRepositoryImplementsRepositoryInterface
‪abstractRepositoryImplementsRepositoryInterface()
Definition: RepositoryTest.php:102
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\removeChecksObjectType
‪removeChecksObjectType()
Definition: RepositoryTest.php:225
‪TYPO3\CMS\Extbase\Persistence\Generic\QueryFactory
Definition: QueryFactory.php:32
‪TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface
Definition: PersistenceManagerInterface.php:24
‪TYPO3\CMS\Extbase\Persistence\QueryInterface
Definition: QueryInterface.php:30
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\magicCallMethodTriggersAnErrorIfUnknownMethodsAreCalled
‪magicCallMethodTriggersAnErrorIfUnknownMethodsAreCalled()
Definition: RepositoryTest.php:205
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\$repository
‪Repository &MockObject &AccessibleObjectInterface $repository
Definition: RepositoryTest.php:44
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\updateChecksObjectType
‪updateChecksObjectType()
Definition: RepositoryTest.php:234
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\createQueryReturnsQueryWithUnmodifiedDefaultQuerySettings
‪createQueryReturnsQueryWithUnmodifiedDefaultQuerySettings()
Definition: RepositoryTest.php:256
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\$mockQueryFactory
‪QueryFactory $mockQueryFactory
Definition: RepositoryTest.php:48
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Fixture\Domain\Repository\EntityRepository
Definition: EntityRepository.php:22
‪TYPO3\CMS\Extbase\Persistence\Repository\findByUid
‪object null findByUid($uid)
Definition: Repository.php:149
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\$mockQuery
‪QueryInterface $mockQuery
Definition: RepositoryTest.php:64
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\$mockBackend
‪BackendInterface $mockBackend
Definition: RepositoryTest.php:52
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\findByUidReturnsResultOfGetObjectByIdentifierCall
‪findByUidReturnsResultOfGetObjectByIdentifierCall()
Definition: RepositoryTest.php:268
‪TYPO3\CMS\Extbase\Persistence\Generic\Exception\UnsupportedMethodException
Definition: UnsupportedMethodException.php:25
‪TYPO3\CMS\Extbase\Configuration\ConfigurationManager
Definition: ConfigurationManager.php:32
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\constructSetsObjectTypeFromClassName
‪constructSetsObjectTypeFromClassName()
Definition: RepositoryTest.php:245
‪TYPO3\CMS\Extbase\Persistence\QueryInterface\ORDER_ASCENDING
‪const ORDER_ASCENDING
Definition: QueryInterface.php:99
‪TYPO3\CMS\Extbase\Persistence\RepositoryInterface
Definition: RepositoryInterface.php:25
‪TYPO3\CMS\Extbase\Persistence\Generic\BackendInterface
Definition: BackendInterface.php:26
‪TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
Definition: PersistenceManager.php:30
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\$mockSession
‪Session $mockSession
Definition: RepositoryTest.php:56
‪TYPO3\CMS\Extbase\Persistence\Generic\Session
Definition: Session.php:27
‪TYPO3\CMS\Extbase\Persistence\Repository
Definition: Repository.php:30
‪TYPO3\CMS\Extbase\Persistence\QueryResultInterface
Definition: QueryResultInterface.php:26
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\setUp
‪setUp()
Definition: RepositoryTest.php:74
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\findAllCreatesQueryAndReturnsResultOfExecuteCall
‪findAllCreatesQueryAndReturnsResultOfExecuteCall()
Definition: RepositoryTest.php:138
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\updateRejectsObjectsOfWrongType
‪updateRejectsObjectsOfWrongType()
Definition: RepositoryTest.php:282
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\createQuerySetsDefaultOrderingIfDefined
‪createQuerySetsDefaultOrderingIfDefined()
Definition: RepositoryTest.php:120
‪TYPO3\CMS\Extbase\Persistence\Generic\QuerySettingsInterface
Definition: QuerySettingsInterface.php:26
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\addDelegatesToPersistenceManager
‪addDelegatesToPersistenceManager()
Definition: RepositoryTest.php:172
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\createQueryCallsPersistenceManagerWithExpectedClassName
‪createQueryCallsPersistenceManagerWithExpectedClassName()
Definition: RepositoryTest.php:108
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\$mockPersistenceManager
‪PersistenceManagerInterface $mockPersistenceManager
Definition: RepositoryTest.php:60
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\addChecksObjectType
‪addChecksObjectType()
Definition: RepositoryTest.php:216
‪TYPO3\CMS\Extbase\Persistence\Repository\__call
‪mixed __call($methodName, $arguments)
Definition: Repository.php:224
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\$mockConfigurationManager
‪ConfigurationManager $mockConfigurationManager
Definition: RepositoryTest.php:72
‪TYPO3\CMS\Extbase\Persistence\Repository\update
‪update($modifiedObject)
Definition: Repository.php:102
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence
Definition: ClassesConfigurationFactoryTest.php:18
‪TYPO3\CMS\Extbase\Persistence\Repository\findAll
‪QueryResultInterface array findAll()
Definition: Repository.php:116
‪TYPO3\CMS\Extbase\Persistence\Generic\Query
Definition: Query.php:41
‪TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface\add
‪add(object $object)
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\updateDelegatesToPersistenceManager
‪updateDelegatesToPersistenceManager()
Definition: RepositoryTest.php:194
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\$mockQuerySettings
‪QuerySettingsInterface $mockQuerySettings
Definition: RepositoryTest.php:68
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\Fixture\Domain\Model\Entity
Definition: Entity.php:22
‪TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface\update
‪update(object $object)
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest\findByIdentifierReturnsResultOfGetObjectByIdentifierCallFromBackend
‪findByIdentifierReturnsResultOfGetObjectByIdentifierCallFromBackend()
Definition: RepositoryTest.php:154
‪TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
Definition: IllegalObjectTypeException.php:25
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37
‪TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface\remove
‪remove(object $object)
‪TYPO3\CMS\Extbase\Tests\Unit\Persistence\RepositoryTest
Definition: RepositoryTest.php:43