|
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