DotmailerCouponGeneratorTest.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. namespace Dotdigitalgroup\Email\Test\Unit\Model\SalesRule;
  3. use Dotdigitalgroup\Email\Model\SalesRule\DotmailerCouponGenerator;
  4. use Magento\Framework\Stdlib\DateTime;
  5. use Magento\SalesRule\Model\Coupon\CodegeneratorInterface;
  6. use Magento\SalesRule\Model\ResourceModel\Rule;
  7. use Magento\SalesRule\Model\RuleFactory;
  8. use Magento\SalesRule\Model\Spi\CouponResourceInterface;
  9. use PHPUnit\Framework\TestCase;
  10. class DotmailerCouponGeneratorTest extends TestCase
  11. {
  12. /**
  13. * @var RuleFactory|\PHPUnit_Framework_MockObject_MockObject
  14. */
  15. private $ruleModelFactoryMock;
  16. /**
  17. * @var Rule|\PHPUnit_Framework_MockObject_MockObject
  18. */
  19. private $ruleResourceMock;
  20. /**
  21. * @var CodegeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
  22. */
  23. private $codeGeneratorMock;
  24. /**
  25. * @var CouponResourceInterface|\PHPUnit_Framework_MockObject_MockObject
  26. */
  27. private $couponResourceMock;
  28. /**
  29. * @var DateTime|\PHPUnit_Framework_MockObject_MockObject
  30. */
  31. private $dateTimeMock;
  32. /**
  33. * @var DotmailerCouponGenerator
  34. */
  35. private $model;
  36. /**
  37. * Prepare data
  38. */
  39. protected function setUp()
  40. {
  41. $this->ruleModelFactoryMock = $this->getMockBuilder(RuleFactory::class)
  42. ->disableOriginalConstructor()
  43. ->getMock();
  44. $this->ruleResourceMock = $this->getMockBuilder(Rule::class)
  45. ->disableOriginalConstructor()
  46. ->getMock();
  47. $this->codeGeneratorMock = $this->getMockBuilder(CodegeneratorInterface::class)
  48. ->disableOriginalConstructor()
  49. ->getMock();
  50. $this->couponResourceMock = $this->getMockBuilder(CouponResourceInterface::class)
  51. ->disableOriginalConstructor()
  52. ->getMock();
  53. $this->dateTimeMock = $this->getMockBuilder(DateTime::class)
  54. ->disableOriginalConstructor()
  55. ->getMock();
  56. $this->model = new DotmailerCouponGenerator(
  57. $this->ruleModelFactoryMock,
  58. $this->ruleResourceMock,
  59. $this->codeGeneratorMock,
  60. $this->couponResourceMock,
  61. $this->dateTimeMock
  62. );
  63. }
  64. public function testCouponIsCreated()
  65. {
  66. $priceRuleId = 2134;
  67. $expectedCouponCode = "TEST-COUPON-CODE";
  68. $rule = $this->setUpForRuleCreation($priceRuleId);
  69. $coupon = $this->getMockBuilder(\Magento\SalesRule\Model\Coupon::class)
  70. ->disableOriginalConstructor()
  71. ->getMock();
  72. $this->setUpRuleToReturnCoupon($rule, $coupon);
  73. $this->couponResourceMock->expects($this->once())
  74. ->method('save')
  75. ->with($coupon);
  76. $coupon->expects($this->once())
  77. ->method('getCode')
  78. ->willReturn($expectedCouponCode);
  79. $actualCouponCode = $this->model->generateCoupon($priceRuleId, null);
  80. $this->assertEquals($expectedCouponCode, $actualCouponCode);
  81. }
  82. public function testRuleExpiryDateIsUsedIfSetAndNoDateProvided()
  83. {
  84. $priceRuleId = 2134;
  85. $expectedCouponCode = "TEST-COUPON-CODE";
  86. $rule = $this->setUpForRuleCreation($priceRuleId);
  87. $coupon = $this->getMockBuilder(\Magento\SalesRule\Model\Coupon::class)
  88. ->disableOriginalConstructor()
  89. ->getMock();
  90. $this->setUpRuleToReturnCoupon($rule, $coupon);
  91. $this->couponResourceMock->expects($this->once())
  92. ->method('save')
  93. ->with($coupon);
  94. $coupon->expects($this->once())
  95. ->method('getCode')
  96. ->willReturn($expectedCouponCode);
  97. $date = \DateTime::createFromFormat('j-M-Y', '15-Feb-2018');
  98. $rule->method('getToDate')
  99. ->willReturn($date);
  100. $coupon->expects($this->once())
  101. ->method('setExpirationDate')
  102. ->with($date);
  103. $this->model->generateCoupon($priceRuleId, null);
  104. }
  105. public function testNoExpiryIfRuleHasNoneAndNoDateProvided()
  106. {
  107. $priceRuleId = 2134;
  108. $expectedCouponCode = "TEST-COUPON-CODE";
  109. $rule = $this->setUpForRuleCreation($priceRuleId);
  110. $coupon = $this->getMockBuilder(\Magento\SalesRule\Model\Coupon::class)
  111. ->disableOriginalConstructor()
  112. ->getMock();
  113. $this->setUpRuleToReturnCoupon($rule, $coupon);
  114. $this->couponResourceMock->expects($this->once())
  115. ->method('save')
  116. ->with($coupon);
  117. $coupon->expects($this->once())
  118. ->method('getCode')
  119. ->willReturn($expectedCouponCode);
  120. $rule->method('getToDate')
  121. ->willReturn(null);
  122. $coupon->expects($this->once())
  123. ->method('setExpirationDate')
  124. ->with(null);
  125. $this->model->generateCoupon($priceRuleId, null);
  126. }
  127. public function testInputtedExpirySetWhenRuleHasNone()
  128. {
  129. $priceRuleId = 2134;
  130. $expectedCouponCode = "TEST-COUPON-CODE";
  131. $rule = $this->setUpForRuleCreation($priceRuleId);
  132. $coupon = $this->getMockBuilder(\Magento\SalesRule\Model\Coupon::class)
  133. ->disableOriginalConstructor()
  134. ->getMock();
  135. $this->setUpRuleToReturnCoupon($rule, $coupon);
  136. $this->couponResourceMock->expects($this->once())
  137. ->method('save')
  138. ->with($coupon);
  139. $coupon->expects($this->once())
  140. ->method('getCode')
  141. ->willReturn($expectedCouponCode);
  142. $date = \DateTime::createFromFormat('j-M-Y', '15-Feb-2018');
  143. $rule->method('getToDate')
  144. ->willReturn(null);
  145. $coupon->expects($this->once())
  146. ->method('setExpirationDate')
  147. ->with($date);
  148. $this->model->generateCoupon($priceRuleId, $date);
  149. }
  150. public function testInputtedExpirySetWhenRuleHasExpiry()
  151. {
  152. $priceRuleId = 2134;
  153. $expectedCouponCode = "TEST-COUPON-CODE";
  154. $rule = $this->setUpForRuleCreation($priceRuleId);
  155. $coupon = $this->getMockBuilder(\Magento\SalesRule\Model\Coupon::class)
  156. ->disableOriginalConstructor()
  157. ->getMock();
  158. $this->setUpRuleToReturnCoupon($rule, $coupon);
  159. $this->couponResourceMock->expects($this->once())
  160. ->method('save')
  161. ->with($coupon);
  162. $coupon->expects($this->once())
  163. ->method('getCode')
  164. ->willReturn($expectedCouponCode);
  165. $date = \DateTime::createFromFormat('j-M-Y', '15-Feb-2018');
  166. $rule->method('getToDate')
  167. ->willReturn(\DateTime::createFromFormat('j-M-Y', '15-Feb-2019'));
  168. $coupon->expects($this->once())
  169. ->method('setExpirationDate')
  170. ->with($date);
  171. $this->model->generateCoupon($priceRuleId, $date);
  172. }
  173. /**
  174. * @param $priceRuleId
  175. *
  176. * @return \PHPUnit\Framework\MockObject\MockObject
  177. */
  178. private function setUpForRuleCreation($priceRuleId)
  179. {
  180. $rule = $this->getMockBuilder(\Magento\SalesRule\Model\Rule::class)
  181. ->disableOriginalConstructor()
  182. ->getMock();
  183. $this->ruleModelFactoryMock->expects($this->once())
  184. ->method('create')
  185. ->willReturn($rule);
  186. $rule->expects($this->once())
  187. ->method('__call')
  188. ->with(
  189. $this->equalTo('setCouponType'),
  190. $this->equalTo([\Magento\SalesRule\Model\Rule::COUPON_TYPE_AUTO])
  191. );
  192. $this->ruleResourceMock->expects($this->once())
  193. ->method('load')
  194. ->with($rule, $priceRuleId)
  195. ->willReturn($rule);
  196. return $rule;
  197. }
  198. /**
  199. * @param $rule
  200. * @param $coupon
  201. */
  202. private function setUpRuleToReturnCoupon($rule, $coupon)
  203. {
  204. $rule->expects($this->once())
  205. ->method('setCouponCodeGenerator')
  206. ->with($this->codeGeneratorMock);
  207. $rule->expects($this->once())
  208. ->method('acquireCoupon')
  209. ->willReturn($coupon);
  210. $dateTime = new \DateTime();
  211. $this->dateTimeMock->expects($this->once())
  212. ->method('formatDate')
  213. ->with(true)
  214. ->willReturn($dateTime);
  215. $coupon->expects($this->once())
  216. ->method('setCreatedAt')
  217. ->with($dateTime);
  218. $coupon->expects($this->once())
  219. ->method('__call')
  220. ->with(
  221. $this->equalTo('setGeneratedByDotmailer'),
  222. $this->equalTo([1])
  223. );
  224. $coupon->expects($this->once())
  225. ->method('setType')
  226. ->with(\Magento\SalesRule\Model\Rule::COUPON_TYPE_NO_COUPON);
  227. }
  228. }