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