7
7
8
8
namespace Magento \GraphQl \Catalog ;
9
9
10
+ use Magento \Config \App \Config \Type \System ;
11
+ use Magento \Config \Model \ResourceModel \Config ;
12
+ use Magento \Directory \Model \Currency ;
13
+ use Magento \Store \Model \ScopeInterface ;
14
+ use Magento \Store \Model \Store ;
10
15
use Magento \TestFramework \Helper \Bootstrap ;
11
16
use Magento \TestFramework \TestCase \GraphQlAbstract ;
12
17
@@ -22,28 +27,9 @@ public function testAggregationBooleanAttribute()
22
27
. 'MC-36768: Custom attribute not appears in elasticsearch '
23
28
);
24
29
25
- $ skus = '"search_product_1", "search_product_2", "search_product_3", "search_product_4" ,"search_product_5" ' ;
26
- $ query = <<<QUERY
27
- {
28
- products(filter: {sku: {in: [ {$ skus }]}}){
29
- items{
30
- id
31
- sku
32
- name
33
- }
34
- aggregations{
35
- label
36
- attribute_code
37
- count
38
- options{
39
- label
40
- value
41
- count
42
- }
43
- }
44
- }
45
- }
46
- QUERY ;
30
+ $ query = $ this ->getGraphQlQuery (
31
+ '"search_product_1", "search_product_2", "search_product_3", "search_product_4" ,"search_product_5" '
32
+ );
47
33
48
34
$ result = $ this ->graphQlQuery ($ query );
49
35
@@ -69,4 +55,107 @@ function ($a) {
69
55
$ this ->assertCount (2 , $ booleanAggregation ['options ' ]);
70
56
$ this ->assertContainsEquals (['label ' => '0 ' , 'value ' => '0 ' , 'count ' => '2 ' ], $ booleanAggregation ['options ' ]);
71
57
}
58
+
59
+ /**
60
+ * @magentoApiDataFixture Magento/Catalog/_files/products_for_search.php
61
+ */
62
+ public function testAggregationPriceRanges ()
63
+ {
64
+ $ query = $ this ->getGraphQlQuery (
65
+ '"search_product_1", "search_product_2", "search_product_3", "search_product_4" ,"search_product_5" '
66
+ );
67
+ $ result = $ this ->graphQlQuery ($ query );
68
+
69
+ $ this ->assertArrayNotHasKey ('errors ' , $ result );
70
+ $ this ->assertArrayHasKey ('aggregations ' , $ result ['products ' ]);
71
+
72
+ $ priceAggregation = array_filter (
73
+ $ result ['products ' ]['aggregations ' ],
74
+ function ($ a ) {
75
+ return $ a ['attribute_code ' ] == 'price ' ;
76
+ }
77
+ );
78
+ $ this ->assertNotEmpty ($ priceAggregation );
79
+ $ priceAggregation = reset ($ priceAggregation );
80
+ $ this ->assertEquals ('Price ' , $ priceAggregation ['label ' ]);
81
+ $ this ->assertEquals (4 , $ priceAggregation ['count ' ]);
82
+ $ expectedOptions = [
83
+ ['label ' => '10-20 ' , 'value ' => '10_20 ' , 'count ' => '2 ' ],
84
+ ['label ' => '20-30 ' , 'value ' => '20_30 ' , 'count ' => '1 ' ],
85
+ ['label ' => '30-40 ' , 'value ' => '30_40 ' , 'count ' => '1 ' ],
86
+ ['label ' => '40-50 ' , 'value ' => '40_50 ' , 'count ' => '1 ' ]
87
+ ];
88
+ $ this ->assertEquals ($ expectedOptions , $ priceAggregation ['options ' ]);
89
+ }
90
+
91
+ /**
92
+ * @magentoApiDataFixture Magento/Store/_files/second_store_with_second_currency.php
93
+ * @magentoApiDataFixture Magento/Catalog/_files/products_for_search.php
94
+ */
95
+ public function testAggregationPriceRangesWithCurrencyHeader ()
96
+ {
97
+ // add USD as allowed (not default) currency
98
+ $ objectManager = Bootstrap::getObjectManager ();
99
+ /* @var Store $store */
100
+ $ store = $ objectManager ->create (Store::class);
101
+ $ store ->load ('fixture_second_store ' );
102
+ /** @var Config $configResource */
103
+ $ configResource = $ objectManager ->get (Config::class);
104
+ $ configResource ->saveConfig (
105
+ Currency::XML_PATH_CURRENCY_ALLOW ,
106
+ 'USD ' ,
107
+ ScopeInterface::SCOPE_STORES ,
108
+ $ store ->getId ()
109
+ );
110
+ // Configuration cache clean is required to reload currency setting
111
+ /** @var System $config */
112
+ $ config = $ objectManager ->get (System::class);
113
+ $ config ->clean ();
114
+
115
+ $ headerMap ['Store ' ] = 'fixture_second_store ' ;
116
+ $ headerMap ['Content-Currency ' ] = 'USD ' ;
117
+ $ query = $ this ->getGraphQlQuery (
118
+ '"search_product_1", "search_product_2", "search_product_3", "search_product_4" ,"search_product_5" '
119
+ );
120
+ $ result = $ this ->graphQlQuery ($ query , [], '' , $ headerMap );
121
+ $ this ->assertArrayNotHasKey ('errors ' , $ result );
122
+ $ this ->assertArrayHasKey ('aggregations ' , $ result ['products ' ]);
123
+ $ priceAggregation = array_filter (
124
+ $ result ['products ' ]['aggregations ' ],
125
+ function ($ a ) {
126
+ return $ a ['attribute_code ' ] == 'price ' ;
127
+ }
128
+ );
129
+ $ this ->assertNotEmpty ($ priceAggregation );
130
+ $ priceAggregation = reset ($ priceAggregation );
131
+ $ this ->assertEquals ('Price ' , $ priceAggregation ['label ' ]);
132
+ $ this ->assertEquals (4 , $ priceAggregation ['count ' ]);
133
+ $ expectedOptions = [
134
+ ['label ' => '10-20 ' , 'value ' => '10_20 ' , 'count ' => '2 ' ],
135
+ ['label ' => '20-30 ' , 'value ' => '20_30 ' , 'count ' => '1 ' ],
136
+ ['label ' => '30-40 ' , 'value ' => '30_40 ' , 'count ' => '1 ' ],
137
+ ['label ' => '40-50 ' , 'value ' => '40_50 ' , 'count ' => '1 ' ]
138
+ ];
139
+ $ this ->assertEquals ($ expectedOptions , $ priceAggregation ['options ' ]);
140
+ }
141
+
142
+ private function getGraphQlQuery (string $ skus )
143
+ {
144
+ return <<<QUERY
145
+ {
146
+ products(filter: {sku: {in: [ {$ skus }]}}){
147
+ aggregations{
148
+ label
149
+ attribute_code
150
+ count
151
+ options{
152
+ label
153
+ value
154
+ count
155
+ }
156
+ }
157
+ }
158
+ }
159
+ QUERY ;
160
+ }
72
161
}
0 commit comments