GroupedCollectionTest.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. class GroupedCollectionTest extends \PHPUnit\Framework\TestCase
  8. {
  9. /**
  10. * @var \Magento\Framework\View\Asset\GroupedCollection
  11. */
  12. protected $_object;
  13. /**
  14. * @var \Magento\Framework\View\Asset\AssetInterface
  15. */
  16. protected $_asset;
  17. protected function setUp()
  18. {
  19. $factory = $this->createMock(\Magento\Framework\View\Asset\PropertyGroupFactory::class);
  20. $factory->expects(
  21. $this->any()
  22. )->method(
  23. 'create'
  24. )->will(
  25. $this->returnCallback([$this, 'createAssetGroup'])
  26. );
  27. $this->_object = new \Magento\Framework\View\Asset\GroupedCollection($factory);
  28. $this->_asset = new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/magento/test.css');
  29. $this->_object->add('asset', $this->_asset);
  30. }
  31. protected function tearDown()
  32. {
  33. $this->_object = null;
  34. $this->_asset = null;
  35. }
  36. /**
  37. * Return newly created asset group. Used as a stub for object manger's creation operation.
  38. *
  39. * @param array $arguments
  40. * @return \Magento\Framework\View\Asset\PropertyGroup
  41. */
  42. public function createAssetGroup(array $arguments)
  43. {
  44. return new \Magento\Framework\View\Asset\PropertyGroup($arguments['properties']);
  45. }
  46. /**
  47. * Assert that actual asset groups equal to expected ones
  48. *
  49. * @param array $expectedGroups
  50. * @param array $actualGroupObjects
  51. */
  52. protected function _assertGroups(array $expectedGroups, array $actualGroupObjects)
  53. {
  54. $this->assertInternalType('array', $actualGroupObjects);
  55. $actualGroups = [];
  56. /** @var $actualGroup \Magento\Framework\View\Asset\PropertyGroup */
  57. foreach ($actualGroupObjects as $actualGroup) {
  58. $this->assertInstanceOf(\Magento\Framework\View\Asset\PropertyGroup::class, $actualGroup);
  59. $actualGroups[] = ['properties' => $actualGroup->getProperties(), 'assets' => $actualGroup->getAll()];
  60. }
  61. $this->assertEquals($expectedGroups, $actualGroups);
  62. }
  63. public function testAdd()
  64. {
  65. $assetNew = new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/magento/test_new.css');
  66. $this->_object->add('asset_new', $assetNew, ['test_property' => 'test_value']);
  67. $this->assertEquals(['asset' => $this->_asset, 'asset_new' => $assetNew], $this->_object->getAll());
  68. }
  69. public function testRemove()
  70. {
  71. $this->_object->remove('asset');
  72. $this->assertEquals([], $this->_object->getAll());
  73. }
  74. public function testGetGroups()
  75. {
  76. $cssAsset = new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/style.css', 'css');
  77. $jsAsset = new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/script.js', 'js');
  78. $jsAssetAllowingMerge = $this->getMockForAbstractClass(\Magento\Framework\View\Asset\MergeableInterface::class);
  79. $jsAssetAllowingMerge->expects($this->any())->method('getContentType')->will($this->returnValue('js'));
  80. // assets with identical properties should be grouped together
  81. $this->_object->add('css_asset_one', $cssAsset, ['property' => 'test_value']);
  82. $this->_object->add('css_asset_two', $cssAsset, ['property' => 'test_value']);
  83. // assets with identical properties but empty properties should be grouped together
  84. $this->_object->add('css_asset_four', $cssAsset, ['property' => 'test_value2', 'junk1' => null]);
  85. $this->_object->add('css_asset_five', $cssAsset, ['property' => 'test_value2', 'junk2' => '']);
  86. // assets with different properties should go to different groups
  87. $this->_object->add('css_asset_three', $cssAsset, ['property' => 'different_value']);
  88. $this->_object->add('js_asset_one', $jsAsset, ['property' => 'test_value']);
  89. // assets with identical properties in a different order should be grouped
  90. $this->_object->add('js_asset_two', $jsAsset, ['property1' => 'value1', 'property2' => 'value2']);
  91. $this->_object->add('js_asset_three', $jsAsset, ['property2' => 'value2', 'property1' => 'value1']);
  92. // assets allowing merge should go to separate group regardless of having identical properties
  93. $this->_object->add('asset_allowing_merge', $jsAssetAllowingMerge, ['property' => 'test_value']);
  94. $expectedGroups = [
  95. [
  96. 'properties' => ['content_type' => 'unknown', 'can_merge' => false],
  97. 'assets' => ['asset' => $this->_asset],
  98. ],
  99. [
  100. 'properties' => ['property' => 'test_value', 'content_type' => 'css', 'can_merge' => false],
  101. 'assets' => ['css_asset_one' => $cssAsset, 'css_asset_two' => $cssAsset]
  102. ],
  103. [
  104. 'properties' => ['property' => 'test_value2', 'content_type' => 'css', 'can_merge' => false],
  105. 'assets' => ['css_asset_four' => $cssAsset, 'css_asset_five' => $cssAsset]
  106. ],
  107. [
  108. 'properties' => ['property' => 'different_value', 'content_type' => 'css', 'can_merge' => false],
  109. 'assets' => ['css_asset_three' => $cssAsset]
  110. ],
  111. [
  112. 'properties' => ['property' => 'test_value', 'content_type' => 'js', 'can_merge' => false],
  113. 'assets' => ['js_asset_one' => $jsAsset]
  114. ],
  115. [
  116. 'properties' => [
  117. 'property1' => 'value1',
  118. 'property2' => 'value2',
  119. 'content_type' => 'js',
  120. 'can_merge' => false,
  121. ],
  122. 'assets' => ['js_asset_two' => $jsAsset, 'js_asset_three' => $jsAsset]
  123. ],
  124. [
  125. 'properties' => ['property' => 'test_value', 'content_type' => 'js', 'can_merge' => true],
  126. 'assets' => ['asset_allowing_merge' => $jsAssetAllowingMerge]
  127. ],
  128. ];
  129. $this->_assertGroups($expectedGroups, $this->_object->getGroups());
  130. }
  131. }