/** * @param $groupOne * @param $groupTwo * @param $expectedResult * @dataProvider dataProviderRenderAssets */ public function testRenderAssets($groupOne, $groupTwo, $expectedResult) { $assetUrl = 'url'; $assetNoRoutUrl = 'no_route_url'; $exception = new \Magento\Framework\Exception('my message'); $assetMockOne = $this->getMock('Magento\\Framework\\View\\Asset\\AssetInterface'); $assetMockOne->expects($this->exactly(2))->method('getUrl')->willReturn($assetUrl); $groupAssetsOne = [$assetMockOne, $assetMockOne]; $groupMockOne = $this->getMockBuilder('Magento\\Framework\\View\\Asset\\PropertyGroup')->disableOriginalConstructor()->getMock(); $groupMockOne->expects($this->once())->method('getAll')->willReturn($groupAssetsOne); $groupMockOne->expects($this->any())->method('getProperty')->willReturnMap([[GroupedCollection::PROPERTY_CAN_MERGE, true], [GroupedCollection::PROPERTY_CONTENT_TYPE, $groupOne['type']], ['attributes', $groupOne['attributes']], ['ie_condition', $groupOne['condition']]]); $assetMockTwo = $this->getMock('Magento\\Framework\\View\\Asset\\AssetInterface'); $assetMockTwo->expects($this->once())->method('getUrl')->willThrowException($exception); $groupAssetsTwo = [$assetMockTwo]; $groupMockTwo = $this->getMockBuilder('Magento\\Framework\\View\\Asset\\PropertyGroup')->disableOriginalConstructor()->getMock(); $groupMockTwo->expects($this->once())->method('getAll')->willReturn($groupAssetsTwo); $groupMockTwo->expects($this->any())->method('getProperty')->willReturnMap([[GroupedCollection::PROPERTY_CAN_MERGE, true], [GroupedCollection::PROPERTY_CONTENT_TYPE, $groupTwo['type']], ['attributes', $groupTwo['attributes']], ['ie_condition', $groupTwo['condition']]]); $this->pageConfigMock->expects($this->once())->method('getAssetCollection')->willReturn($this->assetsCollection); $this->assetsCollection->expects($this->once())->method('getGroups')->willReturn([$groupMockOne, $groupMockTwo]); $this->assetMinifyServiceMock->expects($this->exactly(2))->method('getAssets')->willReturnArgument(0); $this->assetMergeServiceMock->expects($this->exactly(1))->method('getMergedAssets')->willReturnArgument(0); $this->loggerMock->expects($this->once())->method('critical')->with($exception); $this->urlBuilderMock->expects($this->once())->method('getUrl')->with('', ['_direct' => 'core/index/notFound'])->willReturn($assetNoRoutUrl); $this->assertEquals($expectedResult, $this->renderer->renderAssets($this->renderer->getAvailableResultGroups())); }
/** * Apply customized static files to frontend * * @param \Magento\Framework\Event\Observer $observer * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function execute(\Magento\Framework\Event\Observer $observer) { /** @var $themeFile \Magento\Theme\Model\Theme\File */ foreach ($this->currentTheme->getCustomization()->getFiles() as $themeFile) { try { $service = $themeFile->getCustomizationService(); if ($service instanceof \Magento\Framework\View\Design\Theme\Customization\FileAssetInterface) { $identifier = $themeFile->getData('file_path'); $dirPath = \Magento\Framework\View\Design\Theme\Customization\Path::DIR_NAME . '/' . $this->currentTheme->getId(); $asset = $this->assetRepo->createArbitrary($identifier, $dirPath, DirectoryList::MEDIA, \Magento\Framework\UrlInterface::URL_TYPE_MEDIA); $this->pageAssets->add($identifier, $asset); } } catch (\InvalidArgumentException $e) { $this->logger->critical($e); } } }
public function testAddRss() { $title = 'test title'; $href = 'http://test.com'; $expected = ['attributes' => 'rel="alternate" type="application/rss+xml" title="test title"']; $this->assetRepo->expects($this->once())->method('createRemoteAsset')->with($href, 'unknown')->will($this->returnValue($this->remoteAsset)); $this->pageAssets->expects($this->once())->method('add')->with('link/http://test.com', $this->remoteAsset, $expected); $this->assertInstanceOf('Magento\\Framework\\View\\Page\\Config', $this->model->addRss($title, $href)); }
/** * Add RSS element * * @param string $title * @param string $href * @return $this */ public function addRss($title, $href) { $remoteAsset = $this->assetRepo->createRemoteAsset((string)$href, 'unknown'); $this->pageAssets->add( "link/{$href}", $remoteAsset, ['attributes' => 'rel="alternate" type="application/rss+xml" title="' . $title . '"'] ); return $this; }
/** * Render HTML for the added head items * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * * @return string */ public function getCssJsHtml() { foreach ($this->getLayout()->getChildBlocks($this->getNameInLayout()) as $block) { /** @var $block \Magento\Framework\View\Element\AbstractBlock */ if ($block instanceof \Magento\Theme\Block\Html\Head\AssetBlockInterface) { /** @var \Magento\Framework\View\Asset\AssetInterface $asset */ $asset = $block->getAsset(); $this->_pageAssets->add($block->getNameInLayout(), $asset, (array) $block->getProperties()); } } $result = ''; /** @var $group \Magento\Framework\View\Asset\PropertyGroup */ foreach ($this->_pageAssets->getGroups() as $group) { $contentType = $group->getProperty(\Magento\Framework\View\Asset\GroupedCollection::PROPERTY_CONTENT_TYPE); $canMerge = $group->getProperty(\Magento\Framework\View\Asset\GroupedCollection::PROPERTY_CAN_MERGE); $attributes = $group->getProperty('attributes'); $ieCondition = $group->getProperty('ie_condition'); $flagName = $group->getProperty('flag_name'); if ($flagName && !$this->getData($flagName)) { continue; } $groupAssets = $group->getAll(); $groupAssets = $this->_assetMinifyService->getAssets($groupAssets); if ($canMerge && count($groupAssets) > 1) { $groupAssets = $this->_assetMergeService->getMergedAssets($groupAssets, $contentType); } if (!empty($attributes)) { if (is_array($attributes)) { $attributesString = ''; foreach ($attributes as $name => $value) { $attributesString .= ' ' . $name . '="' . $this->escapeHtml($value) . '"'; } $attributes = $attributesString; } else { $attributes = ' ' . $attributes; } } if ($contentType == 'js') { $groupTemplate = '<script' . $attributes . ' type="text/javascript" src="%s"></script>' . "\n"; } else { if ($contentType == 'css') { $attributes = ' rel="stylesheet" type="text/css"' . ($attributes ?: ' media="all"'); } $groupTemplate = '<link' . $attributes . ' href="%s" />' . "\n"; } $groupHtml = $this->_renderHtml($groupTemplate, $groupAssets); if (!empty($ieCondition)) { $groupHtml = '<!--[if ' . $ieCondition . ']>' . "\n" . $groupHtml . '<![endif]-->' . "\n"; } $result .= $groupHtml; } return $result; }
/** * @param $contentType * @param $attributes * @param $ieCondition * @param $expectedResult * @dataProvider dataProviderRenderAsset */ public function testRenderAsset($contentType, $attributes, $ieCondition, $expectedResult) { $assetUrl = 'url'; $assetNoRoutUrl = 'no_route_url'; $exception = new \Magento\Framework\Exception('my message'); $assetMock1 = $this->getMock('Magento\\Framework\\View\\Asset\\AssetInterface'); $assetMock1->expects($this->once())->method('getUrl')->willReturn($assetUrl); $assetMock2 = $this->getMock('Magento\\Framework\\View\\Asset\\AssetInterface'); $assetMock2->expects($this->once())->method('getUrl')->willThrowException($exception); $groupAssets = [$assetMock1, $assetMock2]; $this->pageConfigMock->expects($this->once())->method('getAssetCollection')->willReturn($this->assetsCollection); $this->assetsCollection->expects($this->once())->method('getGroups')->willReturn([$this->propertyGroupMock]); $this->propertyGroupMock->expects($this->once())->method('getAll')->willReturn($groupAssets); $this->propertyGroupMock->expects($this->any())->method('getProperty')->willReturnMap([[GroupedCollection::PROPERTY_CAN_MERGE, true], [GroupedCollection::PROPERTY_CONTENT_TYPE, $contentType], ['attributes', $attributes], ['ie_condition', $ieCondition]]); $this->assetMinifyServiceMock->expects($this->once())->method('getAssets')->with($groupAssets)->willReturn($groupAssets); $this->assetMergeServiceMock->expects($this->once())->method('getMergedAssets')->with($groupAssets, $contentType)->willReturnArgument(0); $this->loggerMock->expects($this->once())->method('critical')->with($exception); $this->urlBuilderMock->expects($this->once())->method('getUrl')->with('', ['_direct' => 'core/index/notFound'])->willReturn($assetNoRoutUrl); $this->assertEquals($expectedResult, $this->renderer->renderAssets()); }
public function testGetGroups() { $cssAsset = new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/style.css', 'css'); $jsAsset = new \Magento\Framework\View\Asset\Remote('http://127.0.0.1/script.js', 'js'); $jsAssetAllowingMerge = $this->getMockForAbstractClass('Magento\\Framework\\View\\Asset\\MergeableInterface'); $jsAssetAllowingMerge->expects($this->any())->method('getContentType')->will($this->returnValue('js')); // assets with identical properties should be grouped together $this->_object->add('css_asset_one', $cssAsset, ['property' => 'test_value']); $this->_object->add('css_asset_two', $cssAsset, ['property' => 'test_value']); // assets with identical properties but empty properties should be grouped together $this->_object->add('css_asset_four', $cssAsset, ['property' => 'test_value2', 'junk1' => null]); $this->_object->add('css_asset_five', $cssAsset, ['property' => 'test_value2', 'junk2' => '']); // assets with different properties should go to different groups $this->_object->add('css_asset_three', $cssAsset, ['property' => 'different_value']); $this->_object->add('js_asset_one', $jsAsset, ['property' => 'test_value']); // assets with identical properties in a different order should be grouped $this->_object->add('js_asset_two', $jsAsset, ['property1' => 'value1', 'property2' => 'value2']); $this->_object->add('js_asset_three', $jsAsset, ['property2' => 'value2', 'property1' => 'value1']); // assets allowing merge should go to separate group regardless of having identical properties $this->_object->add('asset_allowing_merge', $jsAssetAllowingMerge, ['property' => 'test_value']); $expectedGroups = [['properties' => ['content_type' => 'unknown', 'can_merge' => false], 'assets' => ['asset' => $this->_asset]], ['properties' => ['property' => 'test_value', 'content_type' => 'css', 'can_merge' => false], 'assets' => ['css_asset_one' => $cssAsset, 'css_asset_two' => $cssAsset]], ['properties' => ['property' => 'test_value2', 'content_type' => 'css', 'can_merge' => false], 'assets' => ['css_asset_four' => $cssAsset, 'css_asset_five' => $cssAsset]], ['properties' => ['property' => 'different_value', 'content_type' => 'css', 'can_merge' => false], 'assets' => ['css_asset_three' => $cssAsset]], ['properties' => ['property' => 'test_value', 'content_type' => 'js', 'can_merge' => false], 'assets' => ['js_asset_one' => $jsAsset]], ['properties' => ['property1' => 'value1', 'property2' => 'value2', 'content_type' => 'js', 'can_merge' => false], 'assets' => ['js_asset_two' => $jsAsset, 'js_asset_three' => $jsAsset]], ['properties' => ['property' => 'test_value', 'content_type' => 'js', 'can_merge' => true], 'assets' => ['asset_allowing_merge' => $jsAssetAllowingMerge]]]; $this->_assertGroups($expectedGroups, $this->_object->getGroups()); }