Skip to content
This repository was archived by the owner on Apr 29, 2019. It is now read-only.

Commit 8b3ec37

Browse files
committed
MAGETWO-89458: Cover changed and new logic with automated tests
1 parent 73d69b3 commit 8b3ec37

File tree

11 files changed

+385
-14
lines changed

11 files changed

+385
-14
lines changed

app/code/Magento/CatalogGraphQl/Model/Layer/CollectionProvider.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
use Magento\Framework\Registry;
1111

1212
/**
13-
* Class CollectionProvider
13+
* Collection Provider for graphql layered navigation.
14+
*
1415
* @package Magento\CatalogGraphQl\Model\Layer
1516
*/
1617
class CollectionProvider implements \Magento\Catalog\Model\Layer\ItemCollectionProviderInterface

app/code/Magento/CatalogGraphQl/Model/Layer/Context.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
use Magento\Catalog\Model\Layer\StateKeyInterface;
1111

1212
/**
13-
* Class Context
13+
* Context for graphql layered navigation.
14+
*
1415
* @package Magento\CatalogGraphQl\Model\Layer
1516
*/
1617
class Context implements \Magento\Catalog\Model\Layer\ContextInterface

app/code/Magento/CatalogGraphQl/Model/LayerFilterItemTypeResolver.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,22 @@
1010
use \Magento\Framework\GraphQl\Query\Resolver\TypeResolverInterface;
1111

1212
/**
13-
* {@inheritdoc}
13+
* Resolver for layered filter type.
14+
*
15+
* @package Magento\CatalogGraphQl\Model
1416
*/
1517
class LayerFilterItemTypeResolver implements TypeResolverInterface
1618
{
1719
/**
1820
* {@inheritdoc}
1921
*/
20-
public function resolveType(array $data) : ?string
22+
public function resolveType(array $data) : string
2123
{
2224
return isset($data['value_string'])
2325
&& isset($data['label'])
2426
&& isset($data['items_count'])
2527
&& count($data) == 3
2628
? 'LayerFilterItem'
27-
: null;
29+
: '';
2830
}
2931
}

app/code/Magento/CatalogGraphQl/Model/LayerFilterItemTypeResolverComposite.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
use Magento\Framework\GraphQl\Exception\GraphQlInputException;
1212

1313
/**
14-
* {@inheritdoc}
14+
* Composite resolver fo layered filter types.
15+
*
16+
* @package Magento\CatalogGraphQl\Model
1517
*/
1618
class LayerFilterItemTypeResolverComposite implements TypeResolverInterface
1719
{
@@ -33,7 +35,7 @@ public function __construct(array $typeResolvers = [])
3335
/**
3436
* {@inheritdoc}
3537
*/
36-
public function resolveType(array $data) : ?string
38+
public function resolveType(array $data) : string
3739
{
3840
/** @var TypeResolverInterface $typeResolver */
3941
foreach ($this->typeResolvers as $typeResolver) {

app/code/Magento/CatalogGraphQl/Model/Resolver/Layer/FilterableAttributesListFactory.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
use Magento\Catalog\Model\Layer\Search\FilterableAttributeList;
1111

1212
/**
13-
* Class FilterableAttributesListFactory
13+
* Factory for filterable attributes list.
14+
*
1415
* @package Magento\CatalogGraphQl\Model\Resolver\Layer
1516
*/
1617
class FilterableAttributesListFactory

app/code/Magento/CatalogGraphQl/Model/Resolver/Layer/FiltersProvider.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
use Magento\Catalog\Model\Layer\Resolver;
1313
use Magento\CatalogGraphQl\Model\Resolver\Layer\FilterableAttributesListFactory;
1414

15+
/**
16+
* Layer types filters provider.
17+
*
18+
* @package Magento\CatalogGraphQl\Model\Resolver\Layer
19+
*/
1520
class FiltersProvider
1621
{
1722
/**

app/code/Magento/CatalogGraphQl/Model/Resolver/Products/DataProvider/Product.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@
1010
use Magento\Catalog\Model\ResourceModel\CategoryProduct;
1111
use Magento\Framework\Api\SearchCriteriaBuilder;
1212
use Magento\Framework\Api\SearchCriteriaInterface;
13-
use Magento\Framework\Data\SearchResultInterface;
1413
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
1514
use Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface;
1615
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
1716
use Magento\Catalog\Api\Data\ProductSearchResultsInterfaceFactory;
1817
use Magento\Framework\Api\SearchResultsInterface;
19-
use Magento\Framework\App\ObjectManager;
2018

2119
/**
2220
* Product field data provider, used for GraphQL resolver processing.
@@ -83,7 +81,6 @@ public function __construct(
8381
ProductSearchResultsInterfaceFactory $searchResultsFactory,
8482
CategoryProduct $categoryProduct,
8583
SearchCriteriaBuilder $searchCriteriaBuilder,
86-
ProductSearchResultsInterfaceFactory $searchResultsFactory,
8784
\Magento\Catalog\Model\Layer\Resolver $layerResolver,
8885
\Magento\Catalog\Model\ProductRepository $productRepository
8986
) {

app/code/Magento/SwatchesGraphQl/Model/Resolver/SwatchLayerFilterItemResolver.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@
1010
use \Magento\Framework\GraphQl\Query\Resolver\TypeResolverInterface;
1111

1212
/**
13-
* {@inheritdoc}
13+
* Resolver for swatches layer filter type.
14+
*
15+
* @package Magento\SwatchesGraphQl\Model\Resolver
1416
*/
1517
class SwatchLayerFilterItemResolver implements TypeResolverInterface
1618
{
1719
/**
1820
* {@inheritdoc}
1921
*/
20-
public function resolveType(array $data) : ?string
22+
public function resolveType(array $data) : string
2123
{
2224
if (isset($data['swatch_data'])) {
2325
return 'SwatchLayerFilterItem';
2426
}
25-
return null;
27+
return '';
2628
}
2729
}

dev/tests/api-functional/testsuite/Magento/GraphQl/Catalog/ProductSearchTest.php

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,138 @@
1616

1717
class ProductSearchTest extends GraphQlAbstract
1818
{
19+
/**
20+
* Verify that layered navigation filters are returned for product query
21+
*
22+
* @magentoApiDataFixture Magento/Catalog/_files/products_with_layered_navigation_attribute.php
23+
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
24+
*/
25+
public function testFilterLn()
26+
{
27+
$query = <<<QUERY
28+
{
29+
products (
30+
filter: {
31+
sku: {
32+
like:"simple%"
33+
}
34+
}
35+
pageSize: 4
36+
currentPage: 1
37+
sort: {
38+
name: DESC
39+
}
40+
)
41+
{
42+
items {
43+
sku
44+
}
45+
filters {
46+
name
47+
filter_items_count
48+
request_var
49+
filter_items {
50+
label
51+
value_string
52+
items_count
53+
... on SwatchLayerFilterItemInterface {
54+
swatch_data {
55+
type
56+
value
57+
}
58+
}
59+
}
60+
}
61+
}
62+
}
63+
QUERY;
64+
/**
65+
* @var ProductRepositoryInterface $productRepository
66+
*/
67+
$response = $this->graphQlQuery($query);
68+
69+
$this->assertArrayHasKey(
70+
'filters',
71+
$response['products'],
72+
'Filters are missing in product query result.'
73+
);
74+
$this->assertFilters(
75+
$response,
76+
$this->getExpectedFiltersDataSet(),
77+
'Returned filters data set does not match the expected value'
78+
);
79+
}
80+
81+
/**
82+
* Get array with expected data for layered navigation filters
83+
*
84+
* @return array
85+
*/
86+
private function getExpectedFiltersDataSet()
87+
{
88+
/** @var \Magento\Eav\Model\Config $eavConfig */
89+
$eavConfig = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(\Magento\Eav\Model\Config::class);
90+
$attribute = $eavConfig->getAttribute('catalog_product', 'test_configurable');
91+
/** @var \Magento\Eav\Api\Data\AttributeOptionInterface[] $options */
92+
$options = $attribute->getOptions();
93+
// Fetching option ID is required for continuous debug as of autoincrement IDs.
94+
return [
95+
[
96+
'name' => 'Category',
97+
'filter_items_count' => 1,
98+
'request_var' => 'cat',
99+
'filter_items' => [
100+
[
101+
'label' => 'Category 1',
102+
'value_string' => '333',
103+
'items_count' => 3,
104+
],
105+
],
106+
],
107+
[
108+
'name' => 'Test Configurable',
109+
'filter_items_count' => 1,
110+
'request_var' => 'test_configurable',
111+
'filter_items' => [
112+
[
113+
'label' => 'Option 1',
114+
'value_string' => $options[1]->getValue(),
115+
'items_count' => 1,
116+
],
117+
],
118+
],
119+
[
120+
'name' => 'Price',
121+
'filter_items_count' => 2,
122+
'request_var' => 'price',
123+
'filter_items' => [
124+
[
125+
'label' => '<span class="price">$0.00</span> - <span class="price">$9.99</span>',
126+
'value_string' => '-10',
127+
'items_count' => 1,
128+
],
129+
[
130+
'label' => '<span class="price">$10.00</span> and above',
131+
'value_string' => '10-',
132+
'items_count' => 1,
133+
],
134+
],
135+
],
136+
];
137+
}
138+
139+
/**
140+
* Assert filters data.
141+
*
142+
* @param array $response
143+
* @param array $expectedFilters
144+
* @param string $message
145+
*/
146+
private function assertFilters($response, $expectedFilters, $message = '')
147+
{
148+
$this->assertEquals($expectedFilters, $response['products']['filters'], $message);
149+
}
150+
19151
/**
20152
* Verify that items between the price range of 5 and 50 are returned after sorting name in DESC
21153
*

0 commit comments

Comments
 (0)