7
7
namespace Magento \Rule \Model \Condition \Sql ;
8
8
9
9
use Magento \Catalog \Model \ResourceModel \Eav \Attribute ;
10
+ use Magento \Catalog \Model \ResourceModel \Product \Collection \ProductLimitation ;
10
11
use Magento \Catalog \Setup \CategorySetup ;
11
12
use Magento \Eav \Model \Entity \Attribute \Backend \ArrayBackend ;
12
- use Magento \Eav \Model \Entity \Attribute \Source \Table ;
13
13
use Magento \Eav \Test \Fixture \AttributeOption as AttributeOptionFixture ;
14
+ use Magento \Framework \DB \Select ;
14
15
use Magento \Framework \Exception \LocalizedException ;
15
16
use Magento \TestFramework \Helper \Bootstrap ;
16
17
use Magento \TestFramework \Fixture \DataFixture ;
19
20
use Magento \CatalogWidget \Model \RuleFactory ;
20
21
use Magento \CatalogWidget \Model \Rule \Condition \Combine as CombineCondition ;
21
22
use Magento \CatalogWidget \Model \Rule \Condition \Product as ProductCondition ;
23
+ use Magento \Catalog \Model \ResourceModel \Product \Collection ;
22
24
use PHPUnit \Framework \TestCase ;
23
25
24
26
/**
@@ -52,12 +54,13 @@ protected function setUp(): void
52
54
MultiselectAttribute::class,
53
55
[
54
56
'entity_type_id ' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID ,
55
- 'source_model ' => Table::class ,
56
- // 'backend_model' => ArrayBackend::class,
57
+ 'source_model ' => null ,
58
+ 'backend_model ' => ArrayBackend::class,
57
59
'attribute_code ' => 'multi_select_attr ' ,
58
60
'is_visible_on_front ' => true ,
59
61
'frontend_input ' => 'multiselect ' ,
60
- 'backend_type ' => 'static ' //nu asa ?!
62
+ 'backend_type ' => 'text ' ,
63
+ 'attribute_model ' => Attribute::class,
61
64
],
62
65
'multiselect '
63
66
),
@@ -115,6 +118,21 @@ public function testAttachConditionToCollection(
115
118
];
116
119
117
120
$ rule ->loadPost ($ ruleConditionArray );
121
+ foreach ($ rule ->getConditions ()->getConditions () as $ condition ) {
122
+ if ($ condition ->getAttribute () === 'multi_select_attr ' ) {
123
+ $ productCollection = $ this ->createMock (Collection::class);
124
+ $ limitationFilters = $ this ->createMock (ProductLimitation::class);
125
+ $ limitationFilters ->expects ($ this ->any ())->method ('isUsingPriceIndex ' )->willReturn (false );
126
+ $ productCollection ->expects ($ this ->any ())
127
+ ->method ('getLimitationFilters ' )
128
+ ->willReturn ($ limitationFilters );
129
+ $ productCollection ->expects ($ this ->any ())->method ('isEnabledFlat ' )->willReturn (true );
130
+ $ select = $ this ->createMock (Select::class);
131
+ $ select ->expects ($ this ->any ())->method ('getPart ' )->willReturn ([]);
132
+ $ productCollection ->expects ($ this ->any ())->method ('getSelect ' )->willReturn ($ select );
133
+ $ condition ->addToCollection ($ productCollection );
134
+ }
135
+ }
118
136
$ this ->model ->attachConditionToCollection ($ collection , $ rule ->getConditions ());
119
137
120
138
$ this ->assertStringContainsString ($ expectedWhere , $ collection ->getSelectSql (true ));
@@ -127,7 +145,7 @@ public function testAttachConditionToCollection(
127
145
public static function attachConditionToCollectionDataProvider (): array
128
146
{
129
147
return [
130
- /* [
148
+ [
131
149
[
132
150
'1 ' => [
133
151
'type ' => CombineCondition::class,
@@ -159,7 +177,7 @@ public static function attachConditionToCollectionDataProvider(): array
159
177
"AND(`e`.`entity_id` = '2017-09-15 00:00:00') AND(`e`.`sku` IN " .
160
178
"('sku1', 'sku2', 'sku3', 'sku4', 'sku5')) ))) AND (e.created_in <= 1) AND (e.updated_in > 1) " ,
161
179
"ORDER BY (FIELD(`e`.`sku`, 'sku1', 'sku2', 'sku3', 'sku4', 'sku5')) "
162
- ],*/
180
+ ],
163
181
[
164
182
[
165
183
'1 ' => [
@@ -184,12 +202,15 @@ public static function attachConditionToCollectionDataProvider(): array
184
202
'type ' => ProductCondition::class,
185
203
'attribute ' => 'multi_select_attr ' ,
186
204
'operator ' => '{} ' ,
205
+ 'collected_attributes ' => ['multiselect_attribute ' => true ],
187
206
]
188
207
],
189
208
"WHERE ((((`e`.`entity_id` IN (SELECT `catalog_category_product`.`product_id` FROM " .
190
- "`catalog_category_product` WHERE (category_id IN ('3')))) AND(`e`.`sku` IN " .
191
- "('sku1', 'sku2', 'sku3')) AND(`multiselect_attribute` LIKE '%%') ))) AND " .
192
- "(e.created_in <= 1) AND (e.updated_in > 1) " ,
209
+ "`catalog_category_product` WHERE (category_id IN ('3')))) AND(`e`.`sku` IN ('sku1', 'sku2', 'sku3')) " .
210
+ " AND(`at_multi_select_attr`.`value` IN ('13', '14') OR " .
211
+ "(FIND_IN_SET ('13', `at_multi_select_attr`.`value`) > 0) OR " .
212
+ "(FIND_IN_SET ('14', `at_multi_select_attr`.`value`) > 0)) ))) AND " .
213
+ "(e.created_in <= 1) AND (e.updated_in > 1) " ,
193
214
"ORDER BY (FIELD(`e`.`sku`, 'sku1', 'sku2', 'sku3')) "
194
215
]
195
216
];
0 commit comments