|
3 | 3 | * Copyright © Magento, Inc. All rights reserved.
|
4 | 4 | * See COPYING.txt for license details.
|
5 | 5 | */
|
| 6 | +declare(strict_types=1); |
| 7 | + |
6 | 8 | namespace Magento\Sales\Block\Order\Creditmemo;
|
7 | 9 |
|
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 |
9 | 30 | {
|
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; |
14 | 51 |
|
15 | 52 | /**
|
16 |
| - * @var \Magento\Sales\Block\Order\Creditmemo\Items |
| 53 | + * @inheritdoc |
17 | 54 | */
|
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 | + } |
19 | 67 |
|
20 | 68 | /**
|
21 |
| - * @var \Magento\Sales\Model\Order\Creditmemo |
| 69 | + * @inheritdoc |
22 | 70 | */
|
23 |
| - protected $_creditmemo; |
24 |
| - |
25 |
| - protected function setUp() |
| 71 | + protected function tearDown() |
26 | 72 | {
|
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(); |
34 | 76 | }
|
35 | 77 |
|
36 | 78 | /**
|
37 | 79 | * @magentoAppIsolation enabled
|
| 80 | + * |
| 81 | + * @return void |
38 | 82 | */
|
39 |
| - public function testGetTotalsHtml() |
| 83 | + public function testGetTotalsHtml(): void |
40 | 84 | {
|
41 |
| - $childBlock = $this->_layout->addBlock( |
42 |
| - \Magento\Framework\View\Element\Text::class, |
| 85 | + $childBlock = $this->layout->addBlock( |
| 86 | + Text::class, |
43 | 87 | 'creditmemo_totals',
|
44 | 88 | 'block'
|
45 | 89 | );
|
46 |
| - |
47 | 90 | $expectedHtml = '<b>Any html</b>';
|
48 | 91 | $this->assertEmpty($childBlock->getCreditmemo());
|
49 |
| - $this->assertNotEquals($expectedHtml, $this->_block->getTotalsHtml($this->_creditmemo)); |
50 |
| - |
| 92 | + $this->assertNotEquals($expectedHtml, $this->block->getTotalsHtml($this->creditmemo)); |
51 | 93 | $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()); |
54 | 96 | $this->assertEquals($expectedHtml, $actualHtml);
|
55 | 97 | }
|
56 | 98 |
|
57 |
| - public function testGetCommentsHtml() |
| 99 | + /** |
| 100 | + * @magentoAppIsolation enabled |
| 101 | + * |
| 102 | + * @return void |
| 103 | + */ |
| 104 | + public function testGetCommentsHtml(): void |
58 | 105 | {
|
59 |
| - $childBlock = $this->_layout->addBlock( |
60 |
| - \Magento\Framework\View\Element\Text::class, |
| 106 | + $childBlock = $this->layout->addBlock( |
| 107 | + Text::class, |
61 | 108 | 'creditmemo_comments',
|
62 | 109 | 'block'
|
63 | 110 | );
|
64 |
| - |
65 | 111 | $expectedHtml = '<b>Any html</b>';
|
66 | 112 | $this->assertEmpty($childBlock->getEntity());
|
67 | 113 | $this->assertEmpty($childBlock->getTitle());
|
68 |
| - $this->assertNotEquals($expectedHtml, $this->_block->getCommentsHtml($this->_creditmemo)); |
69 |
| - |
| 114 | + $this->assertNotEquals($expectedHtml, $this->block->getCommentsHtml($this->creditmemo)); |
70 | 115 | $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()); |
73 | 118 | $this->assertNotEmpty($childBlock->getTitle());
|
74 | 119 | $this->assertEquals($expectedHtml, $actualHtml);
|
75 | 120 | }
|
| 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 | + } |
76 | 251 | }
|
0 commit comments