‪TYPO3CMS  ‪main
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\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
22 use PHPUnit\Framework\MockObject\MockObject;
23 use Psr\EventDispatcher\EventDispatcherInterface;
33 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
34 
35 final class ‪MetaDataAspectTest extends UnitTestCase
36 {
37  protected bool ‪$resetSingletonInstances = true;
38  protected ‪ResourceStorage&MockObject ‪$storageMock;
39 
40  protected function ‪setUp(): void
41  {
42  parent::setUp();
43  $metaDataRepository = new ‪MetaDataRepository(new ‪NoopEventDispatcher());
44  GeneralUtility::setSingletonInstance(MetaDataRepository::class, $metaDataRepository);
45  $this->storageMock = $this->createMock(ResourceStorage::class);
46  $this->storageMock->method('getUid')->willReturn(12);
47  }
48 
49  protected function ‪tearDown(): void
50  {
51  GeneralUtility::purgeInstances();
52  parent::tearDown();
53  }
54 
55  #[Test]
56  public function ‪knownMetaDataIsAdded(): void
57  {
58  $metaData = [
59  'width' => 4711,
60  'title' => 'Lorem ipsum meta sit amet',
61  ];
62  $file = new ‪File([], $this->storageMock, $metaData);
63 
64  self::assertSame($metaData, $file->getMetaData()->get());
65  }
66 
67  #[Test]
68  public function ‪manuallyAddedMetaDataIsMerged(): void
69  {
70  $metaData = [
71  'width' => 4711,
72  'title' => 'Lorem ipsum meta sit amet',
73  ];
74  $file = new ‪File([], $this->storageMock, $metaData);
75  $file->getMetaData()->add([
76  'height' => 900,
77  'description' => 'This file is presented by TYPO3',
78  ]);
79 
80  $expected = [
81  'width' => 4711,
82  'title' => 'Lorem ipsum meta sit amet',
83  'height' => 900,
84  'description' => 'This file is presented by TYPO3',
85  ];
86 
87  self::assertSame($expected, $file->getMetaData()->get());
88  }
89 
90  #[Test]
91  public function ‪metaDataGetsRemoved(): void
92  {
93  $metaData = ['foo' => 'bar'];
94 
95  $file = new ‪File(['uid' => 12], $this->storageMock);
96 
97  $metaDataAspectMock = $this->getMockBuilder(MetaDataAspect::class)
98  ->setConstructorArgs([$file])
99  ->onlyMethods(['getMetaDataRepository'])
100  ->getMock();
101 
102  $metaDataAspectMock->add($metaData);
103  $metaDataAspectMock->remove();
104 
105  self::assertEmpty($metaDataAspectMock->get());
106  }
107 
108  #[Test]
110  {
111  $this->expectException(InvalidUidException::class);
112  $this->expectExceptionCode(1381590731);
113 
114  $file = new ‪File(['uid' => -3], $this->storageMock);
115  $file->getMetaData()->get();
116  }
117 
118  #[Test]
119  public function ‪newMetaDataIsCreated(): void
120  {
121  ‪$GLOBALS['EXEC_TIME'] = 1534530781;
122  $metaData = [
123  'title' => 'Hooray',
124  // This value is ignored on purpose, we simulate the non-existence of the field "description"
125  'description' => 'Yipp yipp yipp',
126  ];
127 
128  $file = new ‪File(['uid' => 12], $this->storageMock);
129 
130  $connectionMock = $this->createMock(Connection::class);
131  $connectionMock->method('insert')->with(self::anything())->willReturn(1);
132  $connectionMock->method('lastInsertId')->willReturn('5');
133  $connectionPoolMock = $this->createMock(ConnectionPool::class);
134  $connectionPoolMock->method('getConnectionForTable')->with(self::anything())->willReturn($connectionMock);
135  GeneralUtility::addInstance(ConnectionPool::class, $connectionPoolMock);
136 
137  $metaDataRepositoryMock = $this->getMockBuilder(MetaDataRepository::class)
138  ->onlyMethods(['findByFileUid', 'getTableFields', 'update'])
139  ->setConstructorArgs([new ‪NoopEventDispatcher()])
140  ->getMock();
141  $metaDataRepositoryMock->method('findByFileUid')->willReturn([]);
142  $metaDataRepositoryMock->method('getTableFields')->willReturn(['title' => 'sometype']);
143  $metaDataRepositoryMock->expects(self::never())->method('update');
144  GeneralUtility::setSingletonInstance(MetaDataRepository::class, $metaDataRepositoryMock);
145 
146  $file->getMetaData()->add($metaData)->save();
147 
148  $expected = [
149  'file' => $file->getUid(),
150  'pid' => 0,
151  'crdate' => 1534530781,
152  'tstamp' => 1534530781,
153  'l10n_diffsource' => '',
154  'title' => 'Hooray',
155  'uid' => '5',
156  ];
157 
158  self::assertSame($expected, $file->getMetaData()->get());
159  }
160 
161  #[Test]
162  public function ‪existingMetaDataGetsUpdated(): void
163  {
164  $metaData = ['uid' => 12, 'foo' => 'bar'];
165  $updatedMetadata = array_merge($metaData, ['testproperty' => 'testvalue']);
166 
167  $file = new ‪File(['uid' => 12], $this->storageMock);
168 
169  $eventDispatcherMock = $this->getMockBuilder(EventDispatcherInterface::class)->getMock();
170  $eventDispatcherMock->expects(self::atLeastOnce())->method('dispatch')->with(self::anything())->willReturnArgument(0);
171 
172  $metaDataRepositoryMock = $this->getMockBuilder(MetaDataRepository::class)
173  ->onlyMethods(['createMetaDataRecord', 'getTableFields'])
174  ->setConstructorArgs([$eventDispatcherMock])
175  ->getMock();
176 
177  $connectionMock = $this->createMock(Connection::class);
178  $connectionMock->method('update')->with('sys_file_metadata', self::anything())->willReturn(1);
179  $connectionPoolMock = $this->createMock(ConnectionPool::class);
180  $connectionPoolMock->method('getConnectionForTable')->with(self::anything())->willReturn($connectionMock);
181  GeneralUtility::addInstance(ConnectionPool::class, $connectionPoolMock);
182 
183  $metaDataRepositoryMock->method('createMetaDataRecord')->willReturn($metaData);
184  $metaDataRepositoryMock->method('getTableFields')->willReturn(array_flip(['foo', 'testproperty']));
185  GeneralUtility::setSingletonInstance(MetaDataRepository::class, $metaDataRepositoryMock);
186 
187  $metaDataAspectMock = $this->getMockBuilder(MetaDataAspect::class)
188  ->setConstructorArgs([$file])
189  ->onlyMethods(['loadFromRepository'])
190  ->getMock();
191 
192  $metaDataAspectMock->method('loadFromRepository')->willReturn([], $metaData, $updatedMetadata);
193  $metaDataAspectMock->add($metaData)->save();
194  $metaDataAspectMock->add(['testproperty' => 'testvalue'])->save();
195 
196  self::assertSame('bar', $metaDataAspectMock->offsetGet('foo'));
197  self::assertSame('testvalue', $metaDataAspectMock->offsetGet('testproperty'));
198 
199  $metaDataAspectMock->add($updatedMetadata)->save();
200  self::assertFalse($metaDataAspectMock->offsetExists('tstamp'));
201  }
202 
203  public static function ‪propertyDataProvider(): array
204  {
205  return [
206  [
207  [
208  'width' => 4711,
209  'title' => 'Lorem ipsum meta sit amet',
210  ],
211  [
212  'property' => 'width',
213  'expected' => true,
214  ],
215  [
216  'property' => 'width',
217  'expected' => 4711,
218  ],
219  ],
220  [
221  [
222  'foo' => 'bar',
223  ],
224  [
225  'property' => 'husel',
226  'expected' => false,
227  ],
228  [
229  'property' => 'husel',
230  'expected' => null,
231  ],
232  ],
233  ];
234  }
235 
236  #[DataProvider('propertyDataProvider')]
237  #[Test]
238  public function ‪propertyIsFetchedProperly(array $metaData, array $has, array $get): void
239  {
240  $file = new ‪File([], $this->storageMock, $metaData);
241 
242  self::assertSame($has['expected'], isset($file->getMetaData()[$has['property']]));
243  self::assertSame($get['expected'], $file->getMetaData()[$get['property']] ?? null);
244  }
245 }
‪TYPO3\CMS\Core\Resource\Index\MetaDataRepository
Definition: MetaDataRepository.php:40
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\manuallyAddedMetaDataIsMerged
‪manuallyAddedMetaDataIsMerged()
Definition: MetaDataAspectTest.php:68
‪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\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: MetaDataAspectTest.php:37
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\existingMetaDataGetsUpdated
‪existingMetaDataGetsUpdated()
Definition: MetaDataAspectTest.php:162
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:26
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\knownMetaDataIsAdded
‪knownMetaDataIsAdded()
Definition: MetaDataAspectTest.php:56
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\metaDataGetsRemoved
‪metaDataGetsRemoved()
Definition: MetaDataAspectTest.php:91
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\propertyIsFetchedProperly
‪propertyIsFetchedProperly(array $metaData, array $has, array $get)
Definition: MetaDataAspectTest.php:238
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Core\Resource\ResourceStorage
Definition: ResourceStorage.php:129
‪TYPO3\CMS\Core\EventDispatcher\NoopEventDispatcher
Definition: NoopEventDispatcher.php:29
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest
Definition: MetaDataAspectTest.php:36
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\newMetaDataIsCreated
‪newMetaDataIsCreated()
Definition: MetaDataAspectTest.php:119
‪$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:109
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\setUp
‪setUp()
Definition: MetaDataAspectTest.php:40
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\tearDown
‪tearDown()
Definition: MetaDataAspectTest.php:49
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\propertyDataProvider
‪static propertyDataProvider()
Definition: MetaDataAspectTest.php:203
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Tests\Unit\Resource\MetaDataAspectTest\$storageMock
‪ResourceStorage &MockObject $storageMock
Definition: MetaDataAspectTest.php:38