Skip to content

Commit

Permalink
Merge pull request #7578 from magento-gl/Hammer_Quality_Backlog_Graph…
Browse files Browse the repository at this point in the history
…Ql_13042022

Hammer quality backlog graph ql 13042022
  • Loading branch information
sidolov committed Apr 21, 2022
2 parents d86eafe + ef52312 commit e71f154
Show file tree
Hide file tree
Showing 21 changed files with 527 additions and 63 deletions.
6 changes: 1 addition & 5 deletions app/code/Magento/Catalog/Model/ResourceModel/Product.php
Original file line number Diff line number Diff line change
Expand Up @@ -656,11 +656,7 @@ public function getProductsIdsBySkus(array $productSkuList)
*/
private function getResultKey(string $sku, array $productSkuList): string
{
$key = array_search(strtolower($sku), array_map('strtolower', $productSkuList));
if ($key !== false) {
$sku = $productSkuList[$key];
}
return $sku;
return in_array(strtolower($sku), array_map('strtolower', $productSkuList)) ? $sku : '';
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,23 @@
namespace Magento\CatalogGraphQl\DataProvider\Product;

use Magento\Catalog\Api\Data\EavAttributeInterface;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\Product\Visibility;
use Magento\Eav\Model\Config;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\FilterGroupBuilder;
use Magento\Framework\Api\Search\SearchCriteriaInterface;
use Magento\Framework\Api\SortOrder;
use Magento\Framework\Api\SortOrderBuilder;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\GraphQl\Query\Resolver\Argument\SearchCriteria\Builder;
use Magento\Catalog\Model\Product\Visibility;
use Magento\Framework\Api\SortOrderBuilder;

/**
* Build search criteria
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/

class SearchCriteriaBuilder
{
/**
Expand Down Expand Up @@ -51,28 +56,36 @@ class SearchCriteriaBuilder
*/
private $sortOrderBuilder;

/**
* @var Config
*/
private Config $eavConfig;

/**
* @param Builder $builder
* @param ScopeConfigInterface $scopeConfig
* @param FilterBuilder $filterBuilder
* @param FilterGroupBuilder $filterGroupBuilder
* @param Visibility $visibility
* @param SortOrderBuilder $sortOrderBuilder
* @param Config $eavConfig
*/
public function __construct(
Builder $builder,
ScopeConfigInterface $scopeConfig,
FilterBuilder $filterBuilder,
FilterGroupBuilder $filterGroupBuilder,
Visibility $visibility,
SortOrderBuilder $sortOrderBuilder
SortOrderBuilder $sortOrderBuilder = null,
Config $eavConfig = null
) {
$this->scopeConfig = $scopeConfig;
$this->filterBuilder = $filterBuilder;
$this->filterGroupBuilder = $filterGroupBuilder;
$this->builder = $builder;
$this->visibility = $visibility;
$this->sortOrderBuilder = $sortOrderBuilder;
$this->sortOrderBuilder = $sortOrderBuilder ?? ObjectManager::getInstance()->get(SortOrderBuilder::class);
$this->eavConfig = $eavConfig ?? ObjectManager::getInstance()->get(Config::class);
}

/**
Expand All @@ -87,9 +100,13 @@ public function build(array $args, bool $includeAggregation): SearchCriteriaInte
$searchCriteria = $this->builder->build('products', $args);
$isSearch = !empty($args['search']);
$this->updateRangeFilters($searchCriteria);

if ($includeAggregation) {
$this->preparePriceAggregation($searchCriteria);
$attributeData = $this->eavConfig->getAttribute(Product::ENTITY, 'price');
$priceOptions = $attributeData->getData();

if ($priceOptions['is_filterable'] != 0) {
$this->preparePriceAggregation($searchCriteria);
}
$requestName = 'graphql_product_search_with_aggregation';
} else {
$requestName = 'graphql_product_search';
Expand Down Expand Up @@ -142,7 +159,7 @@ private function addEntityIdSort(SearchCriteriaInterface $searchCriteria): void
{
$sortOrderArray = $searchCriteria->getSortOrders();
$sortDir = SortOrder::SORT_DESC;
if (count($sortOrderArray) > 0) {
if (is_array($sortOrderArray) && count($sortOrderArray) > 0) {
$sortOrder = end($sortOrderArray);
// in the case the last sort order is by position, sort IDs in descendent order
$sortDir = $sortOrder->getField() === EavAttributeInterface::POSITION
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CatalogGraphQl\Test\Unit\DataProvider\Product;

use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\Product\Visibility;
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
use Magento\CatalogGraphQl\DataProvider\Product\SearchCriteriaBuilder;
use Magento\Eav\Model\Config;
use Magento\Framework\Api\Filter;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\FilterGroupBuilder;
use Magento\Framework\Api\Search\SearchCriteriaInterface;
use Magento\Framework\Api\SortOrderBuilder;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\GraphQl\Query\Resolver\Argument\SearchCriteria\Builder;
use PHPUnit\Framework\TestCase;

/**
* Build search criteria
*/
class SearchCriteriaBuilderTest extends TestCase
{
/**
* @var ScopeConfigInterface
*/
private ScopeConfigInterface $scopeConfig;

/**
* @var FilterBuilder
*/
private FilterBuilder $filterBuilder;

/**
* @var FilterGroupBuilder
*/
private FilterGroupBuilder $filterGroupBuilder;

/**
* @var Builder
*/
private Builder $builder;

/**
* @var Visibility
*/
private Visibility $visibility;

/**
* @var SortOrderBuilder
*/
private SortOrderBuilder $sortOrderBuilder;

/**
* @var SearchCriteriaBuilder
*/
private SearchCriteriaBuilder $model;

/**
* @var Config
*/
private Config $eavConfig;

/**
* @inheritdoc
*/
protected function setUp(): void
{
parent::setUp();
$this->builder = $this->createMock(Builder::class);
$this->scopeConfig = $this->createMock(ScopeConfigInterface::class);
$this->filterBuilder = $this->createMock(FilterBuilder::class);
$this->filterGroupBuilder = $this->createMock(FilterGroupBuilder::class);
$this->sortOrderBuilder = $this->createMock(SortOrderBuilder::class);
$this->visibility = $this->createMock(Visibility::class);
$this->eavConfig = $this->createMock(Config::class);
$this->model = new SearchCriteriaBuilder(
$this->builder,
$this->scopeConfig,
$this->filterBuilder,
$this->filterGroupBuilder,
$this->visibility,
$this->sortOrderBuilder,
$this->eavConfig
);
}

public function testBuild(): void
{
$args = ['search' => '', 'pageSize' => 20, 'currentPage' => 1];

$filter = $this->createMock(Filter::class);

$searchCriteria = $this->getMockBuilder(SearchCriteriaInterface::class)
->disableOriginalConstructor()
->getMockForAbstractClass();
$attributeInterface = $this->getMockBuilder(Attribute::class)
->disableOriginalConstructor()
->getMockForAbstractClass();

$attributeInterface->setData(['is_filterable' => 0]);

$this->builder->expects($this->any())
->method('build')
->with('products', $args)
->willReturn($searchCriteria);
$searchCriteria->expects($this->any())->method('getFilterGroups')->willReturn([]);
$this->eavConfig->expects($this->any())
->method('getAttribute')
->with(Product::ENTITY, 'price')
->willReturn($attributeInterface);

$this->sortOrderBuilder->expects($this->once())
->method('setField')
->with('_id')
->willReturnSelf();
$this->sortOrderBuilder->expects($this->once())
->method('setDirection')
->with('DESC')
->willReturnSelf();
$this->sortOrderBuilder->expects($this->any())
->method('create')
->willReturn([]);

$this->filterBuilder->expects($this->once())
->method('setField')
->with('visibility')
->willReturnSelf();
$this->filterBuilder->expects($this->once())
->method('setValue')
->with("")
->willReturnSelf();
$this->filterBuilder->expects($this->once())
->method('setConditionType')
->with('in')
->willReturnSelf();

$this->filterBuilder->expects($this->once())->method('create')->willReturn($filter);

$this->filterGroupBuilder->expects($this->any())
->method('addFilter')
->with($filter)
->willReturnSelf();

$this->model->build($args, true);
}
}
90 changes: 90 additions & 0 deletions app/code/Magento/CatalogInventory/Test/Fixture/SourceItem.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\CatalogInventory\Test\Fixture;

use Magento\Framework\DataObject;
use Magento\InventoryApi\Api\Data\SourceItemInterface;
use Magento\InventoryApi\Api\SourceItemsDeleteInterface;
use Magento\InventoryApi\Api\SourceItemsSaveInterface;
use Magento\TestFramework\Fixture\Api\DataMerger;
use Magento\TestFramework\Fixture\Api\ServiceFactory;
use Magento\TestFramework\Fixture\Data\ProcessorInterface;
use Magento\TestFramework\Fixture\RevertibleDataFixtureInterface;

class SourceItem implements RevertibleDataFixtureInterface
{
private const DEFAULT_DATA = [
'sku' => 'SKU-%uniqid%',
'source_code' => 'Source%uniqid%',
'quantity' => 5,
'status' => SourceItemInterface::STATUS_IN_STOCK,
];

/**
* @var ServiceFactory
*/
private ServiceFactory $serviceFactory;

/**
* @var ProcessorInterface
*/
private ProcessorInterface $dataProcessor;

/**
* @var DataMerger
*/
private DataMerger $dataMerger;

/**
* @param ServiceFactory $serviceFactory
* @param ProcessorInterface $dataProcessor
* @param DataMerger $dataMerger
*/
public function __construct(
ServiceFactory $serviceFactory,
ProcessorInterface $dataProcessor,
DataMerger $dataMerger
) {
$this->serviceFactory = $serviceFactory;
$this->dataProcessor = $dataProcessor;
$this->dataMerger = $dataMerger;
}

/**
* @param array $data
* @return DataObject|null
*/
public function apply(array $data = []): ?DataObject
{
$service = $this->serviceFactory->create(SourceItemsSaveInterface::class, 'execute');

return $service->execute(['sourceItems' => [$this->prepareData($data)]]);
}

/**
* @inheritdoc
*/
public function revert(DataObject $data): void
{
$service = $this->serviceFactory->create(SourceItemsDeleteInterface::class, 'execute');
$service->execute(['sourceItems' => [$this->prepareData($data->getData())]]);
}

/**
* Prepare product data
*
* @param array $data
* @return array
*/
private function prepareData(array $data): array
{
$data = $this->dataMerger->merge(self::DEFAULT_DATA, $data, false);

return $this->dataProcessor->process($this, $data);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ public function execute(array $productIds, int $visibility, int $storeId): void
[
UrlRewrite::ENTITY_ID => $product->getId(),
UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
UrlRewrite::STORE_ID => $storeId,
]
);
} elseif ($visibility !== Visibility::VISIBILITY_NOT_VISIBLE) {
Expand Down
6 changes: 4 additions & 2 deletions app/code/Magento/OfflineShipping/Model/Carrier/Tablerate.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,9 @@ public function collectRates(RateRequest $request)
}
} elseif ($item->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
$request->setPackageValueWithDiscount(
$request->getPackageValueWithDiscount() - $item->getBaseRowTotal()
);
}
}
}
Expand All @@ -133,8 +136,7 @@ public function collectRates(RateRequest $request)
$freeQty += $item->getQty() * ($child->getQty() - $freeShipping);
}
}
} elseif (
($item->getFreeShipping() || $item->getAddress()->getFreeShipping()) &&
} elseif (($item->getFreeShipping() || $item->getAddress()->getFreeShipping()) &&
($item->getFreeShippingMethod() == null || $item->getFreeShippingMethod() &&
$item->getFreeShippingMethod() == 'tablerate_bestway')
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public function collect(
$address->setFreeMethodWeight($data['freeMethodWeight']);

$isFreeShipping = $this->freeShipping->isFreeShipping($quote, $shippingAssignment->getItems());
$address->setFreeShipping($isFreeShipping);
$address->setFreeShipping((int)$isFreeShipping);
// recalculate weights
$data = $this->getAssignmentWeightData($address, $shippingAssignment->getItems());
$address->setItemQty($data['addressQty']);
Expand Down
Loading

0 comments on commit e71f154

Please sign in to comment.