MassgeneratorTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\SalesRule\Test\Unit\Model\Coupon;
  7. /**
  8. * Class MassgeneratorTest
  9. */
  10. class MassgeneratorTest extends \PHPUnit\Framework\TestCase
  11. {
  12. /**
  13. * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
  14. */
  15. protected $objectManager;
  16. /**
  17. * @var string
  18. */
  19. protected $charset;
  20. protected function setUp()
  21. {
  22. $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  23. $this->charset = str_split(md5((string)time()));
  24. }
  25. /**
  26. * Run test generateCode method
  27. *
  28. * @param array $data
  29. * @param int $length
  30. *
  31. * @dataProvider generatorDataProvider
  32. */
  33. public function testGenerateCode(array $data, $length)
  34. {
  35. $salesRuleCouponMock = $this->createPartialMock(\Magento\SalesRule\Helper\Coupon::class, ['getCharset']);
  36. /** @var \Magento\SalesRule\Model\Coupon\Massgenerator $massgenerator */
  37. $massgenerator = $this->objectManager->getObject(
  38. \Magento\SalesRule\Model\Coupon\Massgenerator::class,
  39. ['salesRuleCoupon' => $salesRuleCouponMock, 'data' => $data]
  40. );
  41. $salesRuleCouponMock->expects($this->once())
  42. ->method('getCharset')
  43. ->with($data['format'])
  44. ->will($this->returnValue($this->charset));
  45. $code = $massgenerator->generateCode();
  46. $this->assertTrue(strlen($code) === $length);
  47. $this->assertNotEmpty($code);
  48. if (isset($data['data'])) {
  49. $this->assertCount($data['length'] / $data['dash'], explode($data['delimiter'], $code));
  50. }
  51. }
  52. /**
  53. * Run test getDelimiter method
  54. *
  55. * @param array $data
  56. *
  57. * @dataProvider delimiterDataProvider
  58. */
  59. public function testGetDelimiter(array $data)
  60. {
  61. $salesRuleCouponMock = $this->createPartialMock(\Magento\SalesRule\Helper\Coupon::class, ['getCodeSeparator']);
  62. /** @var \Magento\SalesRule\Model\Coupon\Massgenerator $massgenerator */
  63. $massgenerator = $this->objectManager->getObject(
  64. \Magento\SalesRule\Model\Coupon\Massgenerator::class,
  65. ['salesRuleCoupon' => $salesRuleCouponMock, 'data' => $data]
  66. );
  67. if (empty($data['delimiter'])) {
  68. $salesRuleCouponMock->expects($this->once())
  69. ->method('getCodeSeparator')
  70. ->will($this->returnValue('test-separator'));
  71. $this->assertEquals('test-separator', $massgenerator->getDelimiter());
  72. } else {
  73. $this->assertEquals($data['delimiter'], $massgenerator->getDelimiter());
  74. }
  75. }
  76. /**
  77. * Run test generatePool method
  78. */
  79. public function testGeneratePool()
  80. {
  81. $qty = 10;
  82. $data = [
  83. 'qty' => $qty,
  84. 'length' => 15,
  85. 'format' => 'test-format',
  86. ];
  87. $salesRuleCouponMock = $this->createPartialMock(\Magento\SalesRule\Helper\Coupon::class, ['getCharset']);
  88. $resourceMock = $this->createPartialMock(
  89. \Magento\SalesRule\Model\ResourceModel\Coupon::class,
  90. ['exists', '__wakeup', 'getIdFieldName']
  91. );
  92. $dateMock = $this->createPartialMock(\Magento\Framework\Stdlib\DateTime\DateTime::class, ['gmtTimestamp']);
  93. $dateTimeMock = $this->createPartialMock(\Magento\Framework\Stdlib\DateTime::class, ['formatDate']);
  94. $couponFactoryMock = $this->createPartialMock(\Magento\SalesRule\Model\CouponFactory::class, ['create']);
  95. $couponMock = $this->createPartialMock(\Magento\SalesRule\Model\Coupon::class, [
  96. '__wakeup',
  97. 'setId',
  98. 'setRuleId',
  99. 'setUsageLimit',
  100. 'setUsagePerCustomer',
  101. 'setExpirationDate',
  102. 'setCreatedAt',
  103. 'setType',
  104. 'setCode',
  105. 'save'
  106. ]);
  107. $couponMock->expects($this->any())->method('setId')->will($this->returnSelf());
  108. $couponMock->expects($this->any())->method('setRuleId')->will($this->returnSelf());
  109. $couponMock->expects($this->any())->method('setUsageLimit')->will($this->returnSelf());
  110. $couponMock->expects($this->any())->method('setUsagePerCustomer')->will($this->returnSelf());
  111. $couponMock->expects($this->any())->method('setExpirationDate')->will($this->returnSelf());
  112. $couponMock->expects($this->any())->method('setCreatedAt')->will($this->returnSelf());
  113. $couponMock->expects($this->any())->method('setType')->will($this->returnSelf());
  114. $couponMock->expects($this->any())->method('setCode')->will($this->returnSelf());
  115. $couponMock->expects($this->any())->method('save')->will($this->returnSelf());
  116. $couponFactoryMock->expects($this->once())
  117. ->method('create')
  118. ->will($this->returnValue($couponMock));
  119. $salesRuleCouponMock->expects($this->any())
  120. ->method('getCharset')
  121. ->with($data['format'])
  122. ->will($this->returnValue($this->charset));
  123. /** @var \Magento\SalesRule\Model\Coupon\Massgenerator $massgenerator */
  124. $massgenerator = $this->objectManager->getObject(
  125. \Magento\SalesRule\Model\Coupon\Massgenerator::class,
  126. [
  127. 'couponFactory' => $couponFactoryMock,
  128. 'dateTime' => $dateTimeMock,
  129. 'date' => $dateMock,
  130. 'resource' => $resourceMock,
  131. 'data' => $data,
  132. 'salesRuleCoupon' => $salesRuleCouponMock
  133. ]
  134. );
  135. $this->assertEquals($massgenerator, $massgenerator->generatePool());
  136. $this->assertEquals($qty, $massgenerator->getGeneratedCount());
  137. $codes = $massgenerator->getGeneratedCodes();
  138. ($qty > 0) ? $this->assertNotEmpty($codes) : $this->assertEmpty($codes);
  139. }
  140. /**
  141. * Run test generatePool method (throw exception)
  142. * @expectedException \Magento\Framework\Exception\LocalizedException
  143. * @expectedExceptionMessage We cannot create the requested Coupon Qty. Please check your settings and try again.
  144. */
  145. public function testGeneratePoolException()
  146. {
  147. $data = [
  148. 'qty' => 3,
  149. 'length' => 15,
  150. 'format' => 'test-format',
  151. 'max_attempts' => 0,
  152. ];
  153. $salesRuleCouponMock = $this->createPartialMock(\Magento\SalesRule\Helper\Coupon::class, ['getCharset']);
  154. $resourceMock = $this->createPartialMock(
  155. \Magento\SalesRule\Model\ResourceModel\Coupon::class,
  156. ['exists', '__wakeup', 'getIdFieldName']
  157. );
  158. $dateMock = $this->createPartialMock(\Magento\Framework\Stdlib\DateTime\DateTime::class, ['gmtTimestamp']);
  159. $dateTimeMock = $this->createPartialMock(\Magento\Framework\Stdlib\DateTime::class, ['formatDate']);
  160. $couponFactoryMock = $this->createPartialMock(\Magento\SalesRule\Model\CouponFactory::class, ['create']);
  161. $couponMock = $this->createPartialMock(\Magento\SalesRule\Model\Coupon::class, ['__wakeup']);
  162. $couponFactoryMock->expects($this->once())
  163. ->method('create')
  164. ->will($this->returnValue($couponMock));
  165. $salesRuleCouponMock->expects($this->any())
  166. ->method('getCharset')
  167. ->with($data['format'])
  168. ->will($this->returnValue($this->charset));
  169. $resourceMock->expects($this->any())
  170. ->method('exists')
  171. ->will($this->returnValue(true));
  172. /** @var \Magento\SalesRule\Model\Coupon\Massgenerator $massgenerator */
  173. $massgenerator = $this->objectManager->getObject(
  174. \Magento\SalesRule\Model\Coupon\Massgenerator::class,
  175. [
  176. 'couponFactory' => $couponFactoryMock,
  177. 'dateTime' => $dateTimeMock,
  178. 'date' => $dateMock,
  179. 'resource' => $resourceMock,
  180. 'data' => $data,
  181. 'salesRuleCoupon' => $salesRuleCouponMock
  182. ]
  183. );
  184. $this->assertEquals($massgenerator, $massgenerator->generatePool());
  185. }
  186. /**
  187. * Run test validateData method
  188. *
  189. * @param array $data
  190. * @param bool $result
  191. *
  192. * @dataProvider validateDataProvider
  193. */
  194. public function testValidateData(array $data, $result)
  195. {
  196. /** @var \Magento\SalesRule\Model\Coupon\Massgenerator $massgenerator */
  197. $massgenerator = $this->objectManager->getObject(\Magento\SalesRule\Model\Coupon\Massgenerator::class);
  198. $this->assertEquals($result, $massgenerator->validateData($data));
  199. }
  200. /**
  201. * Run test getGeneratedCount method
  202. */
  203. public function testGetGeneratedCount()
  204. {
  205. /** @var \Magento\SalesRule\Model\Coupon\Massgenerator $massgenerator */
  206. $massgenerator = $this->objectManager->getObject(\Magento\SalesRule\Model\Coupon\Massgenerator::class);
  207. $this->assertEquals(0, $massgenerator->getGeneratedCount());
  208. }
  209. /**
  210. * Data for validate test
  211. *
  212. * @return array
  213. */
  214. public function validateDataProvider()
  215. {
  216. return [
  217. [
  218. 'data' => [
  219. 'qty' => 20,
  220. 'rule_id' => 1,
  221. 'length' => 15,
  222. 'format' => 'test-format',
  223. ],
  224. 'result' => true,
  225. ],
  226. [
  227. 'data' => [
  228. 'qty' => 0,
  229. 'rule_id' => 1,
  230. 'length' => 15,
  231. 'format' => 'test-format',
  232. ],
  233. 'result' => false
  234. ],
  235. [
  236. 'data' => [
  237. 'qty' => 0,
  238. 'rule_id' => 1,
  239. 'length' => 15,
  240. 'format' => '',
  241. ],
  242. 'result' => false
  243. ],
  244. [
  245. 'data' => [
  246. 'qty' => 2,
  247. 'length' => 15,
  248. ],
  249. 'result' => false
  250. ]
  251. ];
  252. }
  253. /**
  254. * Data for test getDelimiter method
  255. *
  256. * @return array
  257. */
  258. public function delimiterDataProvider()
  259. {
  260. return [
  261. [
  262. 'data' => [
  263. 'delimiter' => 'delimiter-value',
  264. ],
  265. ],
  266. [
  267. 'data' => []
  268. ]
  269. ];
  270. }
  271. /**
  272. * Data for code generation coupon
  273. *
  274. * @return array
  275. */
  276. public function generatorDataProvider()
  277. {
  278. return [
  279. [
  280. 'data' => [
  281. 'format' => 'test-format',
  282. 'length' => 10,
  283. ],
  284. 'length' => 10,
  285. ],
  286. [
  287. 'data' => [
  288. 'format' => 'test-format',
  289. 'length' => 18,
  290. 'dash' => 6,
  291. 'delimiter' => '-',
  292. ],
  293. 'length' => 20
  294. ]
  295. ];
  296. }
  297. }