SalesOrderAfterPlaceObserverTest.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\SalesRule\Test\Unit\Observer;
  7. class SalesOrderAfterPlaceObserverTest extends \PHPUnit\Framework\TestCase
  8. {
  9. /**
  10. * @var \Magento\SalesRule\Observer\SalesOrderAfterPlaceObserver|\PHPUnit_Framework_MockObject_MockObject
  11. */
  12. protected $model;
  13. /**
  14. * @var \Magento\SalesRule\Model\Coupon|\PHPUnit_Framework_MockObject_MockObject
  15. */
  16. protected $couponMock;
  17. /**
  18. * @var \Magento\SalesRule\Model\RuleFactory|\PHPUnit_Framework_MockObject_MockObject
  19. */
  20. protected $ruleFactory;
  21. /**
  22. * @var
  23. */
  24. protected $ruleCustomerFactory;
  25. /**
  26. * @var \Magento\SalesRule\Model\ResourceModel\Coupon\Usage|\PHPUnit_Framework_MockObject_MockObject
  27. */
  28. protected $couponUsage;
  29. protected function setUp()
  30. {
  31. $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  32. $this->initMocks();
  33. $this->model = $helper->getObject(
  34. \Magento\SalesRule\Observer\SalesOrderAfterPlaceObserver::class,
  35. [
  36. 'ruleFactory' => $this->ruleFactory,
  37. 'ruleCustomerFactory' => $this->ruleCustomerFactory,
  38. 'coupon' => $this->couponMock,
  39. 'couponUsage' => $this->couponUsage,
  40. ]
  41. );
  42. }
  43. protected function initMocks()
  44. {
  45. $this->couponMock = $this->createPartialMock(\Magento\SalesRule\Model\Coupon::class, [
  46. '__wakeup',
  47. 'save',
  48. 'load',
  49. 'getId',
  50. 'setTimesUsed',
  51. 'getTimesUsed',
  52. 'getRuleId',
  53. 'loadByCode',
  54. 'updateCustomerCouponTimesUsed'
  55. ]);
  56. $this->ruleFactory = $this->createPartialMock(\Magento\SalesRule\Model\RuleFactory::class, ['create']);
  57. $this->ruleCustomerFactory = $this->createPartialMock(
  58. \Magento\SalesRule\Model\Rule\CustomerFactory::class,
  59. ['create']
  60. );
  61. $this->couponUsage = $this->createMock(\Magento\SalesRule\Model\ResourceModel\Coupon\Usage::class);
  62. }
  63. /**
  64. * @param \\PHPUnit_Framework_MockObject_MockObject $observer
  65. * @return \PHPUnit_Framework_MockObject_MockObject $order
  66. */
  67. protected function initOrderFromEvent($observer)
  68. {
  69. $event = $this->createPartialMock(\Magento\Framework\Event::class, ['getOrder']);
  70. $order = $this->createPartialMock(
  71. \Magento\Sales\Model\Order::class,
  72. ['getAppliedRuleIds', 'getCustomerId', 'getDiscountAmount', 'getCouponCode', '__wakeup']
  73. );
  74. $observer->expects($this->any())
  75. ->method('getEvent')
  76. ->will($this->returnValue($event));
  77. $event->expects($this->any())
  78. ->method('getOrder')
  79. ->will($this->returnValue($order));
  80. return $order;
  81. }
  82. public function testSalesOrderAfterPlaceWithoutOrder()
  83. {
  84. $observer = $this->createMock(\Magento\Framework\Event\Observer::class);
  85. $this->initOrderFromEvent($observer);
  86. $this->assertEquals($this->model, $this->model->execute($observer));
  87. }
  88. public function testSalesOrderAfterPlaceWithoutRuleId()
  89. {
  90. $observer = $this->createMock(\Magento\Framework\Event\Observer::class);
  91. $order = $this->initOrderFromEvent($observer);
  92. $ruleIds = null;
  93. $order->expects($this->once())
  94. ->method('getAppliedRuleIds')
  95. ->will($this->returnValue($ruleIds));
  96. $this->ruleFactory->expects($this->never())
  97. ->method('create');
  98. $this->assertEquals($this->model, $this->model->execute($observer));
  99. }
  100. /**
  101. * @param int|bool $ruleCustomerId
  102. * @dataProvider salesOrderAfterPlaceDataProvider
  103. */
  104. public function testSalesOrderAfterPlace($ruleCustomerId)
  105. {
  106. $observer = $this->createMock(\Magento\Framework\Event\Observer::class);
  107. $rule = $this->createMock(\Magento\SalesRule\Model\Rule::class);
  108. $ruleCustomer = $this->createPartialMock(\Magento\SalesRule\Model\Rule\Customer::class, [
  109. 'setCustomerId',
  110. 'loadByCustomerRule',
  111. 'getId',
  112. 'setTimesUsed',
  113. 'setRuleId',
  114. 'save',
  115. '__wakeup'
  116. ]);
  117. $order = $this->initOrderFromEvent($observer);
  118. $ruleId = 1;
  119. $couponId = 1;
  120. $customerId = 1;
  121. $order->expects($this->exactly(2))
  122. ->method('getAppliedRuleIds')
  123. ->will($this->returnValue($ruleId));
  124. $order->expects($this->once())
  125. ->method('getCustomerId')
  126. ->will($this->returnValue($customerId));
  127. $this->ruleFactory->expects($this->once())
  128. ->method('create')
  129. ->will($this->returnValue($rule));
  130. $rule->expects($this->once())
  131. ->method('getId')
  132. ->will($this->returnValue($ruleId));
  133. $this->ruleCustomerFactory->expects($this->once())
  134. ->method('create')
  135. ->will($this->returnValue($ruleCustomer));
  136. $ruleCustomer->expects($this->once())
  137. ->method('getId')
  138. ->will($this->returnValue($ruleCustomerId));
  139. $ruleCustomer->expects($this->any())
  140. ->method('setCustomerId')
  141. ->will($this->returnSelf());
  142. $ruleCustomer->expects($this->any())
  143. ->method('setRuleId')
  144. ->will($this->returnSelf());
  145. $this->couponMock->expects($this->any())
  146. ->method('getId')
  147. ->will($this->returnValue($couponId));
  148. $this->couponUsage->expects($this->once())
  149. ->method('updateCustomerCouponTimesUsed')
  150. ->with($customerId, $couponId);
  151. $this->assertEquals($this->model, $this->model->execute($observer));
  152. }
  153. /**
  154. * @return array
  155. */
  156. public function salesOrderAfterPlaceDataProvider()
  157. {
  158. return [
  159. 'With customer rule id' => [1],
  160. 'Without customer rule id' => [null]
  161. ];
  162. }
  163. }