Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ProductListTest.php
Go to the documentation of this file.
1 <?php
8 
12 class ProductListTest extends \PHPUnit\Framework\TestCase
13 {
17  protected $block;
18 
22  protected $objectManager;
23 
24  protected function setUp()
25  {
27  $this->block = $this->objectManager->create(
28  \Magento\CatalogWidget\Block\Product\ProductsList::class
29  );
30  }
31 
44  public function testCreateCollection()
45  {
46  // Reindex EAV attributes to enable products filtration by created multiselect attribute
48  $eavIndexerProcessor = $this->objectManager->get(
49  \Magento\Catalog\Model\Indexer\Product\Eav\Processor::class
50  );
51  $eavIndexerProcessor->reindexAll();
52 
53  // Prepare conditions
56  \Magento\Catalog\Model\ResourceModel\Eav\Attribute::class
57  );
58  $attribute->load('multiselect_attribute', 'attribute_code');
59  $multiselectAttributeOptionIds = [];
60  foreach ($attribute->getOptions() as $option) {
61  if ($option->getValue()) {
62  $multiselectAttributeOptionIds[] = $option->getValue();
63  }
64  }
65  $encodedConditions = '^[`1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,'
66  . '`aggregator`:`all`,`value`:`1`,`new_child`:``^],`1--1`:'
67  . '^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Product`,'
68  . '`attribute`:`multiselect_attribute`,`operator`:`^[^]`,'
69  . '`value`:[`' . implode(',', $multiselectAttributeOptionIds) . '`]^]^]';
70  $this->block->setData('conditions_encoded', $encodedConditions);
71 
72  // Load products collection filtered using specified conditions and perform assertions
73  $productCollection = $this->block->createCollection();
74  $productCollection->load();
75  $this->assertEquals(
76  1,
77  $productCollection->count(),
78  "Product collection was not filtered according to the widget condition."
79  );
80  }
81 
88  public function testCreateCollectionWithDropdownAttribute()
89  {
92  \Magento\Catalog\Model\ResourceModel\Eav\Attribute::class
93  );
94  $attribute->load('dropdown_attribute', 'attribute_code');
95  $dropdownAttributeOptionIds = [];
96  foreach ($attribute->getOptions() as $option) {
97  if ($option->getValue()) {
98  $dropdownAttributeOptionIds[] = $option->getValue();
99  }
100  }
101  $encodedConditions = '^[`1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,' .
102  '`aggregator`:`any`,`value`:`1`,`new_child`:``^],`1--1`:^[`type`:`Magento||CatalogWidget||Model||Rule|' .
103  '|Condition||Product`,`attribute`:`dropdown_attribute`,`operator`:`==`,`value`:`'
104  . $dropdownAttributeOptionIds[0] . '`^],`1--2`:^[`type`:`Magento||CatalogWidget||Model||Rule|' .
105  '|Condition||Product`,`attribute`:`dropdown_attribute`,`operator`:`==`,`value`:`'
106  . $dropdownAttributeOptionIds[1] . '`^]^]';
107  $this->block->setData('conditions_encoded', $encodedConditions);
108  $this->performAssertions(2);
109  $attribute->setUsedInProductListing(0);
110  $attribute->save();
111  $this->performAssertions(2);
112  $attribute->setIsGlobal(1);
113  $attribute->save();
114  $this->performAssertions(2);
115  }
116 
123  private function performAssertions(int $count)
124  {
125  // Load products collection filtered using specified conditions and perform assertions.
126  $productCollection = $this->block->createCollection();
127  $productCollection->load();
128  $this->assertEquals(
129  $count,
130  $productCollection->count(),
131  "Product collection was not filtered according to the widget condition."
132  );
133  }
134 
146  public function testCreateCollectionForSku($encodedConditions, $sku)
147  {
148  $this->block->setData('conditions_encoded', $encodedConditions);
149  $productCollection = $this->block->createCollection();
150  $productCollection->load();
151  $this->assertEquals(
152  1,
153  $productCollection->count(),
154  "Product collection was not filtered according to the widget condition."
155  );
156  $this->assertEquals($sku, $productCollection->getFirstItem()->getSku());
157  }
158 
163  {
164  return [
165  'contains' => ['^[`1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,'
166  . '`aggregator`:`all`,`value`:`1`,`new_child`:``^],'
167  . '`1--1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Product`,'
168  . '`attribute`:`sku`,`operator`:`^[^]`,`value`:`virtual`^]^]' , 'virtual-product'],
169  'not contains' => ['^[`1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Combine`,'
170  . '`aggregator`:`all`,`value`:`1`,`new_child`:``^],'
171  . '`1--1`:^[`type`:`Magento||CatalogWidget||Model||Rule||Condition||Product`,'
172  . '`attribute`:`sku`,`operator`:`!^[^]`,`value`:`virtual`^]^]', 'product-with-xss']
173  ];
174  }
175 }
$count
Definition: recent.phtml:13