PageRenderTime 46ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/.dev/tests/Classes/Model/Order.php

https://github.com/istran/core
PHP | 1004 lines | 681 code | 278 blank | 45 comment | 0 complexity | f3607ca39a87a4ebdc1914ad8e54ce11 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
  1. <?php
  2. // vim: set ts=4 sw=4 sts=4 et:
  3. /**
  4. * LiteCommerce
  5. *
  6. * NOTICE OF LICENSE
  7. *
  8. * This source file is subject to the Open Software License (OSL 3.0)
  9. * that is bundled with this package in the file LICENSE.txt.
  10. * It is also available through the world-wide-web at this URL:
  11. * http://opensource.org/licenses/osl-3.0.php
  12. * If you did not receive a copy of the license and are unable to
  13. * obtain it through the world-wide-web, please send an email
  14. * to licensing@litecommerce.com so we can send you a copy immediately.
  15. *
  16. * @category LiteCommerce
  17. * @package Tests
  18. * @subpackage Classes
  19. * @author Creative Development LLC <info@cdev.ru>
  20. * @copyright Copyright (c) 2010 Creative Development LLC <info@cdev.ru>. All rights reserved
  21. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  22. * @version GIT: $Id: b72a6db9da31fa9b629fe3e6c6d4ac6665423c4a $
  23. * @link http://www.litecommerce.com/
  24. * @see ____file_see____
  25. * @since 3.0.0
  26. */
  27. /**
  28. * XLite_Tests_Model_Order
  29. *
  30. * @package XLite
  31. * @see ____class_see____
  32. * @since 3.0.0
  33. */
  34. class XLite_Tests_Model_Order extends XLite_Tests_Model_OrderAbstract
  35. {
  36. /**
  37. * testCreate
  38. *
  39. * @return void
  40. * @access public
  41. * @see ____func_see____
  42. * @since 3.0.0
  43. */
  44. public function testCreate()
  45. {
  46. $order = $this->getTestOrder();
  47. $this->assertTrue(0 < $order->getOrderId(), 'check order id');
  48. foreach ($this->testOrder as $k => $v) {
  49. $m = 'get' . \XLite\Core\Converter::convertToCamelCase($k);
  50. $this->assertEquals($v, $order->$m(), 'Check ' . $k);
  51. }
  52. $this->assertEquals(
  53. $this->getProduct()->getProductId(),
  54. $order->getItems()->get(0)->getObject()->getProductId(),
  55. 'check product id'
  56. );
  57. $this->assertEquals(
  58. 'Purchase Order',
  59. $order->getPaymentMethod()->getName(),
  60. 'check payment method'
  61. );
  62. $this->assertFalse(is_null($order->getProfile()), 'check profile');
  63. $this->assertFalse(is_null($order->getProfile()->getOrder()), 'check profile\'s order');
  64. $this->assertEquals(
  65. $order->getOrderId(),
  66. $order->getProfile()->getOrder()->getOrderId(),
  67. 'check profile\'s order id'
  68. );
  69. $this->assertTrue(
  70. 0 < $order->getDate(),
  71. 'check date'
  72. );
  73. $shippingCost = $order->getTotalByModifier('shipping');
  74. $this->assertEquals(1, $order->getItems()->get(0)->getAmount(), 'check quantity');
  75. $this->assertEquals($this->getProduct()->getPrice(), $order->getItems()->get(0)->getPrice(), 'check price');
  76. $this->assertEquals($this->getProduct()->getPrice(), $order->getItems()->get(0)->getSubtotal(), 'check item subtotal');
  77. $this->assertEquals(
  78. $this->getProduct()->getPrice(),
  79. $order->getSubtotal(),
  80. 'check order subtotal'
  81. );
  82. $this->assertEquals(
  83. round($shippingCost + $this->getProduct()->getPrice(), 2),
  84. $order->getTotal(),
  85. 'check total'
  86. );
  87. // Payment method
  88. $pm = \XLite\Core\Database::getRepo('XLite\Model\Payment\Method')->findOneBy(array('service_name' => 'PurchaseOrder'));
  89. $order->setPaymentMethod($pm);
  90. $this->assertEquals($pm, $order->getPaymentMethod(), 'check payment method');
  91. // Saved modifiers
  92. $sm = new \XLite\Model\OrderModifier;
  93. $order->addSavedModifiers($sm);
  94. $count = count($order->getSavedModifiers());
  95. $this->assertEquals($sm, $order->getSavedModifiers()->get($count - 1), 'check save modifier');
  96. }
  97. public function testUpdate()
  98. {
  99. $order = $this->getTestOrder();
  100. $t = time() + 100;
  101. $order->setStatus($order::STATUS_PROCESSED);
  102. $order->setDate($t);
  103. \XLite\Core\Database::getEM()->persist($order);
  104. \XLite\Core\Database::getEM()->flush();
  105. \XLite\Core\Database::getEM()->clear();
  106. $order = \XLite\Core\Database::getRepo('XLite\Model\Order')->find($order->getOrderId());
  107. $this->assertEquals($order::STATUS_PROCESSED, $order->getStatus(), 'check new status');
  108. $this->assertEquals(
  109. $t,
  110. $order->getDate(),
  111. 'check date'
  112. );
  113. $order->getItems()->get(0)->setAmount(2);
  114. $order->calculate();
  115. \XLite\Core\Database::getEM()->persist($order);
  116. \XLite\Core\Database::getEM()->flush();
  117. \XLite\Core\Database::getEM()->clear();
  118. $order = \XLite\Core\Database::getRepo('XLite\Model\Order')->find($order->getOrderId());
  119. $shippingCost = $order->getTotalByModifier('shipping');
  120. $this->assertEquals(2, $order->getItems()->get(0)->getAmount(), 'check quantity');
  121. $this->assertEquals($this->getProduct()->getPrice(), $order->getItems()->get(0)->getPrice(), 'check price');
  122. $this->assertEquals(2 * $this->getProduct()->getPrice(), $order->getItems()->get(0)->getSubtotal(), 'check item subtotal');
  123. $this->assertEquals(2 * $this->getProduct()->getPrice(), $order->getSubtotal(), 'check order subtotal');
  124. $this->assertEquals(
  125. round($shippingCost + 2 * $this->getProduct()->getPrice(), 2),
  126. $order->getTotal(),
  127. 'check total'
  128. );
  129. $order->setStatus($order::STATUS_INPROGRESS);
  130. \XLite\Core\Database::getEM()->persist($order);
  131. \XLite\Core\Database::getEM()->flush();
  132. $order->setStatus($order::STATUS_QUEUED);
  133. \XLite\Core\Database::getEM()->persist($order);
  134. \XLite\Core\Database::getEM()->flush();
  135. $order->setStatus($order::STATUS_PROCESSED);
  136. \XLite\Core\Database::getEM()->persist($order);
  137. \XLite\Core\Database::getEM()->flush();
  138. $order->setStatus($order::STATUS_DECLINED);
  139. \XLite\Core\Database::getEM()->persist($order);
  140. \XLite\Core\Database::getEM()->flush();
  141. }
  142. public function testDelete()
  143. {
  144. $order = $this->getTestOrder();
  145. $id = $order->getOrderId();
  146. \XLite\Core\Database::getEM()->remove($order);
  147. \XLite\Core\Database::getEM()->flush();
  148. $order = \XLite\Core\Database::getRepo('XLite\Model\Order')
  149. ->find($id);
  150. $this->assertTrue(is_null($order), 'check removed order');
  151. }
  152. public function testGetAllowedStatuses()
  153. {
  154. $order = new \XLite\Model\Order();
  155. $etalon = array(
  156. $order::STATUS_TEMPORARY => 'Cart',
  157. $order::STATUS_INPROGRESS => 'Incompleted',
  158. $order::STATUS_QUEUED => 'Queued',
  159. $order::STATUS_PROCESSED => 'Processed',
  160. $order::STATUS_COMPLETED => 'Completed',
  161. $order::STATUS_FAILED => 'Failed',
  162. $order::STATUS_DECLINED => 'Declined',
  163. );
  164. $this->assertEquals(
  165. $etalon,
  166. $order::getAllowedStatuses(),
  167. 'check allowed statuses list'
  168. );
  169. $this->assertEquals(
  170. 'Processed',
  171. $order::getAllowedStatuses($order::STATUS_PROCESSED),
  172. 'check allowed status'
  173. );
  174. }
  175. public function testAddItem()
  176. {
  177. $order = new \XLite\Model\Order();
  178. $profiles = \XLite\Core\Database::getRepo('XLite\Model\Profile')->findAll();
  179. $profile = array_shift($profiles);
  180. unset($profiles);
  181. $order->map($this->testOrder);
  182. $order->setCurrency(\XLite\Core\Database::getRepo('XLite\Model\Currency')->find(840));
  183. $item = new \XLite\Model\OrderItem();
  184. $item->setProduct($this->getProduct());
  185. $item->setAmount(1);
  186. $item->setPrice($this->getProduct()->getPrice());
  187. $this->assertTrue($order->addItem($item), 'check add item');
  188. $this->assertEquals(1, $order->getItems()->count(), 'check items length');
  189. $this->assertEquals(1, $order->getItems()->get(0)->getAmount(), 'check item amount');
  190. $item = new \XLite\Model\OrderItem();
  191. $item->setProduct($this->getProduct());
  192. $item->setAmount(1);
  193. $item->setPrice($this->getProduct()->getPrice());
  194. $this->assertTrue($order->addItem($item), 'check add item #2');
  195. $this->assertEquals(1, $order->getItems()->count(), 'check items length #2');
  196. $this->assertEquals(2, $order->getItems()->get(0)->getAmount(), 'check item amount #2');
  197. \XLite\Core\Database::getEM()->persist($order);
  198. \XLite\Core\Database::getEM()->flush();
  199. $item = new \XLite\Model\FakeOrderItem();
  200. $item->setProduct($this->getProduct());
  201. $item->setAmount(1);
  202. $item->setPrice($this->getProduct()->getPrice());
  203. $item->setInvalidFake();
  204. $this->assertFalse($order->addItem($item), 'check add item #3');
  205. $this->assertEquals($order::NOT_VALID_ERROR, $order->getAddItemError(), 'check error text');
  206. }
  207. public function testGetAddItemError()
  208. {
  209. $order = $this->getTestOrder();
  210. $this->assertTrue(is_null($order->getAddItemError()), 'empty add item error');
  211. }
  212. public function testGetItemByItem()
  213. {
  214. $order = $this->getTestOrder();
  215. $item = new \XLite\Model\OrderItem();
  216. $item->setProduct($this->getProduct());
  217. $item->setAmount(1);
  218. $item->setPrice($this->getProduct()->getPrice());
  219. $this->assertEquals($item->getKey(), $order->getItemByItem($item)->getKey(), 'check equals items');
  220. $list = \XLite\Core\Database::getRepo('XLite\Model\Product')->findByEnabled(true);
  221. $p = $list[1];
  222. $item = new \XLite\Model\OrderItem();
  223. $item->setProduct($p);
  224. $item->setAmount(1);
  225. $item->setPrice($p->getPrice());
  226. $this->assertTrue(is_null($order->getItemByItem($item)), 'check not equals items');
  227. $order->addItem($item);
  228. $this->assertEquals($item->getKey(), $order->getItemByItem($item)->getKey(), 'check equals items #2');
  229. }
  230. public function testGetItemByItemId()
  231. {
  232. $order = $this->getTestOrder();
  233. $list = \XLite\Core\Database::getRepo('XLite\Model\Product')->findByEnabled(true);
  234. $p = $list[1];
  235. $item = new \XLite\Model\OrderItem();
  236. $item->setProduct($p);
  237. $item->setAmount(1);
  238. $item->setPrice($p->getPrice());
  239. $order->addItem($item);
  240. \XLite\Core\Database::getEM()->persist($order);
  241. \XLite\Core\Database::getEM()->flush();
  242. $this->assertEquals(
  243. $item->getKey(),
  244. $order->getItemByItemId($item->getItemId())->getKey(),
  245. 'check equals items'
  246. );
  247. $this->assertTrue(is_null($order->getItemByItemId(-1)), 'check not exists item');
  248. $o2 = $this->getTestOrder();
  249. $id = $o2->getItems()->get(0)->getItemId();
  250. $this->assertTrue(is_null($order->getItemByItemId($id)), 'check foreign item');
  251. }
  252. public function testNormalizeItems()
  253. {
  254. $order = $this->getTestOrder();
  255. $list = \XLite\Core\Database::getRepo('XLite\Model\Product')->findByEnabled(true);
  256. $p = $list[1];
  257. $item = new \XLite\Model\OrderItem();
  258. $item->setProduct($p);
  259. $item->setAmount(1);
  260. $item->setPrice($p->getPrice());
  261. $order->addItem($item);
  262. $this->assertEquals(2, $order->getItems()->count(), 'check order items count');
  263. $item->setProduct($this->getProduct());
  264. $item->setAmount(1);
  265. $item->setPrice($this->getProduct()->getPrice());
  266. $this->assertEquals(2, $order->getItems()->count(), 'check order items count #2');
  267. $order->normalizeItems();
  268. $this->assertEquals(1, $order->getItems()->count(), 'check order items count #3');
  269. \XLite\Core\Database::getEM()->persist($order);
  270. \XLite\Core\Database::getEM()->flush();
  271. $list = \XLite\Core\Database::getRepo('XLite\Model\Product')->findByEnabled(true);
  272. $p = $list[1];
  273. $item = new \XLite\Model\OrderItem();
  274. $item->setProduct($p);
  275. $item->setAmount(1);
  276. $item->setPrice($p->getPrice());
  277. $order->addItem($item);
  278. $item->setProduct($this->getProduct());
  279. $item->setAmount(1);
  280. $item->setPrice($this->getProduct()->getPrice());
  281. $this->assertEquals(2, $order->getItems()->count(), 'check order items count #4');
  282. \XLite\Core\Database::getEM()->persist($order);
  283. \XLite\Core\Database::getEM()->flush();
  284. $order->normalizeItems();
  285. $this->assertEquals(1, $order->getItems()->count(), 'check order items count #5');
  286. $item = new \XLite\Model\FakeOrderItem();
  287. $item->setProduct($p);
  288. $item->setAmount(1);
  289. $item->setPrice($p->getPrice());
  290. $order->addItem($item);
  291. $order->normalizeItems();
  292. $this->assertEquals(2, $order->getItems()->count(), 'check order items count #6');
  293. $item->setInvalidFake();
  294. $order->normalizeItems();
  295. $this->assertEquals(1, $order->getItems()->count(), 'check order items count #7');
  296. }
  297. public function testCountItems()
  298. {
  299. $order = $this->getTestOrder();
  300. $this->assertEquals(1, $order->countItems(), 'check order items count');
  301. $list = \XLite\Core\Database::getRepo('XLite\Model\Product')->findByEnabled(true);
  302. $p = $list[1];
  303. $item = new \XLite\Model\OrderItem();
  304. $item->setProduct($p);
  305. $item->setAmount(1);
  306. $item->setPrice($p->getPrice());
  307. $order->addItem($item);
  308. $this->assertEquals(2, $order->countItems(), 'check order items count #2');
  309. $this->assertEquals($order->getItems()->count(), $order->countItems(), 'check order items count #3');
  310. }
  311. public function testCountQuantity()
  312. {
  313. $order = $this->getTestOrder();
  314. $this->assertEquals(1, $order->countQuantity(), 'check order quantity');
  315. $list = \XLite\Core\Database::getRepo('XLite\Model\Product')->findByEnabled(true);
  316. $p = $list[1];
  317. $item = new \XLite\Model\OrderItem();
  318. $item->setProduct($p);
  319. $item->setAmount(1);
  320. $item->setPrice($p->getPrice());
  321. $order->addItem($item);
  322. $this->assertEquals(2, $order->countQuantity(), 'check order quantity #2');
  323. $item->setAmount(2);
  324. $this->assertEquals(3, $order->countQuantity(), 'check order quantity #3');
  325. }
  326. public function testIsEmpty()
  327. {
  328. $order = $this->getTestOrder();
  329. $this->assertFalse($order->isEmpty(), 'check order empty');
  330. $order->getItems()->clear();
  331. $this->assertTrue($order->isEmpty(), 'check order empty #2');
  332. $item = new \XLite\Model\OrderItem();
  333. $item->setProduct($this->getProduct());
  334. $item->setAmount(1);
  335. $item->setPrice($this->getProduct()->getPrice());
  336. $order->addItem($item);
  337. $this->assertFalse($order->isEmpty(), 'check order empty #3');
  338. $item->setPrice(0);
  339. $this->assertFalse($order->isEmpty(), 'check order empty #4');
  340. }
  341. public function testIsMinOrderAmountError()
  342. {
  343. $order = $this->getTestOrder();
  344. $price = \XLite\Core\Config::getInstance()->General->minimal_order_amount - 1;
  345. $order->getItems()->get(0)->setPrice($price);
  346. $order->calculate();
  347. $this->assertTrue($order->isMinOrderAmountError(), 'is error');
  348. $price = \XLite\Core\Config::getInstance()->General->minimal_order_amount + 1;
  349. $order->getItems()->get(0)->setPrice($price);
  350. $order->calculate();
  351. $this->assertFalse($order->isMinOrderAmountError(), 'is not error');
  352. }
  353. public function testIsMaxOrderAmountError()
  354. {
  355. $order = $this->getTestOrder();
  356. $price = \XLite\Core\Config::getInstance()->General->maximal_order_amount + 1;
  357. $order->getItems()->get(0)->setPrice($price);
  358. $order->calculate();
  359. $this->assertTrue($order->isMaxOrderAmountError(), 'is error');
  360. $price = \XLite\Core\Config::getInstance()->General->maximal_order_amount - 1;
  361. $order->getItems()->get(0)->setPrice($price);
  362. $order->calculate();
  363. $this->assertFalse($order->isMaxOrderAmountError(), 'is not error');
  364. }
  365. public function testIsProcessed()
  366. {
  367. $order = $this->getTestOrder();
  368. $etalon = array(
  369. $order::STATUS_TEMPORARY => false,
  370. $order::STATUS_INPROGRESS => false,
  371. $order::STATUS_QUEUED => false,
  372. $order::STATUS_PROCESSED => true,
  373. $order::STATUS_COMPLETED => true,
  374. $order::STATUS_FAILED => false,
  375. $order::STATUS_DECLINED => false,
  376. );
  377. foreach ($etalon as $status => $res) {
  378. $order->setStatus($status);
  379. $this->assertEquals($res, $order->isProcessed(), 'check ' . $status . ' status');
  380. }
  381. }
  382. public function testIsQueued()
  383. {
  384. $order = $this->getTestOrder();
  385. $etalon = array(
  386. $order::STATUS_TEMPORARY => false,
  387. $order::STATUS_INPROGRESS => false,
  388. $order::STATUS_QUEUED => true,
  389. $order::STATUS_PROCESSED => false,
  390. $order::STATUS_COMPLETED => false,
  391. $order::STATUS_FAILED => false,
  392. $order::STATUS_DECLINED => false,
  393. );
  394. foreach ($etalon as $status => $res) {
  395. $order->setStatus($status);
  396. $this->assertEquals($res, $order->isQueued(), 'check ' . $status . ' status');
  397. }
  398. }
  399. public function testCalculate()
  400. {
  401. $order = $this->getTestOrder();
  402. $order->calculate();
  403. $shippingCost = $order->getTotalByModifier('shipping');
  404. $this->assertEquals(
  405. round($shippingCost + $this->getProduct()->getPrice(), 2),
  406. $order->getTotal(),
  407. 'check total'
  408. );
  409. $order->getItems()->get(0)->setAmount(2);
  410. $order->calculate();
  411. $shippingCost = $order->getTotalByModifier('shipping');
  412. $this->assertEquals(
  413. round($shippingCost + 2 * $this->getProduct()->getPrice(), 2),
  414. $order->getTotal(),
  415. 'check total #2'
  416. );
  417. $order->getItems()->clear();
  418. $order->calculate();
  419. $this->assertEquals(
  420. 0,
  421. $order->getTotal(),
  422. 'check total (empty)'
  423. );
  424. }
  425. public function testGetWeight()
  426. {
  427. $order = $this->getTestOrder();
  428. $order->getItems()->get(0)->getObject()->setFreeShipping(false);
  429. $this->assertEquals(
  430. $this->getProduct()->getWeight(),
  431. $order->getWeight(),
  432. 'check weight'
  433. );
  434. $order->getItems()->get(0)->setAmount(2);
  435. $this->assertEquals(
  436. 2 * $this->getProduct()->getWeight(),
  437. $order->getWeight(),
  438. 'check weight #2'
  439. );
  440. $order->getItems()->get(0)->getObject()->setFreeShipping(true);
  441. $this->assertEquals(
  442. 0,
  443. $order->getWeight(),
  444. 'check weight (empty)'
  445. );
  446. }
  447. public function testSetStatus()
  448. {
  449. $order = $this->getTestOrder();
  450. $order->setStatus($order::STATUS_PROCESSED);
  451. $this->assertEquals($order::STATUS_PROCESSED, $order->getStatus(), 'check status');
  452. // TODO - add email checking
  453. }
  454. public function testGetPaymentMethod()
  455. {
  456. $order = $this->getTestOrder();
  457. $this->assertEquals(
  458. 'Purchase Order',
  459. $order->getPaymentMethod()->getName(),
  460. 'check payment method'
  461. );
  462. $id = $order->getOrderId();
  463. \XLite\Core\Database::getEM()->clear();
  464. $order = \XLite\Core\Database::getRepo('XLite\Model\Order')->find($id);
  465. $this->assertEquals(
  466. 'Purchase Order',
  467. $order->getPaymentMethod()->getName(),
  468. 'check payment method #2'
  469. );
  470. }
  471. public function testGetPaymentMethods()
  472. {
  473. $order = $this->getTestOrder();
  474. $list = array();
  475. foreach ($order->getPaymentMethods() as $p) {
  476. $list[] = $p->getMethodId();
  477. }
  478. $etalon = array(8, 9, 1, 2, 3, 4, 5, 6, 7);
  479. $this->assertEquals($etalon, $list, 'check method id\'s list');
  480. }
  481. public function testRenewPaymentMethod()
  482. {
  483. $order = $this->getTestOrder();
  484. $order->setPaymentMethod(null);
  485. $this->assertNull($order->getPaymentMethod(), 'empty payment method');
  486. $order->renewPaymentMethod();
  487. $this->assertNull($order->getPaymentMethod(), 'empty payment method #2');
  488. $order->getProfile()->setLastPaymentId(1);
  489. $order->renewPaymentMethod();
  490. $this->assertFalse(is_null($order->getPaymentMethod()), 'reassign payment method');
  491. }
  492. public function testgetActivePaymentTransactions()
  493. {
  494. $order = $this->getTestOrder();
  495. $list = $order->getActivePaymentTransactions();
  496. $this->assertEquals(1, count($list), 'check length');
  497. $this->assertEquals(
  498. 'Purchase Order',
  499. $list[0]->getPaymentMethod()->getName(),
  500. 'check payment method'
  501. );
  502. $this->assertEquals(
  503. $order->getTotal(),
  504. $list[0]->getValue(),
  505. 'check total'
  506. );
  507. }
  508. public function testSetPaymentMethod()
  509. {
  510. $order = $this->getTestOrder();
  511. $order->setPaymentMethod(\XLite\Core\Database::getRepo('XLite\Model\Payment\Method')->find(2));
  512. $this->assertEquals(
  513. 'Purchase Order',
  514. $order->getPaymentMethod()->getName(),
  515. 'check payment method'
  516. );
  517. $order->setPaymentMethod(null);
  518. $this->assertTrue(
  519. is_null($order->getPaymentMethod()),
  520. 'check payment method #2'
  521. );
  522. }
  523. public function testGetProfile()
  524. {
  525. $order = $this->getTestOrder();
  526. $id = $order->getOrderId();
  527. \XLite\Core\Database::getEM()->clear();
  528. $order = \XLite\Core\Database::getRepo('XLite\Model\Order')->find($id);
  529. $this->assertNotEquals(
  530. $order->getOrigProfile()->getProfileId(),
  531. $order->getProfile()->getProfileId(),
  532. 'check orig profile id'
  533. );
  534. $this->assertFalse(
  535. is_null($order->getProfile()->getOrder()),
  536. 'check profile\'s order'
  537. );
  538. $this->assertEquals(
  539. $order->getOrderId(),
  540. $order->getProfile()->getOrder()->getOrderId(),
  541. 'check profile\'s order id'
  542. );
  543. }
  544. public function testSetProfile()
  545. {
  546. $order = $this->getTestOrder();
  547. $p = $order->getProfile();
  548. $order->setProfile(null);
  549. $this->assertTrue(is_null($order->getProfile()), 'check profile');
  550. $order->setProfile($p);
  551. $this->assertEquals($p->getProfileId(), $order->getProfile()->getProfileId(), 'check profile id #2');
  552. }
  553. public function testGetOrigProfile()
  554. {
  555. $order = $this->getTestOrder();
  556. $id = $order->getOrderId();
  557. \XLite\Core\Database::getEM()->clear();
  558. $order = \XLite\Core\Database::getRepo('XLite\Model\Order')->find($id);
  559. $this->assertNotEquals(
  560. $order->getProfile()->getProfileId(),
  561. $order->getOrigProfile()->getProfileId(),
  562. 'check profile id'
  563. );
  564. $this->assertTrue(is_null($order->getOrigProfile()->getOrder()), 'check order id');
  565. $order->setOrigProfile(null);
  566. $this->assertEquals(
  567. $order->getProfile()->getProfileId(),
  568. $order->getOrigProfile()->getProfileId(),
  569. 'check empty profile'
  570. );
  571. }
  572. public function testGetItemsFingerprint()
  573. {
  574. $order = $this->getTestOrder();
  575. $result = array();
  576. foreach ($order->getItems() as $item) {
  577. $result[] = array(
  578. $item->getItemId(),
  579. $item->getKey(),
  580. $item->getAmount()
  581. );
  582. }
  583. $result = md5(serialize($result));
  584. $this->assertEquals($result, $order->getItemsFingerprint(), 'check finger print');
  585. $order->getItems()->clear();
  586. $this->assertFalse($order->getItemsFingerprint(), 'check empty finger print');
  587. }
  588. public function testGetDescription()
  589. {
  590. $order = $this->getTestOrder();
  591. $result = array();
  592. foreach ($order->getItems() as $item) {
  593. $result[] = $item->getDescription();
  594. }
  595. $result = implode("\n", $result);
  596. $this->assertEquals($result, $order->getDescription(), 'check description');
  597. $order->getItems()->clear();
  598. $this->assertEquals('', $order->getDescription(), 'check empty description');
  599. }
  600. public function testSetOrigProfile()
  601. {
  602. $order = $this->getTestOrder();
  603. $p = $order->getOrigProfile();
  604. $order->setOrigProfile(null);
  605. $this->assertFalse(is_null($order->getOrigProfile()), 'check profile');
  606. $this->assertEquals($order->getProfile()->getProfileId(), $order->getOrigProfile()->getProfileId(), 'check profile id');
  607. $order->setOrigProfile($p);
  608. $this->assertEquals($p->getProfileId(), $order->getOrigProfile()->getProfileId(), 'check profile id #2');
  609. }
  610. public function testGetEventFingerprint()
  611. {
  612. $order = $this->getTestOrder();
  613. $etalon = array(
  614. 'items' => array(
  615. array(
  616. 'item_id' => $order->getItems()->get(0)->getItemId(),
  617. 'key' => 'product.' . $this->getProduct()->getProductId(),
  618. 'object_type' => 'product',
  619. 'object_id' => $this->getProduct()->getProductId(),
  620. 'options' => array(),
  621. 'quantity' => 1,
  622. ),
  623. ),
  624. );
  625. $this->assertEquals($etalon, $order->getEventFingerprint(), 'check fingerprint');
  626. $item = new \XLite\Model\OrderItem();
  627. $item->setProduct($this->getProduct());
  628. $item->setAmount(2);
  629. $item->setPrice($this->getProduct()->getPrice());
  630. $this->assertTrue($order->addItem($item), 'check add item');
  631. $etalon['items'][0]['quantity'] = 3;
  632. $this->assertEquals($etalon, $order->getEventFingerprint(), 'check fingerprint #2');
  633. $order->getItems()->clear();
  634. $etalon['items'] = array();
  635. $this->assertEquals($etalon, $order->getEventFingerprint(), 'check fingerprint (empty)');
  636. }
  637. public function testGetDetail()
  638. {
  639. $order = $this->getTestOrder();
  640. $this->assertTrue(is_null($order->getDetail('test')), 'check not-set detail');
  641. $order->setDetail('test', '123');
  642. $this->assertEquals('test', $order->getDetail('test')->getName(), 'check name');
  643. $this->assertEquals('123', $order->getDetail('test')->getValue(), 'check value');
  644. $this->assertTrue(is_null($order->getDetail('test')->getLabel()), 'check label');
  645. $order->getDetails()->removeElement($order->getDetail('test'));
  646. $this->assertTrue(is_null($order->getDetail('test')), 'check not-set detail #2');
  647. }
  648. public function testSetDetail()
  649. {
  650. $order = $this->getTestOrder();
  651. $this->assertTrue(is_null($order->getDetail('test')), 'check not-set detail');
  652. $order->setDetail('test', '123');
  653. $this->assertEquals('test', $order->getDetail('test')->getName(), 'check name');
  654. $this->assertEquals('123', $order->getDetail('test')->getValue(), 'check value');
  655. $order->setDetail('test', '456');
  656. $this->assertEquals('456', $order->getDetail('test')->getValue(), 'check value again');
  657. $order->getDetails()->removeElement($order->getDetail('test'));
  658. $this->assertTrue(is_null($order->getDetail('test')), 'check not-set detail #2');
  659. $order->setDetail('test', '123');
  660. $this->assertEquals('test', $order->getDetail('test')->getName(), 'check name #2');
  661. $this->assertEquals('123', $order->getDetail('test')->getValue(), 'check value #2');
  662. $this->assertTrue(is_null($order->getDetail('test')->getLabel()), 'check label');
  663. $order->setDetail('test', '999', 'lll');
  664. $this->assertEquals('999', $order->getDetail('test')->getValue(), 'check value #3');
  665. $this->assertEquals('lll', $order->getDetail('test')->getLabel(), 'check label #2');
  666. }
  667. public function testGetMeaningDetails()
  668. {
  669. $order = $this->getTestOrder();
  670. $this->assertEquals(array(), $order->getMeaningDetails(), 'check empty list');
  671. $order->setDetail('test', '123');
  672. $order->setDetail('test2', '456', 'lll');
  673. $d = $order->getDetails()->get(1);
  674. $this->assertEquals(array($d), $order->getMeaningDetails(), 'check list');
  675. $order->getDetails()->removeElement($d);
  676. $this->assertEquals(array(), $order->getMeaningDetails(), 'check empty list #2');
  677. $d = $order->getDetails()->get(0);
  678. $d->setLabel('ttt');
  679. $this->assertEquals(array($d), $order->getMeaningDetails(), 'check list #2');
  680. }
  681. public function testProcessSucceed()
  682. {
  683. $order = $this->getTestOrder();
  684. $order->setStatus($order::STATUS_QUEUED);
  685. $c = \XLite\Core\Database::getRepo('XLite\Model\Config')->findOneByName('enable_init_order_notif');
  686. $old = $c->getValue();
  687. $c->setValue(true);
  688. \XLite\Core\Database::getEM()->flush();
  689. $c = \XLite\Core\Database::getRepo('XLite\Model\Config')->findOneByName('enable_init_order_notif_customer');
  690. $old2 = $c->getValue();
  691. $c->setValue(true);
  692. \XLite\Core\Database::getEM()->flush();
  693. \XLite\Core\Database::getRepo('XLite\Model\Config')->getAllOptions(true);
  694. $order->processSucceed();
  695. // TODo - check email send
  696. $c = \XLite\Core\Database::getRepo('XLite\Model\Config')->findOneByName('enable_init_order_notif');
  697. $c->setValue($old);
  698. \XLite\Core\Database::getEM()->flush();
  699. $c = \XLite\Core\Database::getRepo('XLite\Model\Config')->findOneByName('enable_init_order_notif_customer');
  700. $c->setValue($old2);
  701. \XLite\Core\Database::getEM()->persist($c);
  702. \XLite\Core\Database::getEM()->flush();
  703. }
  704. public function testIsShowCCInfo()
  705. {
  706. $this->markTestSkipped('CreditCard payment method is not registered');
  707. }
  708. public function testIsShowEcheckInfo()
  709. {
  710. $this->markTestSkipped('Echeck payment method is not registered');
  711. }
  712. public function testRefreshItems()
  713. {
  714. $order = $this->getTestOrder();
  715. $order->refreshItems();
  716. // TODO - rework test after rework tax subsystem
  717. }
  718. protected function getTestOrder()
  719. {
  720. $order = parent::getTestOrder();
  721. $method = \XLite\Core\Database::getRepo('XLite\Model\Payment\Method')->findOneBy(array('service_name' => 'PurchaseOrder'));
  722. $order->setPaymentMethod($method);
  723. \XLite\Core\Database::getEM()->flush();
  724. return $order;
  725. }
  726. }