‪TYPO3CMS  11.5
MetaDataAspectTest.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\MockObject\MockObject;
21 use Prophecy\Argument;
22 use Prophecy\PhpUnit\ProphecyTrait;
23 use Psr\EventDispatcher\EventDispatcherInterface;
32 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
33 
37 class ‪MetaDataAspectTest extends UnitTestCase
38 {
39  use ProphecyTrait;
40 
44  protected ‪$storageMock;
45 
49  protected function ‪setUp(): void
50  {
51  parent::setUp();
52  $eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
53  $eventDispatcher->dispatch(Argument::cetera())->willReturnArgument(0);
54  $metaDataRepository = new ‪MetaDataRepository($eventDispatcher->reveal());
55  GeneralUtility::setSingletonInstance(MetaDataRepository::class, $metaDataRepository);
56  $this->storageMock = $this->createMock(ResourceStorage::class);
57  $this->storageMock->method('getUid')->willReturn(12);
58  }
59 
63  protected function ‪tearDown(): void
64  {
65  $this->resetSingletonInstances = true;
66 
67  GeneralUtility::purgeInstances();
68  parent::tearDown();
69  }
70 
74  public function ‪knownMetaDataIsAdded(): void
75  {
76  $metaData = [
77  'width' => 4711,
78  'title' => 'Lorem ipsum meta sit amet',
79  ];
80  $file = new ‪File([], $this->storageMock, $metaData);
81 
82  self::assertSame($metaData, $file->getMetaData()->get());
83  }
84 
88  public function ‪manuallyAddedMetaDataIsMerged(): void
89  {
90  $metaData = [
91  'width' => 4711,
92  'title' => 'Lorem ipsum meta sit amet',
93  ];
94  $file = new ‪File([], $this->storageMock, $metaData);
95  $file->getMetaData()->add([
96  'height' => 900,
97  'description' => 'This file is presented by TYPO3',
98  ]);
99 
100  $expected = [
101  'width' => 4711,
102  'title' => 'Lorem ipsum meta sit amet',
103  'height' => 900,
104  'description' => 'This file is presented by TYPO3',
105  ];
106 
107  self::assertSame($expected, $file->getMetaData()->get());
108  }
109 
113  public function ‪metaDataGetsRemoved(): void
114  {
115  $metaData = ['foo' => 'bar'];
116 
117  $file = new ‪File(['uid' => 12], $this->storageMock);
118 
119  $metaDataAspectMock = $this->getMockBuilder(MetaDataAspect::class)
120  ->setConstructorArgs([$file])
121  ->onlyMethods(['getMetaDataRepository'])
122  ->getMock();
123 
124  $metaDataAspectMock->add($metaData);
125  $metaDataAspectMock->remove();
126 
127  self::assertEmpty($metaDataAspectMock->get());
128  }
129 
133  public function ‪positiveUidOfFileIsExpectedToLoadMetaData(): void
134  {
135  $this->expectException(InvalidUidException::class);
136  $this->expectExceptionCode(1381590731);
137 
138  $file = new ‪File(['uid' => -3], $this->storageMock);
139  $file->getMetaData()->get();
140  }
141 
145  public function ‪newMetaDataIsCreated(): void
146  {
147  ‪$GLOBALS['EXEC_TIME'] = 1534530781;
148  $metaData = [
149  'title' => 'Hooray',
150  // This value is ignored on purpose, we simulate the non-existence of the field "description"
151  'description' => 'Yipp yipp yipp',
152  ];
153 
154  $file = new ‪File(['uid' => 12], $this->storageMock);
155 
156  $connectionProphecy = $this->prophesize(Connection::class);
157  $connectionProphecy->insert(Argument::cetera())->willReturn(1);
158  $connectionProphecy->lastInsertId(Argument::cetera())->willReturn(5);
159  $connectionPoolProphecy = $this->prophesize(ConnectionPool::class);
160  $connectionPoolProphecy->getConnectionForTable(Argument::cetera())->willReturn($connectionProphecy->reveal());
161  GeneralUtility::addInstance(ConnectionPool::class, $connectionPoolProphecy->reveal());
162 
163  $eventDispatcher = $this->prophesize(EventDispatcherInterface::class);
164  $eventDispatcher->dispatch(Argument::cetera())->willReturnArgument(0);
165  $metaDataRepositoryMock = $this->getMockBuilder(MetaDataRepository::class)
166  ->onlyMethods(['findByFileUid', 'getTableFields', 'update'])
167  ->setConstructorArgs([$eventDispatcher->reveal()])
168  ->getMock();
169  $metaDataRepositoryMock->method('findByFileUid')->willReturn([]);
170  $metaDataRepositoryMock->method('getTableFields')->willReturn(['title' => 'sometype']);
171  $metaDataRepositoryMock->expects(self::never())->method('update');
172  GeneralUtility::setSingletonInstance(MetaDataRepository::class, $metaDataRepositoryMock);
173 
174  $file->getMetaData()->add($metaData)->save();
175 
176  $expected = [
177  'file' => $file->getUid(),
178  'pid' => 0,
179  'crdate' => 1534530781,
180  'tstamp' => 1534530781,
181  'cruser_id' => 0,
182  'l10n_diffsource' => '',
183  'title' => 'Hooray',
184  'uid' => '5',
185  ];
186 
187  self::assertSame($expected, $file->getMetaData()->get());
188  }
189 
193  public function ‪existingMetaDataGetsUpdated(): void
194  {
195  $metaData = ['foo' => 'bar'];
196 
197  $file = new ‪File(['uid' => 12], $this->storageMock);
198 
199  $metaDataRepositoryMock = $this->getMockBuilder(MetaDataRepository::class)
200  ->onlyMethods(['createMetaDataRecord', 'update'])
201  ->addMethods(['loadFromRepository'])
202  ->disableOriginalConstructor()
203  ->getMock();
204 
205  $metaDataRepositoryMock->method('createMetaDataRecord')->willReturn($metaData);
206  GeneralUtility::setSingletonInstance(MetaDataRepository::class, $metaDataRepositoryMock);
207 
208  $metaDataAspectMock = $this->getMockBuilder(MetaDataAspect::class)
209  ->setConstructorArgs([$file])
210  ->onlyMethods(['loadFromRepository'])
211  ->getMock();
212 
213  $metaDataAspectMock->method('loadFromRepository')->will(self::onConsecutiveCalls([], $metaData));
214  $metaDataAspectMock->add($metaData)->save();
215  $metaDataAspectMock->add(['testproperty' => 'testvalue'])->save();
216 
217  self::assertSame(['foo' => 'bar', 'testproperty' => 'testvalue'], $metaDataAspectMock->get());
218  }
219 
223  public function ‪propertyDataProvider(): array
224  {
225  return [
226  [
227  [
228  'width' => 4711,
229  'title' => 'Lorem ipsum meta sit amet',
230  ],
231  [
232  'property' => 'width',
233  'expected' => true,
234  ],
235  [
236  'property' => 'width',
237  'expected' => 4711,
238  ],
239  ],
240  [
241  [
242  'foo' => 'bar',
243  ],
244  [
245  'property' => 'husel',
246  'expected' => false,
247  ],
248  [
249  'property' => 'husel',
250  'expected' => null,
251  ],
252  ],
253  ];
254  }
255 
260  public function ‪propertyIsFetchedProperly(array $metaData, array $has, array $get): void
261  {
262  $file = new ‪File([], $this->storageMock, $metaData);
263 
264  self::assertSame($has['expected'], isset($file->getMetaData()[$has['property']]));
265  self::assertSame($get['expected'], $file->getMetaData()[$get['property']] ?? null);
266  }
267 }
‪TYPO3\CMS\Core\Resource\Index\MetaDataRepository
Definition: MetaDataRepository.php:41
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\manuallyAddedMetaDataIsMerged
‪manuallyAddedMetaDataIsMerged()
Definition: MetaDataAspectTest.php:86
‪TYPO3\CMS\Core\Tests\Unit\Resource
Definition: AbstractFileTest.php:18
‪TYPO3\CMS\Core\Resource\Exception\InvalidUidException
Definition: InvalidUidException.php:23
‪TYPO3\CMS\Core\Resource\MetaDataAspect
Definition: MetaDataAspect.php:27
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\existingMetaDataGetsUpdated
‪existingMetaDataGetsUpdated()
Definition: MetaDataAspectTest.php:191
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:24
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\knownMetaDataIsAdded
‪knownMetaDataIsAdded()
Definition: MetaDataAspectTest.php:72
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\propertyDataProvider
‪array propertyDataProvider()
Definition: MetaDataAspectTest.php:221
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\metaDataGetsRemoved
‪metaDataGetsRemoved()
Definition: MetaDataAspectTest.php:111
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\propertyIsFetchedProperly
‪propertyIsFetchedProperly(array $metaData, array $has, array $get)
Definition: MetaDataAspectTest.php:258
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:38
‪TYPO3\CMS\Core\Resource\ResourceStorage
Definition: ResourceStorage.php:125
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest
Definition: MetaDataAspectTest.php:38
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\newMetaDataIsCreated
‪newMetaDataIsCreated()
Definition: MetaDataAspectTest.php:143
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\positiveUidOfFileIsExpectedToLoadMetaData
‪positiveUidOfFileIsExpectedToLoadMetaData()
Definition: MetaDataAspectTest.php:131
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\setUp
‪setUp()
Definition: MetaDataAspectTest.php:47
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\tearDown
‪tearDown()
Definition: MetaDataAspectTest.php:61
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\$storageMock
‪ResourceStorage MockObject $storageMock
Definition: MetaDataAspectTest.php:42