InvoiceQuantityValidatorTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Test\Unit\Model\Order;
  7. use Magento\Sales\Api\OrderRepositoryInterface;
  8. use Magento\Sales\Model\Order;
  9. /**
  10. * Test for \Magento\Sales\Model\Order\InvoiceValidator class
  11. */
  12. class InvoiceQuantityValidatorTest extends \PHPUnit\Framework\TestCase
  13. {
  14. /**
  15. * @var \Magento\Sales\Model\Order\InvoiceQuantityValidator|\PHPUnit_Framework_MockObject_MockObject
  16. */
  17. private $model;
  18. /**
  19. * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
  20. */
  21. private $objectManager;
  22. /**
  23. * @var \Magento\Sales\Api\Data\OrderInterface|\PHPUnit_Framework_MockObject_MockObject
  24. */
  25. private $orderMock;
  26. /**
  27. * @var \Magento\Sales\Api\OrderRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
  28. */
  29. private $orderRepositoryMock;
  30. /**
  31. * @var \Magento\Sales\Api\Data\InvoiceInterface|\PHPUnit_Framework_MockObject_MockObject
  32. */
  33. private $invoiceMock;
  34. protected function setUp()
  35. {
  36. $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  37. $this->orderMock = $this->getMockBuilder(\Magento\Sales\Api\Data\OrderInterface::class)
  38. ->disableOriginalConstructor()
  39. ->getMockForAbstractClass();
  40. $this->invoiceMock = $this->getMockBuilder(\Magento\Sales\Api\Data\InvoiceInterface::class)
  41. ->disableOriginalConstructor()
  42. ->setMethods(['getTotalQty', 'getItems'])
  43. ->getMockForAbstractClass();
  44. $this->orderRepositoryMock = $this->getMockBuilder(
  45. OrderRepositoryInterface::class
  46. )->disableOriginalConstructor()->getMockForAbstractClass();
  47. $this->orderRepositoryMock->expects($this->any())->method('get')->willReturn($this->orderMock);
  48. $this->model = $this->objectManager->getObject(
  49. \Magento\Sales\Model\Order\InvoiceQuantityValidator::class,
  50. ['orderRepository' => $this->orderRepositoryMock]
  51. );
  52. }
  53. public function testValidate()
  54. {
  55. $expectedResult = [];
  56. $invoiceItemMock = $this->getInvoiceItemMock(1, 1);
  57. $this->invoiceMock->expects($this->once())
  58. ->method('getItems')
  59. ->willReturn([$invoiceItemMock]);
  60. $orderItemMock = $this->getOrderItemMock(1, 1, true);
  61. $this->orderMock->expects($this->once())
  62. ->method('getItems')
  63. ->willReturn([$orderItemMock]);
  64. $this->invoiceMock->expects($this->exactly(2))
  65. ->method('getOrderId')
  66. ->willReturn(1);
  67. $this->assertEquals(
  68. $expectedResult,
  69. $this->model->validate($this->invoiceMock)
  70. );
  71. }
  72. public function testValidateInvoiceQtyBiggerThanOrder()
  73. {
  74. $orderItemId = 1;
  75. $message = 'The quantity to invoice must not be greater than the uninvoiced quantity for product SKU "%1".';
  76. $expectedResult = [__($message, $orderItemId)];
  77. $invoiceItemMock = $this->getInvoiceItemMock($orderItemId, 2);
  78. $this->invoiceMock->expects($this->once())
  79. ->method('getItems')
  80. ->willReturn([$invoiceItemMock]);
  81. $orderItemMock = $this->getOrderItemMock($orderItemId, 1, false);
  82. $this->orderMock->expects($this->once())
  83. ->method('getItems')
  84. ->willReturn([$orderItemMock]);
  85. $this->invoiceMock->expects($this->exactly(2))
  86. ->method('getOrderId')
  87. ->willReturn(1);
  88. $this->assertEquals(
  89. $expectedResult,
  90. $this->model->validate($this->invoiceMock)
  91. );
  92. }
  93. public function testValidateNoOrderItems()
  94. {
  95. $expectedResult = [__('The invoice contains one or more items that are not part of the original order.')];
  96. $invoiceItemMock = $this->getInvoiceItemMock(1, 1);
  97. $this->invoiceMock->expects($this->once())
  98. ->method('getItems')
  99. ->willReturn([$invoiceItemMock]);
  100. $this->orderMock->expects($this->once())
  101. ->method('getItems')
  102. ->willReturn([]);
  103. $this->invoiceMock->expects($this->exactly(2))
  104. ->method('getOrderId')
  105. ->willReturn(1);
  106. $this->assertEquals(
  107. $expectedResult,
  108. $this->model->validate($this->invoiceMock)
  109. );
  110. }
  111. public function testValidateNoOrder()
  112. {
  113. $expectedResult = [__('Order Id is required for invoice document')];
  114. $this->assertEquals(
  115. $expectedResult,
  116. $this->model->validate($this->invoiceMock)
  117. );
  118. }
  119. public function testValidateNoInvoiceItems()
  120. {
  121. $expectedResult = [__("The invoice can't be created without products. Add products and try again.")];
  122. $orderItemId = 1;
  123. $invoiceItemMock = $this->getInvoiceItemMock($orderItemId, 0);
  124. $this->invoiceMock->expects($this->once())
  125. ->method('getItems')
  126. ->willReturn([$invoiceItemMock]);
  127. $orderItemMock = $this->getOrderItemMock($orderItemId, 1, false);
  128. $this->orderMock->expects($this->once())
  129. ->method('getItems')
  130. ->willReturn([$orderItemMock]);
  131. $this->invoiceMock->expects($this->exactly(2))
  132. ->method('getOrderId')
  133. ->willReturn(1);
  134. $this->assertEquals(
  135. $expectedResult,
  136. $this->model->validate($this->invoiceMock)
  137. );
  138. }
  139. /**
  140. * @param $orderItemId
  141. * @param $qty
  142. * @return \PHPUnit_Framework_MockObject_MockObject
  143. */
  144. private function getInvoiceItemMock($orderItemId, $qty)
  145. {
  146. $invoiceItemMock = $this->getMockBuilder(\Magento\Sales\Api\Data\InvoiceItemInterface::class)
  147. ->disableOriginalConstructor()
  148. ->setMethods(['getOrderItemId', 'getQty'])
  149. ->getMockForAbstractClass();
  150. $invoiceItemMock->expects($this->once())->method('getOrderItemId')->willReturn($orderItemId);
  151. $invoiceItemMock->expects($this->once())->method('getQty')->willReturn($qty);
  152. return $invoiceItemMock;
  153. }
  154. /**
  155. * @param $id
  156. * @param $qtyToInvoice
  157. * @param $isDummy
  158. * @return \PHPUnit_Framework_MockObject_MockObject
  159. */
  160. private function getOrderItemMock($id, $qtyToInvoice, $isDummy)
  161. {
  162. $orderItemMock = $this->getMockBuilder(\Magento\Sales\Api\Data\OrderItemInterface::class)
  163. ->disableOriginalConstructor()
  164. ->setMethods(['getId', 'getQtyToInvoice', 'isDummy', 'getSku'])
  165. ->getMockForAbstractClass();
  166. $orderItemMock->expects($this->any())->method('getId')->willReturn($id);
  167. $orderItemMock->expects($this->any())->method('getQtyToInvoice')->willReturn($qtyToInvoice);
  168. $orderItemMock->expects($this->any())->method('isDummy')->willReturn($isDummy);
  169. $orderItemMock->expects($this->any())->method('getSku')->willReturn($id);
  170. return $orderItemMock;
  171. }
  172. }