/**
  * @param $themePath
  * @dataProvider dataProviderThemeFormat
  */
 public function testExecuteWrongThemeFormat($themePath)
 {
     $this->themePackageInfo->expects($this->once())->method('getPackageName')->willReturn('dummy');
     $themeMock = $this->getMockBuilder('Magento\\Framework\\View\\Design\\ThemeInterface')->getMockForAbstractClass();
     $this->collection->expects($this->once())->method('getThemeByFullPath')->with($themePath)->willReturn($themeMock);
     $this->collection->expects($this->once())->method('hasTheme')->with($themeMock)->willReturn(false);
     $this->tester->execute(['theme' => [$themePath]]);
     $this->assertContains('Theme path should be specified as full path which is area/vendor/name.', $this->tester->getDisplay());
 }
 /**
  * @test
  * @return void
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 public function testRegister()
 {
     $image = 'preview.jpg';
     $themeFilePath = 'any/path';
     $parentId = 1;
     $fullPath = '/full/path';
     $theme = $this->getMockBuilder('Magento\\Framework\\View\\Design\\ThemeInterface')->setMethods(['setParentId', 'getId', 'getFullPath', 'getParentTheme', 'getCustomization', 'getPreviewImage', 'getThemeImage', 'setType', 'save'])->getMockForAbstractClass();
     $parentTheme = $this->getMockBuilder('Magento\\Framework\\View\\Design\\ThemeInterface')->getMock();
     $parentThemeFromCollectionId = 123;
     $parentThemeFromCollection = $this->getMockBuilder('Magento\\Framework\\View\\Design\\ThemeInterface')->setMethods(['getType', 'getId'])->getMockForAbstractClass();
     $themeFromCollection = $this->getMockBuilder('Magento\\Framework\\View\\Design\\ThemeInterface')->setMethods(['setType', 'save', 'getParentTheme', 'getType', 'getParentId', 'setParentId'])->getMockForAbstractClass();
     $collection = $this->getMockBuilder('Magento\\Theme\\Model\\ResourceModel\\Theme\\Data\\Collection')->disableOriginalConstructor()->getMock();
     $customization = $this->getMockBuilder('Magento\\Framework\\View\\Design\\Theme\\CustomizationInterface')->getMock();
     $imageModel = $this->getMockBuilder('Magento\\Framework\\View\\Design\\Theme\\Image')->disableOriginalConstructor()->getMock();
     $theme->expects($this->once())->method('save')->willReturnSelf();
     $theme->expects($this->once())->method('setType')->willReturn(ThemeInterface::TYPE_PHYSICAL);
     $theme->expects($this->any())->method('setParentId')->willReturn($parentId);
     $theme->expects($this->any())->method('getFullPath')->willReturn($fullPath);
     $theme->expects($this->any())->method('getParentTheme')->willReturn($parentTheme);
     $parentTheme->expects($this->any())->method('getId')->willReturn($parentId);
     $this->collectionFactory->expects($this->any())->method('create')->willReturn($collection);
     $this->filesystemCollection->expects($this->once())->method('clear');
     $this->filesystemCollection->expects($this->once())->method('hasTheme')->with($themeFromCollection)->willReturn(false);
     $this->filesystemCollection->expects($this->once())->method('getIterator')->willReturn(new \ArrayIterator([$theme]));
     $collection->expects($this->once())->method('getThemeByFullPath')->with($fullPath)->willReturn($theme);
     $theme->expects($this->once())->method('getCustomization')->willReturn($customization);
     $customization->expects($this->once())->method('getThemeFilesPath')->willReturn($themeFilePath);
     $theme->expects($this->any())->method('getPreviewImage')->willReturn($image);
     $theme->expects($this->once())->method('getThemeImage')->willReturn($imageModel);
     $imageModel->expects($this->once())->method('createPreviewImage')->with($themeFilePath . '/' . $image)->willReturnSelf();
     $collection->expects($this->once())->method('addTypeFilter')->with(ThemeInterface::TYPE_PHYSICAL)->willReturnSelf();
     $collection->expects($this->any())->method('getIterator')->willReturn(new \ArrayIterator([$themeFromCollection]));
     $collection->expects($this->any())->method('addTypeRelationFilter')->willReturnSelf();
     $themeFromCollection->expects($this->once())->method('setType')->with(ThemeInterface::TYPE_VIRTUAL)->willReturnSelf();
     $themeFromCollection->expects($this->any())->method('save')->willReturnSelf();
     $themeFromCollection->expects($this->any())->method('getParentTheme')->willReturn($parentThemeFromCollection);
     $themeFromCollection->expects($this->any())->method('getType')->willReturn(ThemeInterface::TYPE_STAGING);
     $themeFromCollection->expects($this->any())->method('getParentId')->willReturn(null);
     $themeFromCollection->expects($this->any())->method('setParentId')->with($parentThemeFromCollectionId)->willReturnSelf();
     $parentThemeFromCollection->expects($this->any())->method('getType')->willReturn(ThemeInterface::TYPE_VIRTUAL);
     $parentThemeFromCollection->expects($this->any())->method('getId')->willReturn($parentThemeFromCollectionId);
     $this->assertInstanceOf(get_class($this->model), $this->model->register());
 }
 /**
  * Retrieve list of unknown themes
  *
  * @param string[] $themePaths
  * @return string[]
  */
 protected function getUnknownThemes($themePaths)
 {
     $result = [];
     foreach ($themePaths as $themePath) {
         if (!$this->themeCollection->hasTheme($this->themeCollection->getThemeByFullPath($themePath))) {
             $result[] = $themePath;
         }
     }
     return $result;
 }
 /**
  * @dataProvider executeFailedChildThemeCheckDataProvider
  * @param bool $hasVirtual
  * @param bool $hasPhysical
  * @param array $input
  * @param string $expected
  * @return void
  */
 public function testExecuteFailedChildThemeCheck($hasVirtual, $hasPhysical, array $input, $expected)
 {
     $theme = $this->getMock('Magento\\Theme\\Model\\Theme', [], [], '', false);
     $theme->expects($this->any())->method('hasChildThemes')->willReturn($hasVirtual);
     $parentThemeA = $this->getMock('Magento\\Theme\\Model\\Theme', [], [], '', false);
     $parentThemeA->expects($this->any())->method('getFullPath')->willReturn('frontend/Magento/a');
     $parentThemeB = $this->getMock('Magento\\Theme\\Model\\Theme', [], [], '', false);
     $parentThemeB->expects($this->any())->method('getFullPath')->willReturn('frontend/Magento/b');
     $childThemeC = $this->getMock('Magento\\Theme\\Model\\Theme', [], [], '', false);
     $childThemeC->expects($this->any())->method('getFullPath')->willReturn('frontend/Magento/c');
     $childThemeD = $this->getMock('Magento\\Theme\\Model\\Theme', [], [], '', false);
     $childThemeD->expects($this->any())->method('getFullPath')->willReturn('frontend/Magento/d');
     if ($hasPhysical) {
         $childThemeC->expects($this->any())->method('getParentTheme')->willReturn($parentThemeA);
         $childThemeD->expects($this->any())->method('getParentTheme')->willReturn($parentThemeB);
     }
     $this->themeProvider->expects($this->any())->method('getThemeByFullPath')->willReturn($theme);
     $this->themeCollection->expects($this->any())->method('getIterator')->willReturn(new \ArrayIterator([$childThemeC, $childThemeD]));
     $this->assertEquals($expected, $this->themeDependencyChecker->checkChildTheme($input));
 }
示例#5
0
 /**
  * Obtain a parent theme -> children themes map from the filesystem
  *
  * @return array
  */
 private function getParentChildThemeMap()
 {
     $map = [];
     $this->themeCollection->addDefaultPattern('*');
     /** @var \Magento\Theme\Model\Theme\Data $theme */
     foreach ($this->themeCollection as $theme) {
         if ($theme->getParentTheme()) {
             $map[$theme->getParentTheme()->getFullPath()][] = $theme->getFullPath();
         }
     }
     return $map;
 }
 /**
  * Obtain a parent theme -> children themes map from the filesystem
  *
  * @return array
  */
 private function getParentChildThemeMap()
 {
     $map = [];
     $this->themeCollection->resetConstraints();
     $this->themeCollection->clear();
     /** @var \Magento\Theme\Model\Theme\Data $theme */
     foreach ($this->themeCollection as $theme) {
         if ($theme->getParentTheme()) {
             $map[$theme->getParentTheme()->getFullPath()][] = $theme->getFullPath();
         }
     }
     return $map;
 }
 /**
  * Validate given full theme paths
  *
  * @param string[] $themePaths
  * @return string[]
  */
 private function validate($themePaths)
 {
     $messages = [];
     $unknownPackages = [];
     $unknownThemes = [];
     $installedPackages = $this->composer->getRootRequiredPackages();
     foreach ($themePaths as $themePath) {
         if (array_search($this->themePackageInfo->getPackageName($themePath), $installedPackages) === false) {
             $unknownPackages[] = $themePath;
         }
         if (!$this->themeCollection->hasTheme($this->themeCollection->getThemeByFullPath($themePath))) {
             $unknownThemes[] = $themePath;
         }
     }
     $unknownPackages = array_diff($unknownPackages, $unknownThemes);
     if (!empty($unknownPackages)) {
         $text = count($unknownPackages) > 1 ? ' are not installed Composer packages' : ' is not an installed Composer package';
         $messages[] = '<error>' . implode(', ', $unknownPackages) . $text . '</error>';
     }
     if (!empty($unknownThemes)) {
         $messages[] = '<error>Unknown theme(s): ' . implode(', ', $unknownThemes) . '</error>';
     }
     return $messages;
 }
 public function setupPassChildThemeCheck()
 {
     $theme = $this->getMock('Magento\\Theme\\Model\\Theme', [], [], '', false);
     $theme->expects($this->any())->method('hasChildThemes')->willReturn(false);
     $this->collection->expects($this->any())->method('getIterator')->willReturn(new \ArrayIterator([]));
 }