6
6
7
7
namespace Magento \Rule \Model \Condition \Sql ;
8
8
9
- use Magento \Catalog \Setup \CategorySetup ;
10
- use Magento \Catalog \Test \Fixture \MultiselectAttribute ;
11
- use Magento \Catalog \Test \Fixture \Product as ProductFixture ;
12
- use Magento \Eav \Model \Entity \Attribute \Backend \ArrayBackend ;
13
- use Magento \Eav \Model \Entity \Attribute \Source \Table ;
9
+ use Magento \Catalog \Model \ResourceModel \Eav \Attribute ;
14
10
use Magento \Eav \Test \Fixture \AttributeOption as AttributeOptionFixture ;
15
- use Magento \TestFramework \Fixture \DataFixture ;
16
11
use Magento \TestFramework \Helper \Bootstrap ;
12
+ use Magento \TestFramework \Fixture \DataFixture ;
13
+ use Magento \Catalog \Test \Fixture \MultiselectAttribute ;
17
14
use Magento \Catalog \Model \ResourceModel \Product \CollectionFactory as ProductCollectionFactory ;
18
15
use Magento \CatalogWidget \Model \RuleFactory ;
19
16
use Magento \CatalogWidget \Model \Rule \Condition \Combine as CombineCondition ;
@@ -35,26 +32,17 @@ protected function setUp(): void
35
32
}
36
33
37
34
/**
38
- * @return void
35
+ * @param array $conditions
36
+ * @param string $expectedSql
39
37
* @dataProvider attachConditionToCollectionDataProvider
38
+ * @return void
40
39
*/
41
40
#[
42
- DataFixture(CategoryFixture::class, ['url_path ' => 'cat1 ' ], 'cat1 ' ),
43
- DataFixture(
44
- MultiselectAttribute::class,
45
- [
46
- 'entity_type_id ' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID ,
47
- 'source_model ' => Table::class,
48
- 'backend_model ' => ArrayBackend::class,
49
- 'attribute_code ' => 'product_custom_attribute_multiselect '
50
- ],
51
- 'multiselect_custom_attribute '
52
- ),
41
+ DataFixture(MultiselectAttribute::class, ['attribute_code ' => 'multi_select_attr ' ], 'multiselect ' ),
53
42
DataFixture(
54
43
AttributeOptionFixture::class,
55
44
[
56
- 'entity_type ' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID ,
57
- 'attribute_code ' => '$multiselect_custom_attribute.attribute_code$ ' ,
45
+ 'attribute_code ' => 'multiselect.attribute_code$ ' ,
58
46
'label ' => 'red ' ,
59
47
'sort_order ' => 20
60
48
],
@@ -63,91 +51,44 @@ protected function setUp(): void
63
51
DataFixture(
64
52
AttributeOptionFixture::class,
65
53
[
66
- 'entity_type ' => CategorySetup::CATALOG_PRODUCT_ENTITY_TYPE_ID ,
67
- 'attribute_code ' => '$multiselect_custom_attribute.attribute_code$ ' ,
54
+ 'attribute_code ' => 'multiselect.attribute_code$ ' ,
68
55
'sort_order ' => 10 ,
69
56
'label ' => 'white ' ,
70
57
'is_default ' => true
71
58
],
72
59
'multiselect_custom_attribute_option_2 '
73
- ),
74
- DataFixture(ProductFixture::class,['sku ' => 'sku1 ' , 'category_ids ' => ['$cat1.id$ ' ]], 'p1 ' ),
75
- DataFixture(ProductFixture::class,['sku ' => 'sku2 ' , 'category_ids ' => ['$cat1.id$ ' ]], 'p2 ' ),
76
- DataFixture(ProductFixture::class,['sku ' => 'sku3 ' , 'category_ids ' => ['$cat1.id$ ' ]], 'p3 ' ),
77
- DataFixture(ProductFixture::class,['sku ' => 'sku4 ' , 'category_ids ' => ['$cat1.id$ ' ]], 'p4 ' ),
78
- DataFixture(ProductFixture::class, ['product_links ' => [['sku ' => '$p1.sku$ ' , 'type ' => 'related ' ]]], 'p2 ' ),
79
- DataFixture(ProductFixture::class, as: 'p3 ' ),
80
- DataFixture(ProductFixture::class, as: 'p4 ' ),
81
- DataFixture(ProductFixture::class, as: 'p5 ' ),
82
- DataFixture(ProductFixture::class, ['product_links ' => [['sku ' => '$p4.sku$ ' , 'type ' => 'upsell ' ]]], 'p6 ' ),
83
- DataFixture(ProductFixture::class, as: 'p7 ' ),
84
- DataFixture(ProductFixture::class, as: 'p8 ' ),
85
- DataFixture(ProductFixture::class, ['product_links ' => [['sku ' => '$p8.sku$ ' , 'type ' => 'crosssell ' ]]], 'p9 ' ),
86
- DataFixture(RuleConditionFixture::class, ['attribute ' => 'sku ' , 'value ' => '$p2.sku$ ' ,], 'rule1Condition ' ),
87
- DataFixture(RuleConditionsFixture::class, ['conditions ' => ['$rule1Condition$ ' ]], 'rule1Conditions ' ),
88
- DataFixture(RuleActionFixture::class, ['attribute ' => 'sku ' , 'value ' => '$p3.sku$ ' ,], 'rule1Action ' ),
89
- DataFixture(RuleActionsFixture::class, ['conditions ' => ['$rule1Action$ ' ]], 'rule1Actions ' ),
90
- DataFixture(
91
- RuleFixture::class,
92
- ['actions ' => '$rule1Actions$ ' , 'conditions ' => '$rule1Conditions$ ' , 'apply_to ' => Rule::RELATED_PRODUCTS ],
93
- 'rule1 '
94
- ),
95
- DataFixture(RuleConditionFixture::class, ['attribute ' => 'sku ' , 'value ' => '$p6.sku$ ' ,], 'rule2Condition ' ),
96
- DataFixture(RuleConditionsFixture::class, ['conditions ' => ['$rule2Condition$ ' ]], 'rule2Conditions ' ),
97
- DataFixture(RuleActionFixture::class, ['attribute ' => 'sku ' , 'value ' => '$p5.sku$ ' ,], 'rule2Action ' ),
98
- DataFixture(RuleActionsFixture::class, ['conditions ' => ['$rule2Action$ ' ]], 'rule2Actions ' ),
99
- DataFixture(
100
- RuleFixture::class,
101
- ['actions ' => '$rule2Actions$ ' , 'conditions ' => '$rule2Conditions$ ' , 'apply_to ' => Rule::UP_SELLS ],
102
- 'rule2 '
103
- ),
104
- DataFixture(RuleConditionFixture::class, ['attribute ' => 'sku ' , 'value ' => '$p9.sku$ ' ,], 'rule3Condition ' ),
105
- DataFixture(RuleConditionsFixture::class, ['conditions ' => ['$rule3Condition$ ' ]], 'rule3Conditions ' ),
106
- DataFixture(RuleActionFixture::class, ['attribute ' => 'sku ' , 'value ' => '$p7.sku$ ' ,], 'rule3Action ' ),
107
- DataFixture(RuleActionsFixture::class, ['conditions ' => ['$rule3Action$ ' ]], 'rule3Actions ' ),
108
- DataFixture(
109
- RuleFixture::class,
110
- ['actions ' => '$rule3Actions$ ' , 'conditions ' => '$rule3Conditions$ ' , 'apply_to ' => Rule::CROSS_SELLS ],
111
- 'rule3 '
112
- ),
60
+ )
113
61
]
114
- public function testAttachConditionToCollection (): void
62
+ public function testAttachConditionToCollection (array $ conditions , string $ expectedSql ): void
115
63
{
116
64
/** @var ProductCollectionFactory $collectionFactory */
117
65
$ collectionFactory = Bootstrap::getObjectManager ()->create (ProductCollectionFactory::class);
118
66
$ collection = $ collectionFactory ->create ();
119
-
67
+ /*$multiselect = DataFixtureStorageManager::getStorage()->get(
68
+ 'multi_select_attr'
69
+ );*/
70
+ $ attribute = Bootstrap::getObjectManager ()->create (
71
+ Attribute::class
72
+ );
73
+ $ attribute ->load ('multi_select_attr ' , 'attribute_code ' );
74
+ $ multiselectAttributeOptionIds = [];
75
+ foreach ($ attribute ->getOptions () as $ option ) {
76
+ if ($ option ->getValue ()) {
77
+ $ multiselectAttributeOptionIds [] = $ option ->getValue ();
78
+ }
79
+ }
80
+ $ conditions ['1--4 ' ] = [
81
+ 'type ' => ProductCondition::class,
82
+ 'attribute ' => 'multiselect_attribute ' ,
83
+ 'operator ' => '{} ' ,
84
+ 'value ' => implode (', ' , $ multiselectAttributeOptionIds ),
85
+ ];
120
86
/** @var RuleFactory $ruleFactory */
121
87
$ ruleFactory = Bootstrap::getObjectManager ()->create (RuleFactory::class);
122
88
$ rule = $ ruleFactory ->create ();
123
89
124
90
$ ruleConditionArray = [
125
- 'conditions ' => [
126
- '1 ' => [
127
- 'type ' => CombineCondition::class,
128
- 'aggregator ' => 'all ' ,
129
- 'value ' => '1 ' ,
130
- 'new_child ' => '' ,
131
- ],
132
- '1--1 ' => [
133
- 'type ' => ProductCondition::class,
134
- 'attribute ' => 'category_ids ' ,
135
- 'operator ' => '== ' ,
136
- 'value ' => '3 ' ,
137
- ],
138
- '1--2 ' => [
139
- 'type ' => ProductCondition::class,
140
- 'attribute ' => 'special_to_date ' ,
141
- 'operator ' => '== ' ,
142
- 'value ' => '2017-09-15 ' ,
143
- ],
144
- '1--3 ' => [
145
- 'type ' => ProductCondition::class,
146
- 'attribute ' => 'sku ' ,
147
- 'operator ' => '() ' ,
148
- 'value ' => 'sku1,sku2,sku3,sku4,sku5 ' ,
149
- ]
150
- ],
91
+ 'conditions ' => $ conditions ,
151
92
];
152
93
153
94
$ rule ->loadPost ($ ruleConditionArray );
@@ -156,7 +97,7 @@ public function testAttachConditionToCollection(): void
156
97
$ whereString = "/\(category_id IN \('3'\).+\(`e`\.`entity_id` = '2017-09-15 00:00:00'\) "
157
98
.".+\(`e`\.`sku` IN \('sku1', 'sku2', 'sku3', 'sku4', 'sku5'\) "
158
99
. ".+ORDER BY \(FIELD\(`e`.`sku`, 'sku1', 'sku2', 'sku3', 'sku4', 'sku5'\)\)/ " ;
159
- $ this ->assertEquals ( 1 , preg_match ( $ whereString , $ collection ->getSelectSql (true ) ));
100
+ $ this ->assertStringContainsString ( $ expectedSql , $ collection ->getSelectSql (true ));
160
101
}
161
102
162
103
/**
@@ -166,22 +107,33 @@ public static function attachConditionToCollectionDataProvider(): array
166
107
{
167
108
return [
168
109
[
169
- 'productName ' => 'p2 ' ,
170
- 'relatedProducts ' => ['p1 ' , 'p3 ' ],
171
- 'upsellProducts ' => [],
172
- 'crosssellProducts ' => [],
173
- 'config ' => [
174
- 'catalog/magento_targetrule/related_position_behavior ' => Rule::BOTH_SELECTED_AND_RULE_BASED
175
- ]
176
- ],
177
- [
178
- 'productName ' => 'p2 ' ,
179
- 'relatedProducts ' => ['p1 ' ],
180
- 'upsellProducts ' => [],
181
- 'crosssellProducts ' => [],
182
- 'config ' => [
183
- 'catalog/magento_targetrule/related_position_behavior ' => Rule::SELECTED_ONLY
184
- ]
110
+ [
111
+ '1 ' => [
112
+ 'type ' => CombineCondition::class,
113
+ 'aggregator ' => 'all ' ,
114
+ 'value ' => '1 ' ,
115
+ 'new_child ' => '' ,
116
+ ],
117
+ '1--1 ' => [
118
+ 'type ' => ProductCondition::class,
119
+ 'attribute ' => 'category_ids ' ,
120
+ 'operator ' => '== ' ,
121
+ 'value ' => '3 ' ,
122
+ ],
123
+ '1--2 ' => [
124
+ 'type ' => ProductCondition::class,
125
+ 'attribute ' => 'special_to_date ' ,
126
+ 'operator ' => '== ' ,
127
+ 'value ' => '2017-09-15 ' ,
128
+ ],
129
+ '1--3 ' => [
130
+ 'type ' => ProductCondition::class,
131
+ 'attribute ' => 'sku ' ,
132
+ 'operator ' => '() ' ,
133
+ 'value ' => 'sku1,sku2,sku3,sku4,sku5 ' ,
134
+ ]
135
+ ],
136
+ "WHERE ((((`e`.`entity_id` IN (SELECT `catalog_category_product`.`product_id` FROM `catalog_category_product` WHERE (category_id IN ('3')))) AND(`e`.`entity_id` = '2017-09-15 00:00:00') AND(`e`.`sku` IN ('sku1', 'sku2', 'sku3', 'sku4', 'sku5')) ))) AND (e.created_in <= 1) AND (e.updated_in > 1) ORDER BY (FIELD(`e`.`sku`, 'sku1', 'sku2', 'sku3', 'sku4', 'sku5')) "
185
137
]
186
138
];
187
139
}
0 commit comments