TYPO3  7.6
DependencyUtilityTest.php
Go to the documentation of this file.
1 <?php
2 namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Utility;
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
21 class DependencyUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
22 {
26  protected $objectManagerMock;
27 
31  protected function setUp()
32  {
33  $this->objectManagerMock = $this->getMock(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface::class);
34  }
35 
40  public function checkTypo3DependencyThrowsExceptionIfVersionNumberIsTooLow()
41  {
43  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
44  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('15.0.0'));
45  $dependencyMock->setIdentifier('typo3');
46  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
47 
48  $this->setExpectedException(\TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException::class, '', 1399144499);
49  $dependencyUtility->_call('checkTypo3Dependency', $dependencyMock);
50  }
51 
56  public function checkTypo3DependencyThrowsExceptionIfVersionNumberIsTooHigh()
57  {
59  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
60  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue('3.0.0'));
61  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
62  $dependencyMock->setIdentifier('typo3');
63  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
64 
65  $this->setExpectedException(\TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException::class, '', 1399144521);
66  $dependencyUtility->_call('checkTypo3Dependency', $dependencyMock);
67  }
68 
73  public function checkTypo3DependencyThrowsExceptionIfIdentifierIsNotTypo3()
74  {
76  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
77  $dependencyMock->setIdentifier('123');
78  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
79 
80  $this->setExpectedException(\TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException::class, '', 1399144551);
81  $dependencyUtility->_call('checkTypo3Dependency', $dependencyMock);
82  }
83 
88  public function checkTypo3DependencyReturnsTrueIfVersionNumberIsInRange()
89  {
91  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
92  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue('15.0.0'));
93  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
94  $dependencyMock->setIdentifier('typo3');
95  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
96 
97  $this->assertTrue($dependencyUtility->_call('checkTypo3Dependency', $dependencyMock));
98  }
99 
104  public function checkTypo3DependencyCanHandleEmptyVersionHighestVersion()
105  {
107  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
108  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue(''));
109  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
110  $dependencyMock->setIdentifier('typo3');
111  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
112 
113  $this->assertTrue($dependencyUtility->_call('checkTypo3Dependency', $dependencyMock));
114  }
115 
120  public function checkTypo3DependencyCanHandleEmptyVersionLowestVersion()
121  {
123  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
124  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue('15.0.0'));
125  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue(''));
126  $dependencyMock->setIdentifier('typo3');
127  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
128 
129  $this->assertTrue($dependencyUtility->_call('checkTypo3Dependency', $dependencyMock));
130  }
131 
136  public function checkPhpDependencyThrowsExceptionIfVersionNumberIsTooLow()
137  {
139  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
140  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('15.0.0'));
141  $dependencyMock->setIdentifier('php');
142  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
143 
144  $this->setExpectedException(\TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException::class, '', 1377977857);
145  $dependencyUtility->_call('checkPhpDependency', $dependencyMock);
146  }
147 
152  public function checkPhpDependencyThrowsExceptionIfVersionNumberIsTooHigh()
153  {
155  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
156  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue('3.0.0'));
157  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
158  $dependencyMock->setIdentifier('php');
159  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
160 
161  $this->setExpectedException(\TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException::class, '', 1377977856);
162  $dependencyUtility->_call('checkPhpDependency', $dependencyMock);
163  }
164 
169  public function checkPhpDependencyThrowsExceptionIfIdentifierIsNotTypo3()
170  {
172  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
173  $dependencyMock->setIdentifier('123');
174  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
175 
176  $this->setExpectedException(\TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException::class, '', 1377977858);
177  $dependencyUtility->_call('checkPhpDependency', $dependencyMock);
178  }
179 
184  public function checkPhpDependencyReturnsTrueIfVersionNumberIsInRange()
185  {
187  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
188  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue('15.0.0'));
189  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
190  $dependencyMock->setIdentifier('php');
191  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
192 
193  $this->assertTrue($dependencyUtility->_call('checkPhpDependency', $dependencyMock));
194  }
195 
200  public function checkPhpDependencyCanHandleEmptyVersionHighestVersion()
201  {
203  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
204  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue(''));
205  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
206  $dependencyMock->setIdentifier('php');
207  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
208 
209  $this->assertTrue($dependencyUtility->_call('checkPhpDependency', $dependencyMock));
210  }
211 
216  public function checkPhpDependencyCanHandleEmptyVersionLowestVersion()
217  {
219  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
220  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue('15.0.0'));
221  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue(''));
222  $dependencyMock->setIdentifier('php');
223  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
224 
225  $this->assertTrue($dependencyUtility->_call('checkPhpDependency', $dependencyMock));
226  }
227 
232  public function checkDependenciesCallsMethodToCheckPhpDependencies()
233  {
235  $extensionMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension::class, array('dummy'));
237  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
238  $dependencyMock->setIdentifier('php');
239  $dependencyStorage = new \SplObjectStorage();
240  $dependencyStorage->attach($dependencyMock);
241  $extensionMock->setDependencies($dependencyStorage);
243  $dependencyUtility = $this->getMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('checkPhpDependency', 'checkTypo3Dependency'));
244  $dependencyUtility->expects($this->atLeastOnce())->method('checkPhpDependency');
245  $dependencyUtility->checkDependencies($extensionMock);
246  }
247 
252  public function checkDependenciesCallsMethodToCheckTypo3Dependencies()
253  {
255  $extensionMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension::class, array('dummy'));
257  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
258  $dependencyMock->setIdentifier('typo3');
259  $dependencyStorage = new \SplObjectStorage();
260  $dependencyStorage->attach($dependencyMock);
261  $extensionMock->setDependencies($dependencyStorage);
263  $dependencyUtility = $this->getMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('checkPhpDependency', 'checkTypo3Dependency'));
264 
265  $dependencyUtility->expects($this->atLeastOnce())->method('checkTypo3Dependency');
266  $dependencyUtility->checkDependencies($extensionMock);
267  }
268 
273  public function isVersionCompatibleReturnsTrueForCompatibleVersion()
274  {
276  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
277  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue('15.0.0'));
278  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
279  $version = '3.3.3';
280  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
281 
282  $this->assertTrue($dependencyUtility->_call('isVersionCompatible', $version, $dependencyMock));
283  }
284 
289  public function isVersionCompatibleReturnsFalseForIncompatibleVersion()
290  {
292  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
293  $dependencyMock->expects($this->atLeastOnce())->method('getHighestVersion')->will($this->returnValue('1.0.1'));
294  $dependencyMock->expects($this->atLeastOnce())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
295  $version = '3.3.3';
296  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
297 
298  $this->assertFalse($dependencyUtility->_call('isVersionCompatible', $version, $dependencyMock));
299  }
300 
306  {
307  $availableExtensions = array(
308  'dummy' => array(),
309  'foo' => array(),
310  'bar' => array()
311  );
312  $listUtilityMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Utility\ListUtility::class, array('getAvailableExtensions'));
313  $listUtilityMock->expects($this->atLeastOnce())->method('getAvailableExtensions')->will($this->returnValue($availableExtensions));
314  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
315  $dependencyUtility->_set('listUtility', $listUtilityMock);
316 
317  $this->assertTrue($dependencyUtility->_call('isDependentExtensionAvailable', 'dummy'));
318  }
319 
325  {
326  $availableExtensions = array(
327  'dummy' => array(),
328  'foo' => array(),
329  'bar' => array()
330  );
331  $listUtilityMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Utility\ListUtility::class, array('getAvailableExtensions'));
332  $listUtilityMock->expects($this->atLeastOnce())->method('getAvailableExtensions')->will($this->returnValue($availableExtensions));
333  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
334  $dependencyUtility->_set('listUtility', $listUtilityMock);
335 
336  $this->assertFalse($dependencyUtility->_call('isDependentExtensionAvailable', '42'));
337  }
338 
344  {
345  $emConfUtility = $this->getMock(\TYPO3\CMS\Extensionmanager\Utility\EmConfUtility::class, array('includeEmConf'));
346  $emConfUtility->expects($this->once())->method('includeEmConf')->will($this->returnValue(array(
347  'key' => 'dummy',
348  'version' => '1.0.0'
349  )));
350  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('setAvailableExtensions', 'isVersionCompatible'));
351  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getIdentifier'));
352  $dependencyMock->expects($this->once())->method('getIdentifier')->will($this->returnValue('dummy'));
353  $dependencyUtility->_set('emConfUtility', $emConfUtility);
354  $dependencyUtility->_set('availableExtensions', array(
355  'dummy' => array(
356  'foo' => '42'
357  )
358  ));
359  $dependencyUtility->expects($this->once())->method('setAvailableExtensions');
360  $dependencyUtility->expects($this->once())->method('isVersionCompatible')->with('1.0.0', $this->anything());
361  $dependencyUtility->_call('isAvailableVersionCompatible', $dependencyMock);
362  }
363 
369  {
370  $extensionRepositoryMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository::class, array('countByExtensionKey'), array($this->objectManagerMock));
371  $extensionRepositoryMock->expects($this->once())->method('countByExtensionKey')->with('test123')->will($this->returnValue(1));
372  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
373  $dependencyUtility->_set('extensionRepository', $extensionRepositoryMock);
374  $count = $dependencyUtility->_call('isExtensionDownloadableFromTer', 'test123');
375 
376  $this->assertTrue($count);
377  }
378 
384  {
385  $extensionRepositoryMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository::class, array('countByExtensionKey'), array($this->objectManagerMock));
386  $extensionRepositoryMock->expects($this->once())->method('countByExtensionKey')->with('test123')->will($this->returnValue(0));
387  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
388  $dependencyUtility->_set('extensionRepository', $extensionRepositoryMock);
389  $count = $dependencyUtility->_call('isExtensionDownloadableFromTer', 'test123');
390 
391  $this->assertFalse($count);
392  }
393 
399  {
400  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getIdentifier', 'getHighestVersion', 'getLowestVersion'));
401  $dependencyMock->expects($this->once())->method('getIdentifier')->will($this->returnValue('dummy'));
402  $dependencyMock->expects($this->once())->method('getHighestVersion')->will($this->returnValue('10.0.0'));
403  $dependencyMock->expects($this->once())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
404  $extensionRepositoryMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository::class, array('countByVersionRangeAndExtensionKey'), array($this->objectManagerMock));
405  $extensionRepositoryMock->expects($this->once())->method('countByVersionRangeAndExtensionKey')->with('dummy', 1000000, 10000000)->will($this->returnValue(2));
406  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
407  $dependencyUtility->_set('extensionRepository', $extensionRepositoryMock);
408  $count = $dependencyUtility->_call('isDownloadableVersionCompatible', $dependencyMock);
409 
410  $this->assertTrue($count);
411  }
412 
418  {
419  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getIdentifier'));
420  $dependencyMock->expects($this->once())->method('getIdentifier')->will($this->returnValue('dummy'));
421  $extensionRepositoryMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository::class, array('countByVersionRangeAndExtensionKey'), array($this->objectManagerMock));
422  $extensionRepositoryMock->expects($this->once())->method('countByVersionRangeAndExtensionKey')->with('dummy', 1000000, 2000000)->will($this->returnValue(0));
423  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('getLowestAndHighestIntegerVersions'));
424  $dependencyUtility->_set('extensionRepository', $extensionRepositoryMock);
425  $dependencyUtility->expects($this->once())->method('getLowestAndHighestIntegerVersions')->will($this->returnValue(array(
426  'lowestIntegerVersion' => 1000000,
427  'highestIntegerVersion' => 2000000
428  )));
429  $count = $dependencyUtility->_call('isDownloadableVersionCompatible', $dependencyMock);
430 
431  $this->assertFalse($count);
432  }
433 
439  {
440  $expectedVersions = array(
441  'lowestIntegerVersion' => 1000000,
442  'highestIntegerVersion' => 2000000
443  );
444 
445  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getHighestVersion', 'getLowestVersion'));
446  $dependencyMock->expects($this->once())->method('getHighestVersion')->will($this->returnValue('2.0.0'));
447  $dependencyMock->expects($this->once())->method('getLowestVersion')->will($this->returnValue('1.0.0'));
448  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('dummy'));
449  $versions = $dependencyUtility->_call('getLowestAndHighestIntegerVersions', $dependencyMock);
450 
451  $this->assertSame($expectedVersions, $versions);
452  }
453 
459  {
460  $extension1 = new \TYPO3\CMS\Extensionmanager\Domain\Model\Extension();
461  $extension1->setExtensionKey('foo');
462  $extension1->setVersion('1.0.0');
463  $extension2 = new \TYPO3\CMS\Extensionmanager\Domain\Model\Extension();
464  $extension2->setExtensionKey('bar');
465  $extension2->setVersion('1.0.42');
466 
467  $myStorage = new \TYPO3\CMS\Extensionmanager\Tests\Unit\Fixtures\LatestCompatibleExtensionObjectStorageFixture();
468  $myStorage->extensions[] = $extension1;
469  $myStorage->extensions[] = $extension2;
470  $dependencyMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Model\Dependency::class, array('getIdentifier'));
471  $dependencyMock->expects($this->once())->method('getIdentifier')->will($this->returnValue('foobar'));
472  $dependencyUtility = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class, array('getLowestAndHighestIntegerVersions'));
473  $dependencyUtility->expects($this->once())->method('getLowestAndHighestIntegerVersions')->will($this->returnValue(array(
474  'lowestIntegerVersion' => 1000000,
475  'highestIntegerVersion' => 2000000
476  )));
477  $extensionRepositoryMock = $this->getMock(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository::class, array('findByVersionRangeAndExtensionKeyOrderedByVersion'), array($this->objectManagerMock));
478  $extensionRepositoryMock->expects($this->once())->method('findByVersionRangeAndExtensionKeyOrderedByVersion')->with('foobar', 1000000, 2000000)->will($this->returnValue($myStorage));
479  $dependencyUtility->_set('extensionRepository', $extensionRepositoryMock);
480  $extension = $dependencyUtility->_call('getLatestCompatibleExtensionByIntegerVersionDependency', $dependencyMock);
481 
482  $this->assertInstanceOf(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension::class, $extension);
483  $this->assertSame('foo', $extension->getExtensionKey());
484  }
485 }