160 lines
4.8 KiB
PHP
Executable File
160 lines
4.8 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
namespace Magento\Setup\Fixtures\FixturesAsserts;
|
|
|
|
use Magento\Framework\App\Filesystem\DirectoryList;
|
|
|
|
/**
|
|
* Class ImagesAssert
|
|
*
|
|
* Class performs assertions to check that generated images are valid
|
|
* after running setup:performance:generate-fixtures command
|
|
*/
|
|
class ImagesAssert
|
|
{
|
|
/**
|
|
* @var \Magento\Catalog\Api\ProductRepositoryInterface
|
|
*/
|
|
private $productRepository;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Api\SearchCriteriaBuilder
|
|
*/
|
|
private $searchCriteriaBuilder;
|
|
|
|
/**
|
|
* @var \Magento\Catalog\Model\Product\Gallery\ReadHandler
|
|
*/
|
|
private $readHandler;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Filesystem
|
|
*/
|
|
private $filesystem;
|
|
|
|
/**
|
|
* @var \Magento\Catalog\Model\Product\Media\Config
|
|
*/
|
|
private $mediaConfig;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Filesystem\Directory\ReadInterface
|
|
*/
|
|
private $mediaDirectory;
|
|
|
|
/**
|
|
* @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
|
|
* @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
|
|
* @param \Magento\Catalog\Model\Product\Gallery\ReadHandler $readHandler
|
|
* @param \Magento\Framework\Filesystem $filesystem
|
|
* @param \Magento\Catalog\Model\Product\Media\Config $mediaConfig
|
|
*/
|
|
public function __construct(
|
|
\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
|
|
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
|
|
\Magento\Catalog\Model\Product\Gallery\ReadHandler $readHandler,
|
|
\Magento\Framework\Filesystem $filesystem,
|
|
\Magento\Catalog\Model\Product\Media\Config $mediaConfig
|
|
) {
|
|
$this->productRepository = $productRepository;
|
|
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
|
|
$this->readHandler = $readHandler;
|
|
$this->filesystem = $filesystem;
|
|
$this->mediaConfig = $mediaConfig;
|
|
}
|
|
|
|
/**
|
|
* Performs assertions over images
|
|
*
|
|
* @return bool
|
|
* @throws \AssertionError
|
|
*/
|
|
public function assert()
|
|
{
|
|
$searchCriteria = $this->searchCriteriaBuilder->create();
|
|
$products = $this->productRepository->getList($searchCriteria)->getItems();
|
|
|
|
foreach ($products as $product) {
|
|
$this->assertProductMediaGallery($product);
|
|
$this->assertProductMediaAttributes($product);
|
|
$this->assertProductImageExistsInFS($product);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Performs assertions over media_gallery product attribute
|
|
*
|
|
* @param \Magento\Catalog\Model\Product $product
|
|
* @throws \AssertionError
|
|
*/
|
|
private function assertProductMediaGallery(\Magento\Catalog\Model\Product $product)
|
|
{
|
|
$extendedProduct = $this->readHandler->execute($product);
|
|
$mediaGalleryImages = $extendedProduct->getMediaGalleryEntries();
|
|
|
|
if (count($mediaGalleryImages) !== 1) {
|
|
throw new \AssertionError('Product supposed to contain one image');
|
|
}
|
|
|
|
$image = reset($mediaGalleryImages);
|
|
|
|
if ($image->getFile() === null) {
|
|
throw new \AssertionError('Image path should not be null');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Performs assertions over product media attributes
|
|
* e.g. image|small_image|swatch_image|thumbnail
|
|
*
|
|
* @param \Magento\Catalog\Model\Product $product
|
|
* @throws \AssertionError
|
|
*/
|
|
private function assertProductMediaAttributes(\Magento\Catalog\Model\Product $product)
|
|
{
|
|
foreach ($product->getMediaAttributeValues() as $attributeCode => $attributeValue) {
|
|
if (empty($attributeValue)) {
|
|
throw new \AssertionError(
|
|
sprintf('Attribute: %s should not be empty', $attributeCode)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Performs assertions over image files in FS
|
|
*
|
|
* @param \Magento\Catalog\Model\Product $product
|
|
* @throws \AssertionError
|
|
*/
|
|
private function assertProductImageExistsInFS(\Magento\Catalog\Model\Product $product)
|
|
{
|
|
$mediaDirectory = $this->getMediaDirectory();
|
|
$mediaAttributes = $product->getMediaAttributeValues();
|
|
|
|
if (!$mediaDirectory->isExist($this->mediaConfig->getBaseMediaPath() . $mediaAttributes['image'])) {
|
|
throw new \AssertionError('Image file for product supposed to exist');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Local cache for $mediaDirectory
|
|
*
|
|
* @return \Magento\Framework\Filesystem\Directory\ReadInterface
|
|
*/
|
|
private function getMediaDirectory()
|
|
{
|
|
if ($this->mediaDirectory === null) {
|
|
$this->mediaDirectory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA);
|
|
}
|
|
|
|
return $this->mediaDirectory;
|
|
}
|
|
}
|