‪TYPO3CMS  ‪main
ExtractorServiceTest.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;
28 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
29 
30 final class ‪ExtractorServiceTest extends UnitTestCase
31 {
32  #[Test]
34  {
35  $fileMock = $this->createMock(File::class);
36  $fileMock->method('getType')->willReturn(FileType::TEXT->value);
37 
38  $extractorMock = $this->createMock(ExtractorInterface::class);
39  $extractorMock->method('getFileTypeRestrictions')->willReturn([FileType::IMAGE->value]);
40 
41  $extractorService = new ‪ExtractorService();
42  $method = new \ReflectionMethod($extractorService, 'isFileTypeSupportedByExtractor');
43  $arguments = [
44  $fileMock,
45  $extractorMock,
46  ];
47 
48  $result = $method->invokeArgs($extractorService, $arguments);
49  self::assertFalse($result);
50  }
51 
52  #[Test]
54  {
55  $fileMock = $this->createMock(File::class);
56  $fileMock->method('getType')->willReturn(FileType::IMAGE->value);
57 
58  $extractorMock = $this->createMock(ExtractorInterface::class);
59  $extractorMock->method('getFileTypeRestrictions')->willReturn([FileType::IMAGE->value]);
60 
61  $extractorService = new ‪ExtractorService();
62  $method = new \ReflectionMethod($extractorService, 'isFileTypeSupportedByExtractor');
63  $arguments = [
64  $fileMock,
65  $extractorMock,
66  ];
67 
68  $result = $method->invokeArgs($extractorService, $arguments);
69  self::assertTrue($result);
70  }
71 
72  #[Test]
74  {
75  $fileMock = $this->createMock(File::class);
76  $fileMock->method('getType')->willReturn(FileType::TEXT->value);
77 
78  $extractorMock = $this->createMock(ExtractorInterface::class);
79  $extractorMock->method('getFileTypeRestrictions')->willReturn([]);
80 
81  $extractorService = new ‪ExtractorService();
82  $method = new \ReflectionMethod($extractorService, 'isFileTypeSupportedByExtractor');
83  $arguments = [
84  $fileMock,
85  $extractorMock,
86  ];
87 
88  $result = $method->invokeArgs($extractorService, $arguments);
89  self::assertTrue($result);
90  }
91 
92  #[Test]
94  {
95  $storageMock = $this->createMock(ResourceStorage::class);
96  $storageMock->method('getDriverType')->willReturn('Local');
97 
98  $subject = $this->getMockBuilder(ExtractorService::class)
99  ->onlyMethods(['getExtractorRegistry'])
100  ->getMock()
101  ;
102 
103  $fileMock = $this->createMock(File::class);
104  $fileMock->method('getUid')->willReturn(4711);
105  $fileMock->method('getType')->willReturn(FileType::IMAGE->value);
106  $fileMock->method('getStorage')->willReturn($storageMock);
107 
108  $extractorClass1 = md5('1');
109  $extractorObject1 = $this->getMockBuilder(ExtractorInterface::class)
110  ->setMockClassName($extractorClass1)
111  ->getMock();
112 
113  $extractorObject1->method('getPriority')->willReturn(10);
114  $extractorObject1->method('getExecutionPriority')->willReturn(10);
115  $extractorObject1->method('canProcess')->willReturn(true);
116  $extractorObject1->method('getFileTypeRestrictions')->willReturn([FileType::IMAGE->value]);
117  $extractorObject1->method('getDriverRestrictions')->willReturn([$storageMock->getDriverType()]);
118  $extractorObject1->method('extractMetaData')->with($fileMock)->willReturn([
119  'width' => 800,
120  'height' => 600,
121  ]);
122 
123  $extractorClass2 = md5('2');
124  $extractorObject2 = $this->getMockBuilder(ExtractorInterface::class)
125  ->setMockClassName($extractorClass2)
126  ->getMock();
127 
128  $extractorObject2->method('getPriority')->willReturn(20);
129  $extractorObject2->method('getExecutionPriority')->willReturn(20);
130  $extractorObject2->method('canProcess')->willReturn(true);
131  $extractorObject2->method('getFileTypeRestrictions')->willReturn([FileType::IMAGE->value]);
132  $extractorObject2->method('getDriverRestrictions')->willReturn([$storageMock->getDriverType()]);
133  $extractorObject2->method('extractMetaData')->with($fileMock)->willReturn([
134  'keywords' => 'typo3, cms',
135  ]);
136 
137  $extractorRegistryMock = $this->getMockBuilder(ExtractorRegistry::class)
138  ->onlyMethods(['createExtractorInstance'])
139  ->getMock();
140 
141  $extractorRegistryMock->method('createExtractorInstance')->willReturnMap(
142  [
143  [$extractorClass1, $extractorObject1],
144  [$extractorClass2, $extractorObject2],
145  ]
146  );
147  $extractorRegistryMock->registerExtractionService($extractorClass1);
148  $extractorRegistryMock->registerExtractionService($extractorClass2);
149 
150  $subject->method('getExtractorRegistry')->willReturn($extractorRegistryMock);
151 
152  self::assertSame(['width' => 800, 'height' => 600, 'keywords' => 'typo3, cms'], $subject->extractMetaData($fileMock));
153  }
154 
156  {
157  return [
158  'Second has higher data priority' => [
159  10,
160  10,
161  20,
162  10,
163  [
164  'foo' => 'second',
165  'bar' => 'first',
166  'baz' => 'second',
167  ],
168  ],
169  'Second has higher execution priority' => [
170  10,
171  10,
172  10,
173  20,
174  [
175  'foo' => 'first',
176  'baz' => 'second',
177  'bar' => 'first',
178  ],
179  ],
180  'Second has higher data and execution priority' => [
181  10,
182  10,
183  20,
184  20,
185  [
186  'foo' => 'second',
187  'bar' => 'first',
188  'baz' => 'second',
189  ],
190  ],
191  'Second has higher execution priority, but first higher data priority' => [
192  20,
193  10,
194  10,
195  20,
196  [
197  'foo' => 'first',
198  'baz' => 'second',
199  'bar' => 'first',
200  ],
201  ],
202  ];
203  }
204 
205  #[DataProvider('extractMetaDataComposesDataByAvailableExtractorsWithDifferentPrioritiesDataProvider')]
206  #[Test]
208  int $extractorOneDataPriority,
209  int $extractorOneExecutionPriority,
210  int $extractorTwoDataPriority,
211  int $extractorTwoExecutionPriority,
212  array $expectedMetaData
213  ): void {
214  $storageMock = $this->createMock(ResourceStorage::class);
215  $storageMock->method('getDriverType')->willReturn('Local');
216 
217  $subject = $this->getMockBuilder(ExtractorService::class)
218  ->onlyMethods(['getExtractorRegistry'])
219  ->getMock()
220  ;
221 
222  $fileMock = $this->createMock(File::class);
223  $fileMock->expects(self::any())->method('getUid')->willReturn(4711);
224  $fileMock->expects(self::any())->method('getType')->willReturn(FileType::IMAGE->value);
225  $fileMock->expects(self::any())->method('getStorage')->willReturn($storageMock);
226 
227  $extractorClass1 = md5('1');
228  $extractorObject1 = $this->getMockBuilder(ExtractorInterface::class)
229  ->setMockClassName($extractorClass1)
230  ->getMock();
231 
232  $extractorObject1->expects(self::any())->method('getPriority')->willReturn($extractorOneDataPriority);
233  $extractorObject1->expects(self::any())->method('getExecutionPriority')->willReturn($extractorOneExecutionPriority);
234  $extractorObject1->expects(self::any())->method('canProcess')->willReturn(true);
235  $extractorObject1->expects(self::any())->method('getFileTypeRestrictions')->willReturn([FileType::IMAGE->value]);
236  $extractorObject1->expects(self::any())->method('getDriverRestrictions')->willReturn([$storageMock->getDriverType()]);
237  $extractorObject1->expects(self::any())->method('extractMetaData')->with($fileMock)->willReturn([
238  'foo' => 'first',
239  'bar' => 'first',
240  ]);
241 
242  $extractorClass2 = md5('2');
243  $extractorObject2 = $this->getMockBuilder(ExtractorInterface::class)
244  ->setMockClassName($extractorClass2)
245  ->getMock();
246 
247  $extractorObject2->expects(self::any())->method('getPriority')->willReturn($extractorTwoDataPriority);
248  $extractorObject2->expects(self::any())->method('getExecutionPriority')->willReturn($extractorTwoExecutionPriority);
249  $extractorObject2->expects(self::any())->method('canProcess')->willReturn(true);
250  $extractorObject2->expects(self::any())->method('getFileTypeRestrictions')->willReturn([FileType::IMAGE->value]);
251  $extractorObject2->expects(self::any())->method('getDriverRestrictions')->willReturn([$storageMock->getDriverType()]);
252  $extractorObject2->expects(self::any())->method('extractMetaData')->with($fileMock)->willReturn([
253  'foo' => 'second',
254  'baz' => 'second',
255  ]);
256 
257  $extractorRegistryMock = $this->getMockBuilder(ExtractorRegistry::class)
258  ->onlyMethods(['createExtractorInstance'])
259  ->getMock();
260 
261  $extractorRegistryMock->expects(self::any())->method('createExtractorInstance')->willReturnMap(
262  [
263  [$extractorClass1, $extractorObject1],
264  [$extractorClass2, $extractorObject2],
265  ]
266  );
267  $extractorRegistryMock->registerExtractionService($extractorClass1);
268  $extractorRegistryMock->registerExtractionService($extractorClass2);
269 
270  $subject->expects(self::any())->method('getExtractorRegistry')->willReturn($extractorRegistryMock);
271 
272  self::assertSame($expectedMetaData, $subject->extractMetaData($fileMock));
273  }
274 }
‪TYPO3\CMS\Core\Tests\Unit\Resource\Service\ExtractorServiceTest\extractMetaDataComposesDataByAvailableExtractorsWithDifferentPriorities
‪extractMetaDataComposesDataByAvailableExtractorsWithDifferentPriorities(int $extractorOneDataPriority, int $extractorOneExecutionPriority, int $extractorTwoDataPriority, int $extractorTwoExecutionPriority, array $expectedMetaData)
Definition: ExtractorServiceTest.php:207
‪TYPO3\CMS\Core\Resource\Index\ExtractorInterface
Definition: ExtractorInterface.php:25
‪TYPO3\CMS\Core\Resource\Index\ExtractorRegistry
Definition: ExtractorRegistry.php:25
‪TYPO3\CMS\Core\Tests\Unit\Resource\Service
Definition: ConfigurationServiceTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Resource\Service\ExtractorServiceTest
Definition: ExtractorServiceTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Resource\Service\ExtractorServiceTest\isFileTypeSupportedByExtractorReturnsTrueForFileTypeImageAndExtractorLimitedToFileTypeImage
‪isFileTypeSupportedByExtractorReturnsTrueForFileTypeImageAndExtractorLimitedToFileTypeImage()
Definition: ExtractorServiceTest.php:53
‪TYPO3\CMS\Core\Tests\Unit\Resource\Service\ExtractorServiceTest\extractMetaDataComposesDataByAvailableExtractors
‪extractMetaDataComposesDataByAvailableExtractors()
Definition: ExtractorServiceTest.php:93
‪TYPO3\CMS\Core\Tests\Unit\Resource\Service\ExtractorServiceTest\isFileTypeSupportedByExtractorReturnsTrueForFileTypeTextAndExtractorHasNoFileTypeLimitation
‪isFileTypeSupportedByExtractorReturnsTrueForFileTypeTextAndExtractorHasNoFileTypeLimitation()
Definition: ExtractorServiceTest.php:73
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:26
‪TYPO3\CMS\Core\Resource\Service\ExtractorService
Definition: ExtractorService.php:29
‪TYPO3\CMS\Core\Tests\Unit\Resource\Service\ExtractorServiceTest\isFileTypeSupportedByExtractorReturnsFalseForFileTypeTextAndExtractorLimitedToFileTypeImage
‪isFileTypeSupportedByExtractorReturnsFalseForFileTypeTextAndExtractorLimitedToFileTypeImage()
Definition: ExtractorServiceTest.php:33
‪TYPO3\CMS\Core\Resource\ResourceStorage
Definition: ResourceStorage.php:129
‪TYPO3\CMS\Core\Tests\Unit\Resource\Service\ExtractorServiceTest\extractMetaDataComposesDataByAvailableExtractorsWithDifferentPrioritiesDataProvider
‪static extractMetaDataComposesDataByAvailableExtractorsWithDifferentPrioritiesDataProvider()
Definition: ExtractorServiceTest.php:155
‪TYPO3\CMS\Core\Resource\FileType
‪FileType
Definition: FileType.php:21