Skip to content

Commit 74e6857

Browse files
committed
ACP2E-1223: When trying to use certain multi-selects within the Magento admin for coupon report, they don't always work as intended.
1 parent 5dc13c3 commit 74e6857

File tree

4 files changed

+123
-20
lines changed

4 files changed

+123
-20
lines changed

app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,8 @@ protected function _initFormValues()
201201
{
202202
$data = $this->getFilterData()->getData();
203203
foreach ($data as $key => $value) {
204-
if (is_array($value) && isset($value[0])) {
205-
$data[$key] = explode(',', $value[0]);
204+
if (is_array($value) && count($value) === 1) {
205+
$data[$key] = explode(',', reset($value));
206206
}
207207
}
208208
$this->getForm()->addValues($data);

app/code/Magento/Reports/Block/Adminhtml/Sales/Coupons/Grid.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,11 @@ protected function _addCustomFilter($collection, $filterData)
211211
{
212212
if ($filterData->getPriceRuleType()) {
213213
$rulesList = $filterData->getData('rules_list');
214-
if (isset($rulesList[0])) {
215-
$rulesIds = explode(',', $rulesList[0]);
216-
$collection->addRuleFilter($rulesIds);
214+
if (is_array($rulesList) && count($rulesList) > 0) {
215+
if (count($rulesList) === 1) {
216+
$rulesList = explode(',', reset($rulesList));
217+
}
218+
$collection->addRuleFilter($rulesList);
217219
}
218220
}
219221

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Reports\Test\Unit\Block\Adminhtml\Filter;
9+
10+
use Magento\Backend\Block\Template\Context;
11+
use Magento\Framework\Data\Form;
12+
use Magento\Framework\Data\Form\Element\AbstractElement;
13+
use Magento\Framework\Data\Form\Element\Collection;
14+
use Magento\Framework\Data\FormFactory;
15+
use Magento\Framework\DataObject;
16+
use Magento\Framework\Registry;
17+
use Magento\Framework\UrlInterface;
18+
use PHPUnit\Framework\MockObject\MockObject;
19+
use PHPUnit\Framework\TestCase;
20+
use ReflectionClass;
21+
22+
class FormTest extends TestCase
23+
{
24+
/**
25+
* @var Context|MockObject
26+
*/
27+
private $context;
28+
29+
/**
30+
* @var Registry|MockObject
31+
*/
32+
private $registry;
33+
34+
/**
35+
* @var FormFactory|MockObject
36+
*/
37+
private $formFactory;
38+
39+
/**
40+
* @var \Magento\Reports\Block\Adminhtml\Filter\Form
41+
*/
42+
private $model;
43+
44+
/**
45+
* @inheritdoc
46+
*/
47+
protected function setUp(): void
48+
{
49+
parent::setUp();
50+
$this->context = $this->createMock(Context::class);
51+
$this->registry = $this->createMock(Registry::class);
52+
$this->formFactory = $this->createMock(FormFactory::class);
53+
$this->context->method('getUrlBuilder')
54+
->willReturn($this->getMockForAbstractClass(UrlInterface::class));
55+
$this->model = new \Magento\Reports\Block\Adminhtml\Filter\Form(
56+
$this->context,
57+
$this->registry,
58+
$this->formFactory
59+
);
60+
}
61+
62+
/**
63+
* @return void
64+
* @throws \ReflectionException
65+
*/
66+
public function testMultiselectInitialValues(): void
67+
{
68+
$this->context->method('getUrlBuilder')
69+
->willReturn($this->getMockForAbstractClass(UrlInterface::class));
70+
$this->model->setData('filter_data', new DataObject(['multiselect' => ['5', '6']]));
71+
$form = $this->getMockBuilder(Form::class)
72+
->disableOriginalConstructor()
73+
->onlyMethods(['getElements'])
74+
->getMockForAbstractClass();
75+
$element = $this->getMockBuilder(AbstractElement::class)
76+
->disableOriginalConstructor()
77+
->getMockForAbstractClass();
78+
79+
$element->setId('multiselect');
80+
$form->method('getElements')->willReturn(new Collection($form));
81+
$reflection = new ReflectionClass($form);
82+
$reflectionProp = $reflection->getProperty('_allElements');
83+
$reflectionProp->setAccessible(true);
84+
$reflectionProp->setValue($form, new Collection($form));
85+
$form->addElement($element);
86+
$this->model->setForm($form);
87+
$reflection = new ReflectionClass($this->model);
88+
$reflectionMethod = $reflection->getMethod('_initFormValues');
89+
$reflectionMethod->setAccessible(true);
90+
$reflectionMethod->invoke($this->model);
91+
$this->assertEquals(['5', '6'], $this->model->getForm()->getElement('multiselect')->getValue());
92+
}
93+
}

app/code/Magento/Reports/Test/Unit/Block/Adminhtml/Sales/Coupons/GridTest.php

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -67,32 +67,37 @@ protected function setUp(): void
6767
* @dataProvider getCountTotalsDataProvider
6868
*
6969
* @param string $reportType
70-
* @param int $priceRuleType
70+
* @param array|null $rulesList
7171
* @param int $collectionSize
7272
* @param bool $expectedCountTotals
73+
* @param array|null $expectedRuleFilter
7374
* @return void
7475
*/
7576
public function testGetCountTotals(
7677
string $reportType,
77-
int $priceRuleType,
78+
?array $rulesList,
7879
int $collectionSize,
79-
bool $expectedCountTotals
80+
bool $expectedCountTotals,
81+
?array $expectedRuleFilter = null
8082
): void {
8183
$filterData = new DataObject();
8284
$filterData->setData('report_type', $reportType);
8385
$filterData->setData('period_type', 'day');
8486
$filterData->setData('from', '2000-01-01');
8587
$filterData->setData('to', '2000-01-30');
8688
$filterData->setData('store_ids', '1');
87-
$filterData->setData('price_rule_type', $priceRuleType);
88-
if ($priceRuleType) {
89-
$filterData->setData('rules_list', ['0,1']);
90-
}
89+
$filterData->setData('price_rule_type', $rulesList !== null);
90+
$filterData->setData('rules_list', $rulesList);
9191
$filterData->setData('order_statuses', 'statuses');
9292
$this->model->setFilterData($filterData);
9393

9494
$resourceCollectionName = $this->model->getResourceCollectionName();
95-
$collectionMock = $this->buildBaseCollectionMock($filterData, $resourceCollectionName, $collectionSize);
95+
$collectionMock = $this->buildBaseCollectionMock(
96+
$filterData,
97+
$resourceCollectionName,
98+
$collectionSize,
99+
$expectedRuleFilter
100+
);
96101

97102
$store = $this->getMockBuilder(StoreInterface::class)
98103
->getMock();
@@ -111,23 +116,26 @@ public function testGetCountTotals(
111116
public function getCountTotalsDataProvider(): array
112117
{
113118
return [
114-
['created_at_shipment', 0, 0, false],
115-
['created_at_shipment', 0, 1, true],
116-
['updated_at_order', 0, 1, true],
117-
['updated_at_order', 1, 1, true],
119+
['created_at_shipment', null, 0, false],
120+
['created_at_shipment', null, 1, true],
121+
['updated_at_order', null, 1, true],
122+
['updated_at_order', ['1,2'], 1, true, ['1', '2']],
123+
['updated_at_order', ['1', '2'], 1, true, ['1', '2']],
118124
];
119125
}
120126

121127
/**
122-
* @param \Magento\Framework\DataObject $filterData
128+
* @param DataObject $filterData
123129
* @param string $resourceCollectionName
124130
* @param int $collectionSize
131+
* @param array|null $ruleFilter
125132
* @return MockObject
126133
*/
127134
private function buildBaseCollectionMock(
128135
DataObject $filterData,
129136
string $resourceCollectionName,
130-
int $collectionSize
137+
int $collectionSize,
138+
?array $ruleFilter
131139
): MockObject {
132140
$collectionMock = $this->getMockBuilder($resourceCollectionName)
133141
->disableOriginalConstructor()
@@ -159,7 +167,7 @@ private function buildBaseCollectionMock(
159167
if ($filterData->getData('price_rule_type')) {
160168
$collectionMock->expects($this->once())
161169
->method('addRuleFilter')
162-
->with(\explode(',', $filterData->getData('rules_list')[0]))
170+
->with($ruleFilter)
163171
->willReturnSelf();
164172
}
165173

0 commit comments

Comments
 (0)