Skip to content

Commit e7a9a53

Browse files
committed
MC-32700: Storefront: Order view in customer profile
1 parent 8ec21ff commit e7a9a53

16 files changed

+1631
-157
lines changed

dev/tests/integration/testsuite/Magento/Sales/Block/Order/Creditmemo/ItemsTest.php

Lines changed: 209 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,74 +3,249 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
7+
68
namespace Magento\Sales\Block\Order\Creditmemo;
79

8-
class ItemsTest extends \PHPUnit\Framework\TestCase
10+
use Magento\Framework\ObjectManagerInterface;
11+
use Magento\Framework\Registry;
12+
use Magento\Framework\View\Element\Text;
13+
use Magento\Framework\View\LayoutInterface;
14+
use Magento\Framework\View\Result\PageFactory;
15+
use Magento\Sales\Api\Data\CreditmemoInterface;
16+
use Magento\Sales\Api\Data\OrderInterface;
17+
use Magento\Sales\Api\Data\OrderInterfaceFactory;
18+
use Magento\TestFramework\Helper\Bootstrap;
19+
use Magento\TestFramework\Helper\Xpath;
20+
use PHPUnit\Framework\TestCase;
21+
22+
/**
23+
* Tests for view creditmemo items block.
24+
*
25+
* @magentoAppArea frontend
26+
* @magentoDbIsolation enabled
27+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
28+
*/
29+
class ItemsTest extends TestCase
930
{
10-
/**
11-
* @var \Magento\Framework\View\LayoutInterface
12-
*/
13-
protected $_layout;
31+
/** @var ObjectManagerInterface */
32+
private $objectManager;
33+
34+
/** @var LayoutInterface */
35+
private $layout;
36+
37+
/** @var Items */
38+
private $block;
39+
40+
/** @var CreditmemoInterface */
41+
private $creditmemo;
42+
43+
/** @var Registry */
44+
private $registry;
45+
46+
/** @var OrderInterfaceFactory */
47+
private $orderFactory;
48+
49+
/** @var PageFactory */
50+
private $pageFactory;
1451

1552
/**
16-
* @var \Magento\Sales\Block\Order\Creditmemo\Items
53+
* @inheritdoc
1754
*/
18-
protected $_block;
55+
protected function setUp()
56+
{
57+
parent::setUp();
58+
59+
$this->objectManager = Bootstrap::getObjectManager();
60+
$this->layout = $this->objectManager->get(LayoutInterface::class);
61+
$this->block = $this->layout->createBlock(Items::class, 'block');
62+
$this->creditmemo = $this->objectManager->get(CreditmemoInterface::class);
63+
$this->registry = $this->objectManager->get(Registry::class);
64+
$this->orderFactory = $this->objectManager->get(OrderInterfaceFactory::class);
65+
$this->pageFactory = $this->objectManager->get(PageFactory::class);
66+
}
1967

2068
/**
21-
* @var \Magento\Sales\Model\Order\Creditmemo
69+
* @inheritdoc
2270
*/
23-
protected $_creditmemo;
24-
25-
protected function setUp()
71+
protected function tearDown()
2672
{
27-
$this->_layout = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
28-
\Magento\Framework\View\LayoutInterface::class
29-
);
30-
$this->_block = $this->_layout->createBlock(\Magento\Sales\Block\Order\Creditmemo\Items::class, 'block');
31-
$this->_creditmemo = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
32-
\Magento\Sales\Model\Order\Creditmemo::class
33-
);
73+
$this->registry->unregister('current_order');
74+
75+
parent::tearDown();
3476
}
3577

3678
/**
3779
* @magentoAppIsolation enabled
80+
*
81+
* @return void
3882
*/
39-
public function testGetTotalsHtml()
83+
public function testGetTotalsHtml(): void
4084
{
41-
$childBlock = $this->_layout->addBlock(
42-
\Magento\Framework\View\Element\Text::class,
85+
$childBlock = $this->layout->addBlock(
86+
Text::class,
4387
'creditmemo_totals',
4488
'block'
4589
);
46-
4790
$expectedHtml = '<b>Any html</b>';
4891
$this->assertEmpty($childBlock->getCreditmemo());
49-
$this->assertNotEquals($expectedHtml, $this->_block->getTotalsHtml($this->_creditmemo));
50-
92+
$this->assertNotEquals($expectedHtml, $this->block->getTotalsHtml($this->creditmemo));
5193
$childBlock->setText($expectedHtml);
52-
$actualHtml = $this->_block->getTotalsHtml($this->_creditmemo);
53-
$this->assertSame($this->_creditmemo, $childBlock->getCreditmemo());
94+
$actualHtml = $this->block->getTotalsHtml($this->creditmemo);
95+
$this->assertSame($this->creditmemo, $childBlock->getCreditmemo());
5496
$this->assertEquals($expectedHtml, $actualHtml);
5597
}
5698

57-
public function testGetCommentsHtml()
99+
/**
100+
* @magentoAppIsolation enabled
101+
*
102+
* @return void
103+
*/
104+
public function testGetCommentsHtml(): void
58105
{
59-
$childBlock = $this->_layout->addBlock(
60-
\Magento\Framework\View\Element\Text::class,
106+
$childBlock = $this->layout->addBlock(
107+
Text::class,
61108
'creditmemo_comments',
62109
'block'
63110
);
64-
65111
$expectedHtml = '<b>Any html</b>';
66112
$this->assertEmpty($childBlock->getEntity());
67113
$this->assertEmpty($childBlock->getTitle());
68-
$this->assertNotEquals($expectedHtml, $this->_block->getCommentsHtml($this->_creditmemo));
69-
114+
$this->assertNotEquals($expectedHtml, $this->block->getCommentsHtml($this->creditmemo));
70115
$childBlock->setText($expectedHtml);
71-
$actualHtml = $this->_block->getCommentsHtml($this->_creditmemo);
72-
$this->assertSame($this->_creditmemo, $childBlock->getEntity());
116+
$actualHtml = $this->block->getCommentsHtml($this->creditmemo);
117+
$this->assertSame($this->creditmemo, $childBlock->getEntity());
73118
$this->assertNotEmpty($childBlock->getTitle());
74119
$this->assertEquals($expectedHtml, $actualHtml);
75120
}
121+
122+
/**
123+
* @magentoDataFixture Magento/Sales/_files/refunds_for_items.php
124+
*
125+
* @return void
126+
*/
127+
public function testDisplayingCreditmemos(): void
128+
{
129+
$order = $this->orderFactory->create()->loadByIncrementId('100000555');
130+
$this->registerOrder($order);
131+
$blockHtml = $this->renderCreditmemoItemsBlock();
132+
$this->assertCreditmemosBlock($order, $blockHtml);
133+
}
134+
135+
/**
136+
* Assert creditmemos block.
137+
*
138+
* @param OrderInterface $order
139+
* @param string $blockHtml
140+
* @return void
141+
*/
142+
private function assertCreditmemosBlock(OrderInterface $order, string $blockHtml): void
143+
{
144+
$this->assertEquals(
145+
1,
146+
Xpath::getElementsCountForXpath(
147+
sprintf(
148+
"//a[contains(@href, 'sales/order/printCreditmemo/order_id/%s')]/span[contains(text(), '%s')]",
149+
$order->getId(),
150+
__('Print All Refunds')
151+
),
152+
$blockHtml
153+
),
154+
sprintf('%s button was not found.', __('Print All Refunds'))
155+
);
156+
$this->assertNotCount(0, $order->getCreditmemosCollection(), 'Creditmemos collection is empty');
157+
foreach ($order->getCreditmemosCollection() as $creditmemo) {
158+
$this->assertEquals(
159+
1,
160+
Xpath::getElementsCountForXpath(
161+
sprintf(
162+
"//div[contains(@class, 'order-title')]/strong[contains(text(), '%s')]",
163+
__('Refund #') . $creditmemo->getIncrementId()
164+
),
165+
$blockHtml
166+
),
167+
sprintf('Title for %s was not found.', __('Refund #') . $creditmemo->getIncrementId())
168+
);
169+
$this->assertEquals(
170+
1,
171+
Xpath::getElementsCountForXpath(
172+
sprintf(
173+
"//a[contains(@href, 'sales/order/printCreditmemo/creditmemo_id/%s')]"
174+
. "/span[contains(text(), '%s')]",
175+
$creditmemo->getId(),
176+
__('Print Refund')
177+
),
178+
$blockHtml
179+
),
180+
sprintf('%s button for #%s was not found.', __('Print Refund'), $creditmemo->getIncrementId())
181+
);
182+
$this->assertCreditmemoItems($creditmemo, $blockHtml);
183+
}
184+
}
185+
186+
/**
187+
* Assert creditmemo items list.
188+
*
189+
* @param CreditmemoInterface $creditmemo
190+
* @param string $html
191+
* @return void
192+
*/
193+
private function assertCreditmemoItems(CreditmemoInterface $creditmemo, string $html): void
194+
{
195+
$this->assertNotCount(0, $creditmemo->getItemsCollection(), 'Creditmemo items collection is empty');
196+
$fieldsToCheck = [
197+
'name' => "/td[contains(@class, 'name')]/strong[contains(text(), '%s')]",
198+
'sku' => "/td[contains(@class, 'sku') and contains(text(), '%s')]",
199+
'price' => "/td[contains(@class, 'price')]//span[contains(text(), '%01.2f')]",
200+
'qty' => "/td[contains(@class, 'qty') and contains(text(), '%d')]",
201+
'row_total' => "/td[contains(@class, 'subtotal')]//span[contains(text(), '%01.2f')]",
202+
'discount_amount' => "/td[contains(@class, 'discount')]/span[contains(text(), '%01.2f')]",
203+
];
204+
foreach ($creditmemo->getItemsCollection() as $item) {
205+
$rowXpath = sprintf(
206+
"//table[@id='my-refund-table-%s']//tr[@id='order-item-row-%s']",
207+
$creditmemo->getId(),
208+
$item->getId()
209+
);
210+
foreach ($fieldsToCheck as $key => $xpath) {
211+
$this->assertEquals(
212+
1,
213+
Xpath::getElementsCountForXpath(sprintf($rowXpath . $xpath, $item->getData($key)), $html),
214+
sprintf('Item %s wasn\'t found or not equals to %s.', $key, $item->getData($key))
215+
);
216+
}
217+
}
218+
}
219+
220+
/**
221+
* Render creditmemo items block.
222+
*
223+
* @return string
224+
*/
225+
private function renderCreditmemoItemsBlock(): string
226+
{
227+
$page = $this->pageFactory->create();
228+
$page->addHandle([
229+
'default',
230+
'sales_order_creditmemo',
231+
]);
232+
$page->getLayout()->generateXml();
233+
$creditmemoItemsBlock = $page->getLayout()->getBlock('creditmemo_items')->unsetChild('creditmemo_totals');
234+
$creditmemoItemsBlock->getRequest()->setRouteName('sales')->setControllerName('order')
235+
->setActionName('creditmemo');
236+
237+
return $creditmemoItemsBlock->toHtml();
238+
}
239+
240+
/**
241+
* Register order in registry.
242+
*
243+
* @param OrderInterface $order
244+
* @return void
245+
*/
246+
private function registerOrder(OrderInterface $order): void
247+
{
248+
$this->registry->unregister('current_order');
249+
$this->registry->register('current_order', $order);
250+
}
76251
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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\Sales\Block\Order\Creditmemo;
9+
10+
use Magento\Framework\ObjectManagerInterface;
11+
use Magento\Framework\View\LayoutInterface;
12+
use Magento\Sales\Api\Data\OrderInterfaceFactory;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
use Magento\TestFramework\Helper\Xpath;
15+
use PHPUnit\Framework\TestCase;
16+
17+
/**
18+
* Tests for view creditmemo totals block.
19+
*
20+
* @magentoAppArea frontend
21+
* @magentoDbIsolation enabled
22+
*/
23+
class TotalsTest extends TestCase
24+
{
25+
/** @var ObjectManagerInterface */
26+
private $objectManager;
27+
28+
/** @var Totals */
29+
private $block;
30+
31+
/** @var OrderInterfaceFactory */
32+
private $orderFactory;
33+
34+
/**
35+
* @inheritdoc
36+
*/
37+
protected function setUp()
38+
{
39+
parent::setUp();
40+
41+
$this->objectManager = Bootstrap::getObjectManager();
42+
$this->block = $this->objectManager->get(LayoutInterface::class)->createBlock(Totals::class)
43+
->setTemplate('Magento_Sales::order/totals.phtml');
44+
$this->orderFactory = $this->objectManager->get(OrderInterfaceFactory::class);
45+
}
46+
47+
/**
48+
* @magentoDataFixture Magento/Sales/_files/refunds_for_items.php
49+
*
50+
* @return void
51+
*/
52+
public function testCreditmemoTotalsBlock(): void
53+
{
54+
$order = $this->orderFactory->create()->loadByIncrementId('100000555');
55+
$creditmemo = $order->getCreditmemosCollection()->getFirstItem();
56+
$this->assertNotNull($creditmemo->getId());
57+
$blockHtml = $this->block->setOrder($order)->setCreditmemo($creditmemo)->toHtml();
58+
$message = '"%s" for creditmemo wasn\'t found or not equals to %01.2f';
59+
$this->assertEquals(
60+
1,
61+
Xpath::getElementsCountForXpath(
62+
sprintf(
63+
"//th[contains(text(), '%s')]/following-sibling::td/span[contains(text(), '%01.2f')]",
64+
__('Subtotal'),
65+
$creditmemo->getSubtotal()
66+
),
67+
$blockHtml
68+
),
69+
sprintf($message, __('Subtotal'), $creditmemo->getSubtotal())
70+
);
71+
$this->assertEquals(
72+
1,
73+
Xpath::getElementsCountForXpath(
74+
sprintf(
75+
"//th[contains(text(), '%s')]/following-sibling::td/span[contains(text(), '%01.2f')]",
76+
__('Shipping & Handling'),
77+
$creditmemo->getShippingAmount()
78+
),
79+
$blockHtml
80+
),
81+
sprintf($message, __('Shipping & Handling'), $creditmemo->getShippingAmount())
82+
);
83+
$this->assertEquals(
84+
1,
85+
Xpath::getElementsCountForXpath(
86+
sprintf(
87+
"//tr[contains(@class, 'grand_total') and contains(.//strong, '%s')]"
88+
. "//span[contains(text(), '%01.2f')]",
89+
__('Grand Total'),
90+
$creditmemo->getGrandTotal()
91+
),
92+
$blockHtml
93+
),
94+
sprintf($message, __('Grand Total'), $creditmemo->getGrandTotal())
95+
);
96+
}
97+
}

0 commit comments

Comments
 (0)