MergeServiceTest.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\View\Test\Unit\Asset;
  7. use Magento\Framework\App\State;
  8. use Magento\Framework\Filesystem;
  9. use Magento\Framework\ObjectManagerInterface;
  10. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  11. use Magento\Framework\View\Asset\AssetInterface;
  12. use Magento\Framework\View\Asset\Merged;
  13. use Magento\Framework\View\Asset\MergeService;
  14. use Magento\Framework\View\Asset\ConfigInterface;
  15. use Magento\Framework\View\Asset\MergeStrategy\Checksum;
  16. use Magento\Framework\View\Asset\MergeStrategy\FileExists;
  17. /**
  18. * Class MergeServiceTest
  19. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  20. */
  21. class MergeServiceTest extends \PHPUnit\Framework\TestCase
  22. {
  23. /**
  24. * @var MergeService
  25. */
  26. private $object;
  27. /**
  28. * @var ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject
  29. */
  30. private $objectManagerMock;
  31. /**
  32. * @var ConfigInterface|\PHPUnit_Framework_MockObject_MockObject
  33. */
  34. private $configMock;
  35. /**
  36. * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject
  37. */
  38. private $filesystemMock;
  39. /**
  40. * @var Filesystem\Directory\Write|\PHPUnit_Framework_MockObject_MockObject
  41. */
  42. protected $directoryMock;
  43. /**
  44. * @var State|\PHPUnit_Framework_MockObject_MockObject
  45. */
  46. protected $stateMock;
  47. protected function setUp()
  48. {
  49. $this->objectManagerMock = $this->getMockBuilder(ObjectManagerInterface::class)
  50. ->getMockForAbstractClass();
  51. $this->configMock = $this->getMockBuilder(ConfigInterface::class)
  52. ->getMockForAbstractClass();
  53. $this->filesystemMock = $this->getMockBuilder(Filesystem::class)
  54. ->disableOriginalConstructor()
  55. ->getMock();
  56. $this->directoryMock = $this->getMockBuilder(Filesystem\Directory\Write::class)
  57. ->disableOriginalConstructor()
  58. ->getMock();
  59. $this->stateMock = $this->getMockBuilder(State::class)
  60. ->disableOriginalConstructor()
  61. ->getMock();
  62. $this->filesystemMock->expects($this->any())
  63. ->method('getDirectoryWrite')
  64. ->willReturn($this->directoryMock);
  65. $this->object = (new ObjectManager($this))->getObject(MergeService::class, [
  66. 'objectManager' => $this->objectManagerMock,
  67. 'config' => $this->configMock,
  68. 'filesystem' => $this->filesystemMock,
  69. 'state' => $this->stateMock,
  70. ]);
  71. }
  72. /**
  73. * @expectedException \InvalidArgumentException
  74. * @expectedExceptionMessage Merge for content type 'unknown' is not supported.
  75. */
  76. public function testGetMergedAssetsWrongContentType()
  77. {
  78. $this->object->getMergedAssets([], 'unknown');
  79. }
  80. /**
  81. * @param array $assets
  82. * @param string $contentType
  83. * @param string $appMode
  84. * @param string $mergeStrategy
  85. * @dataProvider getMergedAssetsDataProvider
  86. */
  87. public function testGetMergedAssets(array $assets, $contentType, $appMode, $mergeStrategy)
  88. {
  89. $mergedAsset = $this->createMock(AssetInterface::class);
  90. $mergeStrategyMock = $this->createMock($mergeStrategy);
  91. $this->configMock->expects($this->once())->method('isMergeCssFiles')->willReturn(true);
  92. $this->configMock->expects($this->once())->method('isMergeJsFiles')->willReturn(true);
  93. $this->objectManagerMock->expects($this->once())
  94. ->method('create')
  95. ->with(Merged::class, ['assets' => $assets, 'mergeStrategy' => $mergeStrategyMock])
  96. ->willReturn($mergedAsset);
  97. $this->objectManagerMock->expects($this->once())
  98. ->method('get')
  99. ->with($mergeStrategy)
  100. ->willReturn($mergeStrategyMock);
  101. $this->stateMock->expects($this->once())
  102. ->method('getMode')
  103. ->willReturn($appMode);
  104. $this->assertSame($mergedAsset, $this->object->getMergedAssets($assets, $contentType));
  105. }
  106. /**
  107. * @return array
  108. */
  109. public static function getMergedAssetsDataProvider()
  110. {
  111. $jsAssets = [
  112. new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/magento/script_one.js'),
  113. new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/magento/script_two.js'),
  114. ];
  115. $cssAssets = [
  116. new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/magento/style_one.css'),
  117. new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/magento/style_two.css'),
  118. ];
  119. return [
  120. 'js production mode' => [
  121. $jsAssets,
  122. 'js',
  123. State::MODE_PRODUCTION,
  124. FileExists::class,
  125. ],
  126. 'css production mode' => [
  127. $cssAssets,
  128. 'css',
  129. State::MODE_PRODUCTION,
  130. FileExists::class,
  131. ],
  132. 'js default mode' => [
  133. $jsAssets,
  134. 'js',
  135. State::MODE_DEFAULT,
  136. FileExists::class,
  137. ],
  138. 'css default mode' => [
  139. $cssAssets,
  140. 'js',
  141. State::MODE_DEFAULT,
  142. FileExists::class,
  143. ],
  144. 'js developer mode' => [
  145. $jsAssets,
  146. 'js',
  147. State::MODE_DEVELOPER,
  148. Checksum::class,
  149. ],
  150. 'css developer mode' => [
  151. $cssAssets,
  152. 'css',
  153. \Magento\Framework\App\State::MODE_DEVELOPER,
  154. Checksum::class,
  155. ]
  156. ];
  157. }
  158. public function testCleanMergedJsCss()
  159. {
  160. $mergedDir = \Magento\Framework\View\Asset\Merged::getRelativeDir();
  161. $this->directoryMock->expects($this->once())
  162. ->method('delete')
  163. ->with($mergedDir);
  164. $this->object->cleanMergedJsCss();
  165. }
  166. }