assetJsOne = $this->getMockForAbstractClass(MergeableInterface::class); $this->assetJsOne->expects($this->any()) ->method('getContentType') ->willReturn('js'); $this->assetJsOne->expects($this->any()) ->method('getPath') ->willReturn('script_one.js'); $this->assetJsTwo = $this->getMockForAbstractClass(MergeableInterface::class); $this->assetJsTwo->expects($this->any()) ->method('getContentType') ->willReturn('js'); $this->assetJsTwo->expects($this->any()) ->method('getPath') ->willReturn('script_two.js'); $this->logger = $this->createMock(LoggerInterface::class); $this->mergeStrategy = $this->createMock(MergeStrategyInterface::class); $this->assetRepo = $this->getMockBuilder(AssetRepository::class) ->disableOriginalConstructor() ->getMock(); $this->versionStorage = $this->createMock(StorageInterface::class); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage At least one asset has to be passed for merging. */ public function testConstructorNothingToMerge() { new \Magento\Framework\View\Asset\Merged( $this->logger, $this->mergeStrategy, $this->assetRepo, [], $this->versionStorage ); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Asset has to implement \Magento\Framework\View\Asset\MergeableInterface. */ public function testConstructorRequireMergeInterface() { $assetUrl = new \Magento\Framework\View\Asset\Remote('http://example.com/style.css', 'css'); (new ObjectManager($this))->getObject(Merged::class, [ 'logger' => $this->logger, 'mergeStrategy' => $this->mergeStrategy, 'assetRepo' => $this->assetRepo, 'assets' => [$this->assetJsOne, $assetUrl], 'versionStorage' => $this->versionStorage, ]); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Content type 'css' cannot be merged with 'js'. */ public function testConstructorIncompatibleContentTypes() { $assetCss = $this->getMockForAbstractClass(MergeableInterface::class); $assetCss->expects($this->any()) ->method('getContentType') ->willReturn('css'); (new ObjectManager($this))->getObject(Merged::class, [ 'logger' => $this->logger, 'mergeStrategy' => $this->mergeStrategy, 'assetRepo' => $this->assetRepo, 'assets' => [$this->assetJsOne, $assetCss], 'versionStorage' => $this->versionStorage, ]); } public function testIteratorInterfaceMerge() { $assets = [$this->assetJsOne, $this->assetJsTwo]; $this->logger->expects($this->never())->method('critical'); /** @var Merged $merged */ $merged = (new ObjectManager($this))->getObject(Merged::class, [ 'logger' => $this->logger, 'mergeStrategy' => $this->mergeStrategy, 'assetRepo' => $this->assetRepo, 'assets' => $assets, 'versionStorage' => $this->versionStorage, ]); $mergedAsset = $this->createMock(\Magento\Framework\View\Asset\File::class); $this->mergeStrategy ->expects($this->once()) ->method('merge') ->with($assets, $mergedAsset) ->willReturn(null); $this->assetRepo->expects($this->once()) ->method('createArbitrary') ->willReturn($mergedAsset); $expectedResult = [$mergedAsset]; $this->assertIteratorEquals($expectedResult, $merged); $this->assertIteratorEquals($expectedResult, $merged); // ensure merging happens only once } public function testIteratorInterfaceMergeFailure() { $mergeError = new \Exception('File not found'); $assetBroken = $this->getMockForAbstractClass(MergeableInterface::class); $assetBroken->expects($this->any()) ->method('getContentType') ->willReturn('js'); $assetBroken->expects($this->any()) ->method('getPath') ->willThrowException($mergeError); /** @var Merged $merged */ $merged = (new ObjectManager($this))->getObject(Merged::class, [ 'logger' => $this->logger, 'mergeStrategy' => $this->mergeStrategy, 'assetRepo' => $this->assetRepo, 'assets' => [$this->assetJsOne, $this->assetJsTwo, $assetBroken], 'versionStorage' => $this->versionStorage, ]); $this->logger->expects($this->once())->method('critical')->with($this->identicalTo($mergeError)); $expectedResult = [$this->assetJsOne, $this->assetJsTwo, $assetBroken]; $this->assertIteratorEquals($expectedResult, $merged); $this->assertIteratorEquals($expectedResult, $merged); // ensure merging attempt happens only once } /** * Assert that iterator items equal to expected ones * * @param array $expectedItems * @param \Iterator $actual */ protected function assertIteratorEquals(array $expectedItems, \Iterator $actual) { $actualItems = []; foreach ($actual as $actualItem) { $actualItems[] = $actualItem; } $this->assertEquals($expectedItems, $actualItems); } }