88namespace Magento \Sales \Block \Order \Item \Renderer ;
99
1010use Magento \Framework \ObjectManagerInterface ;
11+ use Magento \Framework \Registry ;
12+ use Magento \Framework \View \Element \AbstractBlock ;
1113use Magento \Framework \View \LayoutInterface ;
14+ use Magento \Framework \View \Result \PageFactory ;
15+ use Magento \Sales \Api \Data \OrderInterface ;
1216use Magento \Sales \Api \Data \OrderInterfaceFactory ;
1317use Magento \TestFramework \Helper \Bootstrap ;
1418use Magento \TestFramework \Helper \Xpath ;
1923 *
2024 * @magentoAppArea frontend
2125 * @magentoDbIsolation enabled
26+ * @magentoAppIsolation enabled
2227 */
2328class DefaultRendererTest extends TestCase
2429{
@@ -31,14 +36,43 @@ class DefaultRendererTest extends TestCase
3136 /** @var OrderInterfaceFactory */
3237 private $ orderFactory ;
3338
39+ /** @var PageFactory */
40+ private $ pageFactory ;
41+
42+ /** @var Registry */
43+ private $ registry ;
44+
45+ /**
46+ * @var array
47+ */
48+ private $ defaultFieldsToCheck = [
49+ 'name ' => "//td[contains(@class, 'name')]/strong[contains(text(), '%s')] " ,
50+ 'sku ' => "//td[contains(@class, 'sku') and contains(text(), '%s')] " ,
51+ 'qty ' => "//td[contains(@class, 'qty') and contains(text(), '%d')] " ,
52+ ];
53+
3454 /**
3555 * @inheritdoc
3656 */
3757 protected function setUp (): void
3858 {
59+ parent ::setUp ();
60+
3961 $ this ->objectManager = Bootstrap::getObjectManager ();
4062 $ this ->block = $ this ->objectManager ->get (LayoutInterface::class)->createBlock (DefaultRenderer::class);
4163 $ this ->orderFactory = $ this ->objectManager ->get (OrderInterfaceFactory::class);
64+ $ this ->pageFactory = $ this ->objectManager ->get (PageFactory::class);
65+ $ this ->registry = $ this ->objectManager ->get (Registry::class);
66+ }
67+
68+ /**
69+ * @inheritdoc
70+ */
71+ protected function tearDown (): void
72+ {
73+ $ this ->registry ->unregister ('current_order ' );
74+
75+ parent ::tearDown ();
4276 }
4377
4478 /**
@@ -55,43 +89,13 @@ public function testDisplayingShipmentItem(): void
5589 $ this ->assertNotNull ($ item );
5690 $ blockHtml = $ this ->block ->setTemplate ('Magento_Sales::order/shipment/items/renderer/default.phtml ' )
5791 ->setItem ($ item )->toHtml ();
58- $ this ->assertEquals (
59- 1 ,
60- Xpath::getElementsCountForXpath (
61- sprintf (
62- "//td[contains(@class, 'name')]/strong[contains(text(), '%s')] " ,
63- $ item ->getName ()
64- ),
65- $ blockHtml
66- ),
67- sprintf ('Item with name %s wasn \'t found. ' , $ item ->getName ())
68- );
69- $ this ->assertEquals (
70- 1 ,
71- Xpath::getElementsCountForXpath (
72- sprintf (
73- "//td[contains(@class, 'sku') and contains(text(), '%s')] " ,
74- $ item ->getSku ()
75- ),
76- $ blockHtml
77- ),
78- sprintf ('Item with sku %s wasn \'t found. ' , $ item ->getSku ())
79- );
80- $ this ->assertEquals (
81- 1 ,
82- Xpath::getElementsCountForXpath (
83- sprintf (
84- "//td[contains(@class, 'qty') and contains(text(), '%d')] " ,
85- $ item ->getQty ()
86- ),
87- $ blockHtml
88- ),
89- sprintf (
90- 'Qty for item %s wasn \'t found or not equals to %s. ' ,
91- $ item ->getName (),
92- $ item ->getQty ()
93- )
94- );
92+ foreach ($ this ->defaultFieldsToCheck as $ key => $ xpath ) {
93+ $ this ->assertEquals (
94+ 1 ,
95+ Xpath::getElementsCountForXpath (sprintf ($ xpath , $ item ->getData ($ key )), $ blockHtml ),
96+ sprintf ('Item %s wasn \'t found or not equals to %s. ' , $ key , $ item ->getData ($ key ))
97+ );
98+ }
9599 }
96100
97101 /**
@@ -108,4 +112,161 @@ public function testCreditmemoItemTotalAmount(): void
108112 $ this ->assertNotNull ($ item ->getId ());
109113 $ this ->assertEquals (10.00 , $ this ->block ->getTotalAmount ($ item ));
110114 }
115+
116+ /**
117+ * @magentoDataFixture Magento/Sales/_files/customer_order_with_two_items.php
118+ *
119+ * @return void
120+ */
121+ public function testPrintOrderItem (): void
122+ {
123+ $ order = $ this ->orderFactory ->create ()->loadByIncrementId ('100000555 ' );
124+ $ this ->registerOrder ($ order );
125+ $ item = $ order ->getItemsCollection ()->getFirstItem ();
126+ $ this ->assertNotNull ($ item ->getId ());
127+ $ block = $ this ->getBlock ('sales_order_print ' , 'sales.order.print.renderers.default ' );
128+ $ this ->assertNotFalse ($ block );
129+ $ blockHtml = $ block ->setItem ($ item )->toHtml ();
130+ $ fieldsToCheck = [
131+ 'name ' => "//td[contains(@class, 'name')]/strong[contains(text(), '%s')] " ,
132+ 'sku ' => "//td[contains(@class, 'sku') and contains(text(), '%s')] " ,
133+ 'price ' => "//td[contains(@class, 'price')]//span[contains(text(), '%01.2f')] " ,
134+ 'qty_ordered ' => "//td[contains(@class, 'qty')]//span[contains(text(), ' " . __ ('Ordered ' )
135+ . "')]/following-sibling::span[contains(text(), '%d')] " ,
136+ 'row_total ' => "//td[contains(@class, 'subtotal')]//span[contains(text(), '%01.2f')] " ,
137+ ];
138+ foreach ($ fieldsToCheck as $ key => $ xpath ) {
139+ $ this ->assertEquals (
140+ 1 ,
141+ Xpath::getElementsCountForXpath (sprintf ($ xpath , $ item ->getData ($ key )), $ blockHtml ),
142+ sprintf ('Item %s wasn \'t found or not equals to %s. ' , $ key , $ item ->getData ($ key ))
143+ );
144+ }
145+ }
146+
147+ /**
148+ * @magentoDataFixture Magento/Sales/_files/invoices_for_items.php
149+ *
150+ * @return void
151+ */
152+ public function testPrintInvoiceItem (): void
153+ {
154+ $ order = $ this ->orderFactory ->create ()->loadByIncrementId ('100000555 ' );
155+ $ this ->registerOrder ($ order );
156+ $ invoice = $ order ->getInvoiceCollection ()->getFirstItem ();
157+ $ this ->assertNotNull ($ invoice ->getId ());
158+ $ item = $ invoice ->getItemsCollection ()->getFirstItem ();
159+ $ this ->assertNotNull ($ item ->getId ());
160+ $ block = $ this ->getBlock ('sales_order_printinvoice ' , 'sales.order.print.invoice.renderers.default ' );
161+ $ this ->assertNotFalse ($ block );
162+ $ blockHtml = $ block ->setItem ($ item )->toHtml ();
163+ $ additionalFields = [
164+ 'price ' => "//td[contains(@class, 'price')]//span[contains(text(), '%01.2f')] " ,
165+ 'qty ' => "//td[contains(@class, 'qty')]/span[contains(text(), '%d')] " ,
166+ 'row_total ' => "//td[contains(@class, 'subtotal')]//span[contains(text(), '%01.2f')] " ,
167+ ];
168+ $ this ->defaultFieldsToCheck = array_merge ($ this ->defaultFieldsToCheck , $ additionalFields );
169+ foreach ($ this ->defaultFieldsToCheck as $ key => $ xpath ) {
170+ $ this ->assertEquals (
171+ 1 ,
172+ Xpath::getElementsCountForXpath (sprintf ($ xpath , $ item ->getData ($ key )), $ blockHtml ),
173+ sprintf ('Item %s wasn \'t found or not equals to %s. ' , $ key , $ item ->getData ($ key ))
174+ );
175+ }
176+ }
177+
178+ /**
179+ * @magentoDataFixture Magento/Sales/_files/shipment_for_order_with_customer.php
180+ *
181+ * @return void
182+ */
183+ public function testPrintShipmentItem (): void
184+ {
185+ $ order = $ this ->orderFactory ->create ()->loadByIncrementId ('100000001 ' );
186+ $ this ->registerOrder ($ order );
187+ $ shipment = $ order ->getShipmentsCollection ()->getFirstItem ();
188+ $ this ->assertNotNull ($ shipment ->getId ());
189+ $ item = $ shipment ->getAllItems ()[0 ] ?? null ;
190+ $ this ->assertNotNull ($ item );
191+ $ block = $ this ->getBlock ('sales_order_printshipment ' , 'sales.order.print.shipment.renderers.default ' );
192+ $ this ->assertNotFalse ($ block );
193+ $ blockHtml = $ block ->setItem ($ item )->toHtml ();
194+ foreach ($ this ->defaultFieldsToCheck as $ key => $ xpath ) {
195+ $ this ->assertEquals (
196+ 1 ,
197+ Xpath::getElementsCountForXpath (sprintf ($ xpath , $ item ->getData ($ key )), $ blockHtml ),
198+ sprintf ('Item %s wasn \'t found or not equals to %s. ' , $ key , $ item ->getData ($ key ))
199+ );
200+ }
201+ }
202+
203+ /**
204+ * @magentoDataFixture Magento/Sales/_files/refunds_for_items.php
205+ *
206+ * @return void
207+ */
208+ public function testPrintCreditmemoItem (): void
209+ {
210+ $ order = $ this ->orderFactory ->create ()->loadByIncrementId ('100000555 ' );
211+ $ this ->registerOrder ($ order );
212+ $ creditmemo = $ order ->getCreditmemosCollection ()->getFirstItem ();
213+ $ this ->assertNotNull ($ creditmemo ->getId ());
214+ $ item = $ creditmemo ->getItemsCollection ()->getFirstItem ();
215+ $ this ->assertNotNull ($ item ->getId ());
216+ $ block = $ this ->getBlock ('sales_order_printcreditmemo ' , 'sales.order.print.creditmemo.renderers.default ' );
217+ $ this ->assertNotFalse ($ block );
218+ $ blockHtml = $ block ->setItem ($ item )->toHtml ();
219+ $ additionalFields = [
220+ 'price ' => "//td[contains(@class, 'price')]//span[contains(text(), '%01.2f')] " ,
221+ 'row_total ' => "//td[contains(@class, 'subtotal')]//span[contains(text(), '%01.2f')] " ,
222+ 'discount_amount ' => "//td[contains(@class, 'discount')]/span[contains(text(), '%01.2f')] " ,
223+ ];
224+ $ this ->defaultFieldsToCheck = array_merge ($ this ->defaultFieldsToCheck , $ additionalFields );
225+ foreach ($ this ->defaultFieldsToCheck as $ key => $ xpath ) {
226+ $ this ->assertEquals (
227+ 1 ,
228+ Xpath::getElementsCountForXpath (sprintf ($ xpath , $ item ->getData ($ key )), $ blockHtml ),
229+ sprintf ('Item %s wasn \'t found or not equals to %s. ' , $ key , $ item ->getData ($ key ))
230+ );
231+ }
232+ $ this ->assertEquals (
233+ 1 ,
234+ Xpath::getElementsCountForXpath (
235+ sprintf (
236+ "//td[contains(@class, 'total')]/span[contains(text(), '%01.2f')] " ,
237+ $ this ->block ->getTotalAmount ($ item )
238+ ),
239+ $ blockHtml
240+ ),
241+ sprintf ('Item total wasn \'t found or not equals to %s. ' , $ this ->block ->getTotalAmount ($ item ))
242+ );
243+ }
244+
245+ /**
246+ * Get block.
247+ *
248+ * @param string $handle
249+ * @param string $blockName
250+ * @return AbstractBlock
251+ */
252+ private function getBlock (string $ handle , string $ blockName ): AbstractBlock
253+ {
254+ $ page = $ this ->pageFactory ->create ();
255+ $ page ->addHandle (['default ' , $ handle ]);
256+ $ page ->getLayout ()->generateXml ();
257+
258+ return $ page ->getLayout ()->getBlock ($ blockName );
259+ }
260+
261+ /**
262+ * Register order in registry.
263+ *
264+ * @param OrderInterface $order
265+ * @return void
266+ */
267+ private function registerOrder (OrderInterface $ order ): void
268+ {
269+ $ this ->registry ->unregister ('current_order ' );
270+ $ this ->registry ->register ('current_order ' , $ order );
271+ }
111272}
0 commit comments