Skip to content

Commit 4954059

Browse files
committed
Merge remote-tracking branch 'origin/ac1955new' into Hammer_Quality_Backlog_GraphQl_13042022
2 parents fabd681 + 54ee6a3 commit 4954059

File tree

2 files changed

+175
-6
lines changed

2 files changed

+175
-6
lines changed

app/code/Magento/CatalogGraphQl/DataProvider/Product/SearchCriteriaBuilder.php

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,23 @@
88
namespace Magento\CatalogGraphQl\DataProvider\Product;
99

1010
use Magento\Catalog\Api\Data\EavAttributeInterface;
11+
use Magento\Catalog\Model\Product;
12+
use Magento\Catalog\Model\Product\Visibility;
13+
use Magento\Eav\Model\Config;
1114
use Magento\Framework\Api\FilterBuilder;
1215
use Magento\Framework\Api\Search\FilterGroupBuilder;
1316
use Magento\Framework\Api\Search\SearchCriteriaInterface;
1417
use Magento\Framework\Api\SortOrder;
18+
use Magento\Framework\Api\SortOrderBuilder;
1519
use Magento\Framework\App\Config\ScopeConfigInterface;
20+
use Magento\Framework\App\ObjectManager;
1621
use Magento\Framework\GraphQl\Query\Resolver\Argument\SearchCriteria\Builder;
17-
use Magento\Catalog\Model\Product\Visibility;
18-
use Magento\Framework\Api\SortOrderBuilder;
1922

2023
/**
2124
* Build search criteria
25+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2226
*/
27+
2328
class SearchCriteriaBuilder
2429
{
2530
/**
@@ -51,28 +56,36 @@ class SearchCriteriaBuilder
5156
*/
5257
private $sortOrderBuilder;
5358

59+
/**
60+
* @var Config
61+
*/
62+
private Config $eavConfig;
63+
5464
/**
5565
* @param Builder $builder
5666
* @param ScopeConfigInterface $scopeConfig
5767
* @param FilterBuilder $filterBuilder
5868
* @param FilterGroupBuilder $filterGroupBuilder
5969
* @param Visibility $visibility
6070
* @param SortOrderBuilder $sortOrderBuilder
71+
* @param Config $eavConfig
6172
*/
6273
public function __construct(
6374
Builder $builder,
6475
ScopeConfigInterface $scopeConfig,
6576
FilterBuilder $filterBuilder,
6677
FilterGroupBuilder $filterGroupBuilder,
6778
Visibility $visibility,
68-
SortOrderBuilder $sortOrderBuilder
79+
SortOrderBuilder $sortOrderBuilder = null,
80+
Config $eavConfig = null
6981
) {
7082
$this->scopeConfig = $scopeConfig;
7183
$this->filterBuilder = $filterBuilder;
7284
$this->filterGroupBuilder = $filterGroupBuilder;
7385
$this->builder = $builder;
7486
$this->visibility = $visibility;
75-
$this->sortOrderBuilder = $sortOrderBuilder;
87+
$this->sortOrderBuilder = $sortOrderBuilder ?? ObjectManager::getInstance()->get(SortOrderBuilder::class);
88+
$this->eavConfig = $eavConfig ?? ObjectManager::getInstance()->get(Config::class);
7689
}
7790

7891
/**
@@ -87,9 +100,13 @@ public function build(array $args, bool $includeAggregation): SearchCriteriaInte
87100
$searchCriteria = $this->builder->build('products', $args);
88101
$isSearch = !empty($args['search']);
89102
$this->updateRangeFilters($searchCriteria);
90-
91103
if ($includeAggregation) {
92-
$this->preparePriceAggregation($searchCriteria);
104+
$attributeData = $this->eavConfig->getAttribute(Product::ENTITY, 'price');
105+
$priceOptions = $attributeData->getData();
106+
107+
if ($priceOptions['is_filterable'] != 0) {
108+
$this->preparePriceAggregation($searchCriteria);
109+
}
93110
$requestName = 'graphql_product_search_with_aggregation';
94111
} else {
95112
$requestName = 'graphql_product_search';
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CatalogGraphQl\Test\Unit\DataProvider\Product;
9+
10+
use Magento\Catalog\Model\Product;
11+
use Magento\Catalog\Model\Product\Visibility;
12+
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
13+
use Magento\CatalogGraphQl\DataProvider\Product\SearchCriteriaBuilder;
14+
use Magento\Eav\Model\Config;
15+
use Magento\Framework\Api\Filter;
16+
use Magento\Framework\Api\FilterBuilder;
17+
use Magento\Framework\Api\Search\FilterGroupBuilder;
18+
use Magento\Framework\Api\Search\SearchCriteriaInterface;
19+
use Magento\Framework\Api\SortOrderBuilder;
20+
use Magento\Framework\App\Config\ScopeConfigInterface;
21+
use Magento\Framework\GraphQl\Query\Resolver\Argument\SearchCriteria\Builder;
22+
use PHPUnit\Framework\TestCase;
23+
24+
/**
25+
* Build search criteria
26+
*/
27+
class SearchCriteriaBuilderTest extends TestCase
28+
{
29+
/**
30+
* @var ScopeConfigInterface
31+
*/
32+
private ScopeConfigInterface $scopeConfig;
33+
34+
/**
35+
* @var FilterBuilder
36+
*/
37+
private FilterBuilder $filterBuilder;
38+
39+
/**
40+
* @var FilterGroupBuilder
41+
*/
42+
private FilterGroupBuilder $filterGroupBuilder;
43+
44+
/**
45+
* @var Builder
46+
*/
47+
private Builder $builder;
48+
49+
/**
50+
* @var Visibility
51+
*/
52+
private Visibility $visibility;
53+
54+
/**
55+
* @var SortOrderBuilder
56+
*/
57+
private SortOrderBuilder $sortOrderBuilder;
58+
59+
/**
60+
* @var SearchCriteriaBuilder
61+
*/
62+
private SearchCriteriaBuilder $model;
63+
64+
/**
65+
* @var Config
66+
*/
67+
private Config $eavConfig;
68+
69+
/**
70+
* @inheritdoc
71+
*/
72+
protected function setUp(): void
73+
{
74+
parent::setUp();
75+
$this->builder = $this->createMock(Builder::class);
76+
$this->scopeConfig = $this->createMock(ScopeConfigInterface::class);
77+
$this->filterBuilder = $this->createMock(FilterBuilder::class);
78+
$this->filterGroupBuilder = $this->createMock(FilterGroupBuilder::class);
79+
$this->sortOrderBuilder = $this->createMock(SortOrderBuilder::class);
80+
$this->visibility = $this->createMock(Visibility::class);
81+
$this->eavConfig = $this->createMock(Config::class);
82+
$this->model = new SearchCriteriaBuilder(
83+
$this->builder,
84+
$this->scopeConfig,
85+
$this->filterBuilder,
86+
$this->filterGroupBuilder,
87+
$this->visibility,
88+
$this->sortOrderBuilder,
89+
$this->eavConfig
90+
);
91+
}
92+
93+
public function testBuild(): void
94+
{
95+
$args = ['search' => '', 'pageSize' => 20, 'currentPage' => 1];
96+
97+
$filter = $this->createMock(Filter::class);
98+
99+
$searchCriteria = $this->getMockBuilder(SearchCriteriaInterface::class)
100+
->disableOriginalConstructor()
101+
->getMockForAbstractClass();
102+
$attributeInterface = $this->getMockBuilder(Attribute::class)
103+
->disableOriginalConstructor()
104+
->getMockForAbstractClass();
105+
106+
$attributeInterface->setData(['is_filterable' => 0]);
107+
108+
$this->builder->expects($this->any())
109+
->method('build')
110+
->with('products', $args)
111+
->willReturn($searchCriteria);
112+
$searchCriteria->expects($this->any())->method('getFilterGroups')->willReturn([]);
113+
$this->eavConfig->expects($this->any())
114+
->method('getAttribute')
115+
->with(Product::ENTITY, 'price')
116+
->willReturn($attributeInterface);
117+
118+
$this->sortOrderBuilder->expects($this->once())
119+
->method('setField')
120+
->with('_id')
121+
->willReturnSelf();
122+
$this->sortOrderBuilder->expects($this->once())
123+
->method('setDirection')
124+
->with('DESC')
125+
->willReturnSelf();
126+
$this->sortOrderBuilder->expects($this->any())
127+
->method('create')
128+
->willReturn([]);
129+
130+
$this->filterBuilder->expects($this->once())
131+
->method('setField')
132+
->with('visibility')
133+
->willReturnSelf();
134+
$this->filterBuilder->expects($this->once())
135+
->method('setValue')
136+
->with("")
137+
->willReturnSelf();
138+
$this->filterBuilder->expects($this->once())
139+
->method('setConditionType')
140+
->with('in')
141+
->willReturnSelf();
142+
143+
$this->filterBuilder->expects($this->once())->method('create')->willReturn($filter);
144+
145+
$this->filterGroupBuilder->expects($this->any())
146+
->method('addFilter')
147+
->with($filter)
148+
->willReturnSelf();
149+
150+
$this->model->build($args, true);
151+
}
152+
}

0 commit comments

Comments
 (0)