Skip to content

Commit 1886177

Browse files
committed
MC-37902: Create automated test for "Paging and sort by function on widget grid"
1 parent 632a7c6 commit 1886177

File tree

3 files changed

+436
-0
lines changed

3 files changed

+436
-0
lines changed
Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
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\Widget\Block\Adminhtml\Widget;
9+
10+
use Magento\Framework\App\RequestInterface;
11+
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
12+
use Magento\Framework\ObjectManagerInterface;
13+
use Magento\Framework\View\LayoutInterface;
14+
use Magento\Framework\View\Result\PageFactory;
15+
use Magento\TestFramework\Helper\Bootstrap;
16+
use Magento\Theme\Model\ResourceModel\Theme as ThemeResource;
17+
use Magento\Theme\Model\ThemeFactory;
18+
use PHPUnit\Framework\TestCase;
19+
20+
/**
21+
* Checks widget grid filtering and sorting
22+
*
23+
* @magentoAppArea adminhtml
24+
* @magentoAppIsolation enabled
25+
* @magentoDbIsolation enabled
26+
*/
27+
class InstanceTest extends TestCase
28+
{
29+
/** @var ObjectManagerInterface */
30+
private $objectManager;
31+
32+
/** @var PageFactory */
33+
private $pageFactory;
34+
35+
/** @var RequestInterface */
36+
private $request;
37+
38+
/**
39+
* @inheritdoc
40+
*/
41+
protected function setUp(): void
42+
{
43+
parent::setUp();
44+
45+
$this->objectManager = Bootstrap::getObjectManager();
46+
$this->request = $this->objectManager->get(RequestInterface::class);
47+
$this->pageFactory = $this->objectManager->get(PageFactory::class);
48+
}
49+
50+
/**
51+
* @dataProvider gridFiltersDataProvider
52+
*
53+
* @magentoDataFixture Magento/Widget/_files/widgets.php
54+
*
55+
* @param array $filter
56+
* @param array $expectedWidgets
57+
* @return void
58+
*/
59+
public function testGridFiltering(array $filter, array $expectedWidgets): void
60+
{
61+
$this->request->setParams($filter);
62+
$collection = $this->getGridCollection();
63+
64+
$this->assertWidgets($expectedWidgets, $collection);
65+
}
66+
67+
/**
68+
* @return array
69+
*/
70+
public function gridFiltersDataProvider(): array
71+
{
72+
return [
73+
'first_page' => [
74+
'filter' => [
75+
'limit' => 2,
76+
'page' => 1,
77+
],
78+
'expected_widgets' => [
79+
'cms page widget title',
80+
'product link widget title',
81+
],
82+
],
83+
'second_page' => [
84+
'filter' => [
85+
'limit' => 2,
86+
'page' => 2,
87+
],
88+
'expected_widgets' => [
89+
'recently compared products',
90+
],
91+
],
92+
'filter_by_title' => [
93+
'filter' => [
94+
'filter' => base64_encode('title=product link widget title'),
95+
],
96+
'expected_widgets' => [
97+
'product link widget title',
98+
],
99+
],
100+
'filter_by_type' => [
101+
'filter' => [
102+
'filter' => base64_encode('type=Magento%5CCms%5CBlock%5CWidget%5CPage%5CLink'),
103+
],
104+
'expected_widgets' => [
105+
'cms page widget title',
106+
],
107+
],
108+
'filter_by_theme' => [
109+
'filter' => [
110+
'filter' => base64_encode('theme_id=' . $this->loadThemeIdByCode('Magento/blank')),
111+
],
112+
'expected_widgets' => [
113+
'recently compared products',
114+
],
115+
],
116+
'filter_by_sort_order' => [
117+
'filter' => [
118+
'filter' => base64_encode('sort_order=1'),
119+
],
120+
'expected_widgets' => [
121+
'recently compared products'
122+
],
123+
],
124+
'filter_by_multiple_filters' => [
125+
'filter' => [
126+
'filter' => base64_encode(
127+
'type=Magento%5CCatalog%5CBlock%5CWidget%5CRecentlyCompared&sort_order=1'
128+
),
129+
],
130+
'expected_widgets' => [
131+
'recently compared products'
132+
],
133+
],
134+
];
135+
}
136+
137+
/**
138+
* @dataProvider gridSortDataProvider
139+
*
140+
* @magentoDataFixture Magento/Widget/_files/widgets.php
141+
*
142+
* @param array $filter
143+
* @param array $expectedWidgets
144+
* @return void
145+
*/
146+
public function testGridSorting(array $filter, array $expectedWidgets): void
147+
{
148+
$this->request->setParams($filter);
149+
$collection = $this->getGridCollection();
150+
$this->assertCount(count($expectedWidgets), $collection);
151+
$this->assertEquals($expectedWidgets, $collection->getColumnValues('title'));
152+
}
153+
154+
/**
155+
* @return array
156+
*/
157+
public function gridSortDataProvider(): array
158+
{
159+
return [
160+
'sort_by_id_asc' => [
161+
'filter' => ['sort' => 'instance_id', 'dir' => 'asc'],
162+
'expected_widgets' => [
163+
'cms page widget title',
164+
'product link widget title',
165+
'recently compared products',
166+
],
167+
],
168+
'sort_by_id_desc' => [
169+
'filter' => ['sort' => 'instance_id', 'dir' => 'desc'],
170+
'expected_widgets' => [
171+
'recently compared products',
172+
'product link widget title',
173+
'cms page widget title',
174+
],
175+
],
176+
'sort_by_title_asc' => [
177+
'filter' => ['sort' => 'title', 'dir' => 'asc'],
178+
'expected_widgets' => [
179+
'cms page widget title',
180+
'product link widget title',
181+
'recently compared products',
182+
],
183+
],
184+
'sort_by_title_desc' => [
185+
'filter' => ['sort' => 'title', 'dir' => 'desc'],
186+
'expected_widgets' => [
187+
'recently compared products',
188+
'product link widget title',
189+
'cms page widget title',
190+
],
191+
],
192+
'sort_by_type_asc' => [
193+
'filter' => ['sort' => 'type', 'dir' => 'asc'],
194+
'expected_widgets' => [
195+
'product link widget title',
196+
'recently compared products',
197+
'cms page widget title',
198+
],
199+
],
200+
'sort_by_type_desc' => [
201+
'filter' => ['sort' => 'type', 'dir' => 'desc'],
202+
'expected_widgets' => [
203+
'cms page widget title',
204+
'recently compared products',
205+
'product link widget title',
206+
],
207+
],
208+
'sort_by_sort_order_asc' => [
209+
'filter' => ['sort' => 'sort_order', 'dir' => 'asc'],
210+
'expected_widgets' => [
211+
'recently compared products',
212+
'product link widget title',
213+
'cms page widget title',
214+
],
215+
],
216+
'sort_by_sort_order_desc' => [
217+
'filter' => ['sort' => 'sort_order', 'dir' => 'desc'],
218+
'expected_widgets' => [
219+
'cms page widget title',
220+
'product link widget title',
221+
'recently compared products',
222+
],
223+
],
224+
'sort_by_theme_asc' => [
225+
'filter' => ['sort' => 'theme_id', 'dir' => 'asc'],
226+
'expected_widgets' => [
227+
'recently compared products',
228+
'cms page widget title',
229+
'product link widget title',
230+
],
231+
],
232+
'sort_by_theme_desc' => [
233+
'filter' => ['sort' => 'theme_id', 'dir' => 'asc'],
234+
'expected_widgets' => [
235+
'recently compared products',
236+
'cms page widget title',
237+
'product link widget title',
238+
],
239+
],
240+
];
241+
}
242+
243+
/**
244+
* Load theme by theme id
245+
*
246+
* @param string $code
247+
* @return int
248+
*/
249+
private function loadThemeIdByCode(string $code): int
250+
{
251+
$objectManager = Bootstrap::getObjectManager();
252+
/** @var ThemeFactory $themeFactory */
253+
$themeFactory = $objectManager->get(ThemeFactory::class);
254+
/** @var ThemeResource $themeResource */
255+
$themeResource = $objectManager->get(ThemeResource::class);
256+
$theme = $themeFactory->create();
257+
$themeResource->load($theme, $code, 'code');
258+
259+
return (int)$theme->getId();
260+
}
261+
262+
/**
263+
* Assert widget instances
264+
*
265+
* @param $expectedWidgets
266+
* @param AbstractCollection $collection
267+
* @return void
268+
*/
269+
private function assertWidgets($expectedWidgets, AbstractCollection $collection): void
270+
{
271+
$this->assertCount(count($expectedWidgets), $collection);
272+
foreach ($expectedWidgets as $widgetTitle) {
273+
$item = $collection->getItemByColumnValue('title', $widgetTitle);
274+
$this->assertNotNull($item);
275+
}
276+
}
277+
278+
/**
279+
* Prepare page layout
280+
*
281+
* @return LayoutInterface
282+
*/
283+
private function preparePageLayout(): LayoutInterface
284+
{
285+
$page = $this->pageFactory->create();
286+
$page->addHandle([
287+
'default',
288+
'adminhtml_widget_instance_index',
289+
]);
290+
291+
return $page->getLayout()->generateXml();
292+
}
293+
294+
/**
295+
* Get prepared grid collection
296+
*
297+
* @return AbstractCollection
298+
*/
299+
private function getGridCollection(): AbstractCollection
300+
{
301+
$layout = $this->preparePageLayout();
302+
$containerBlock = $layout->getBlock('adminhtml.widget.instance.grid.container');
303+
$grid = $containerBlock->getChildBlock('grid');
304+
$this->assertNotFalse($grid);
305+
306+
return $grid->getPreparedCollection();
307+
}
308+
}

0 commit comments

Comments
 (0)