SalesOrderBeforeSaveObserverTest.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Payment\Test\Unit\Observer;
  7. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
  8. class SalesOrderBeforeSaveObserverTest extends \PHPUnit\Framework\TestCase
  9. {
  10. /** @var \Magento\Payment\Observer\SalesOrderBeforeSaveObserver */
  11. protected $salesOrderBeforeSaveObserver;
  12. /** @var ObjectManagerHelper */
  13. protected $objectManagerHelper;
  14. /** @var \Magento\Framework\Event\Observer|\PHPUnit_Framework_MockObject_MockObject */
  15. protected $observerMock;
  16. /** @var \Magento\Framework\Event|\PHPUnit_Framework_MockObject_MockObject */
  17. protected $eventMock;
  18. protected function setUp()
  19. {
  20. $this->objectManagerHelper = new ObjectManagerHelper($this);
  21. $this->salesOrderBeforeSaveObserver = $this->objectManagerHelper->getObject(
  22. \Magento\Payment\Observer\SalesOrderBeforeSaveObserver::class,
  23. []
  24. );
  25. $this->observerMock = $this->getMockBuilder(
  26. \Magento\Framework\Event\Observer::class
  27. )->disableOriginalConstructor()->setMethods([])->getMock();
  28. }
  29. public function testSalesOrderBeforeSaveMethodNotFree()
  30. {
  31. $this->_prepareEventMockWithMethods(['getOrder']);
  32. $neverInvokedMethods = ['canUnhold', 'isCanceled', 'getState', 'hasForcedCanCreditMemo'];
  33. $order = $this->_getPreparedOrderMethod(
  34. 'not_free',
  35. $neverInvokedMethods
  36. );
  37. $this->_prepareNeverInvokedOrderMethods($order, $neverInvokedMethods);
  38. $this->eventMock->expects($this->once())->method('getOrder')->will(
  39. $this->returnValue($order)
  40. );
  41. $this->salesOrderBeforeSaveObserver->execute($this->observerMock);
  42. }
  43. public function testSalesOrderBeforeSaveCantUnhold()
  44. {
  45. $this->_prepareEventMockWithMethods(['getOrder']);
  46. $neverInvokedMethods = ['isCanceled', 'getState', 'hasForcedCanCreditMemo'];
  47. $order = $this->getMockBuilder(\Magento\Sales\Model\Order::class)->disableOriginalConstructor()->setMethods(
  48. array_merge(['__wakeup', 'getPayment', 'canUnhold'], $neverInvokedMethods)
  49. )->getMock();
  50. $paymentMock = $this->getMockBuilder(
  51. \Magento\Sales\Model\Order\Payment::class
  52. )->disableOriginalConstructor()->setMethods([])->getMock();
  53. $order->method('getPayment')->will($this->returnValue($paymentMock));
  54. $methodInstance = $this->getMockBuilder(
  55. \Magento\Payment\Model\MethodInterface::class
  56. )->getMockForAbstractClass();
  57. $paymentMock->expects($this->once())->method('getMethodInstance')->will($this->returnValue($methodInstance));
  58. $methodInstance->expects($this->once())->method('getCode')->will($this->returnValue('free'));
  59. $this->_prepareNeverInvokedOrderMethods($order, $neverInvokedMethods);
  60. $this->eventMock->expects($this->once())->method('getOrder')->will(
  61. $this->returnValue($order)
  62. );
  63. $order->expects($this->once())->method('canUnhold')->will($this->returnValue(true));
  64. $this->salesOrderBeforeSaveObserver->execute($this->observerMock);
  65. }
  66. public function testSalesOrderBeforeSaveIsCanceled()
  67. {
  68. // check first canceled state
  69. $this->_prepareEventMockWithMethods(['getOrder']);
  70. $neverInvokedMethods = ['getState', 'hasForcedCanCreditMemo'];
  71. $order = $this->getMockBuilder(\Magento\Sales\Model\Order::class)->disableOriginalConstructor()->setMethods(
  72. array_merge(['__wakeup', 'getPayment', 'canUnhold', 'isCanceled'], $neverInvokedMethods)
  73. )->getMock();
  74. $paymentMock = $this->getMockBuilder(
  75. \Magento\Sales\Model\Order\Payment::class
  76. )->disableOriginalConstructor()->setMethods([])->getMock();
  77. $order->method('getPayment')->will($this->returnValue($paymentMock));
  78. $methodInstance = $this->getMockBuilder(
  79. \Magento\Payment\Model\MethodInterface::class
  80. )->getMockForAbstractClass();
  81. $paymentMock->expects($this->once())->method('getMethodInstance')->will($this->returnValue($methodInstance));
  82. $methodInstance->expects($this->once())->method('getCode')->will($this->returnValue('free'));
  83. $this->_prepareNeverInvokedOrderMethods($order, $neverInvokedMethods);
  84. $this->eventMock->expects($this->once())->method('getOrder')->will(
  85. $this->returnValue($order)
  86. );
  87. $order->expects($this->once())->method('canUnhold')->will($this->returnValue(false));
  88. $order->expects($this->once())->method('isCanceled')->will($this->returnValue(true));
  89. $this->salesOrderBeforeSaveObserver->execute($this->observerMock);
  90. }
  91. public function testSalesOrderBeforeSaveIsClosed()
  92. {
  93. // check closed state at second
  94. $this->_prepareEventMockWithMethods(['getOrder']);
  95. $neverInvokedMethods = ['hasForcedCanCreditMemo'];
  96. $order = $this->getMockBuilder(\Magento\Sales\Model\Order::class)->disableOriginalConstructor()->setMethods(
  97. array_merge(['__wakeup', 'getPayment', 'isCanceled', 'canUnhold', 'getState'], $neverInvokedMethods)
  98. )->getMock();
  99. $paymentMock = $this->getMockBuilder(
  100. \Magento\Sales\Model\Order\Payment::class
  101. )->disableOriginalConstructor()->setMethods([])->getMock();
  102. $order->method('getPayment')->will($this->returnValue($paymentMock));
  103. $methodInstance = $this->getMockBuilder(
  104. \Magento\Payment\Model\MethodInterface::class
  105. )->getMockForAbstractClass();
  106. $paymentMock->expects($this->once())->method('getMethodInstance')->will($this->returnValue($methodInstance));
  107. $methodInstance->expects($this->once())->method('getCode')->will($this->returnValue('free'));
  108. $this->_prepareNeverInvokedOrderMethods($order, $neverInvokedMethods);
  109. $this->eventMock->expects($this->once())->method('getOrder')->will(
  110. $this->returnValue($order)
  111. );
  112. $order->expects($this->once())->method('canUnhold')->will($this->returnValue(false));
  113. $order->expects($this->once())->method('isCanceled')->will($this->returnValue(false));
  114. $order->expects($this->once())->method('getState')->will(
  115. $this->returnValue(\Magento\Sales\Model\Order::STATE_CLOSED)
  116. );
  117. $this->salesOrderBeforeSaveObserver->execute($this->observerMock);
  118. }
  119. public function testSalesOrderBeforeSaveSetForced()
  120. {
  121. // check closed state at second
  122. $this->_prepareEventMockWithMethods(['getOrder']);
  123. $order = $this->_getPreparedOrderMethod(
  124. 'free',
  125. ['canUnhold', 'isCanceled', 'getState', 'setForcedCanCreditmemo', 'hasForcedCanCreditmemo']
  126. );
  127. $this->eventMock->expects($this->once())->method('getOrder')->will(
  128. $this->returnValue($order)
  129. );
  130. $order->expects($this->once())->method('canUnhold')->will($this->returnValue(false));
  131. $order->expects($this->once())->method('isCanceled')->will($this->returnValue(false));
  132. $order->expects($this->once())->method('getState')->will(
  133. $this->returnValue('not_closed_state')
  134. );
  135. $order->expects($this->once())->method('hasForcedCanCreditmemo')->will($this->returnValue(false));
  136. $order->expects($this->once())->method('setForcedCanCreditmemo')->will($this->returnValue(true));
  137. $this->salesOrderBeforeSaveObserver->execute($this->observerMock);
  138. }
  139. /**
  140. * The method should check that the payment is available, as this is not always the case.
  141. *
  142. * @expectedException \Magento\Framework\Exception\LocalizedException
  143. * @expectedExceptionMessage Please provide payment for the order.
  144. */
  145. public function testDoesNothingWhenNoPaymentIsAvailable()
  146. {
  147. $this->_prepareEventMockWithMethods(['getOrder']);
  148. $order = $this->getMockBuilder(\Magento\Sales\Model\Order::class)->disableOriginalConstructor()->setMethods(
  149. array_merge(['__wakeup', 'getPayment'])
  150. )->getMock();
  151. $this->eventMock->expects($this->once())->method('getOrder')->will(
  152. $this->returnValue($order)
  153. );
  154. $order->expects($this->exactly(1))->method('getPayment')->willReturn(null);
  155. $this->salesOrderBeforeSaveObserver->execute($this->observerMock);
  156. }
  157. /**
  158. * Prepares EventMock with set of methods
  159. *
  160. * @param $methodsList
  161. */
  162. private function _prepareEventMockWithMethods($methodsList)
  163. {
  164. $this->eventMock = $this->getMockBuilder(
  165. \Magento\Framework\Event::class
  166. )->disableOriginalConstructor()->setMethods($methodsList)->getMock();
  167. $this->observerMock->expects($this->any())->method('getEvent')->will($this->returnValue($this->eventMock));
  168. }
  169. /**
  170. * Prepares Order with MethodInterface
  171. *
  172. * @param string $methodCode
  173. * @param array $orderMethods
  174. * @return \PHPUnit_Framework_MockObject_MockObject
  175. */
  176. private function _getPreparedOrderMethod($methodCode, $orderMethods = [])
  177. {
  178. $order = $this->getMockBuilder(\Magento\Sales\Model\Order::class)->disableOriginalConstructor()->setMethods(
  179. array_merge(['__wakeup', 'getPayment'], $orderMethods)
  180. )->getMock();
  181. $paymentMock = $this->getMockBuilder(
  182. \Magento\Sales\Model\Order\Payment::class
  183. )->disableOriginalConstructor()->setMethods([])->getMock();
  184. $order->method('getPayment')->will($this->returnValue($paymentMock));
  185. $methodInstance = $this->getMockBuilder(
  186. \Magento\Payment\Model\MethodInterface::class
  187. )->getMockForAbstractClass();
  188. $paymentMock->expects($this->once())->method('getMethodInstance')->will($this->returnValue($methodInstance));
  189. $methodInstance->expects($this->once())->method('getCode')->will($this->returnValue($methodCode));
  190. return $order;
  191. }
  192. /**
  193. * Sets never expectation for order methods listed in $method
  194. *
  195. * @param \PHPUnit_Framework_MockObject_MockObject $order
  196. * @param array $methods
  197. */
  198. private function _prepareNeverInvokedOrderMethods(\PHPUnit_Framework_MockObject_MockObject $order, $methods = [])
  199. {
  200. foreach ($methods as $method) {
  201. $order->expects($this->never())->method($method);
  202. }
  203. }
  204. }