-
Notifications
You must be signed in to change notification settings - Fork 644
/
StockReduceProcessorTest.php
108 lines (88 loc) · 3.69 KB
/
StockReduceProcessorTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Eccube\Tests\Service\PurchaseFlow\Processor;
use Eccube\Entity\ProductClass;
use Eccube\Service\PurchaseFlow\Processor\StockReduceProcessor;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Tests\EccubeTestCase;
class StockReduceProcessorTest extends EccubeTestCase
{
private $processor;
public function setUp()
{
parent::setUp();
$this->processor = $this->container->get(StockReduceProcessor::class);
}
public function testPrepare()
{
// 在庫10の商品
/* @var ProductClass $ProductClass */
$ProductClass = $this->createProduct('test', 1)->getProductClasses()[0];
$ProductClass->setStockUnlimited(false);
$ProductClass->setStock(10);
$ProductClass->getProductStock()->setStock(10);
// 数量3の受注
$Customer = $this->createCustomer();
$Order = $this->createOrderWithProductClasses($Customer, [$ProductClass]);
$OrderItem = $Order->getProductOrderItems()[0];
$OrderItem->setQuantity(3);
$this->entityManager->persist($ProductClass);
$this->entityManager->flush();
$this->processor->prepare($Order, new PurchaseContext());
// 在庫が減っている
$ProductClass = $this->entityManager->find(ProductClass::class, $ProductClass->getId());
self::assertEquals(7, $ProductClass->getStock());
}
public function testRollback()
{
// 在庫7の商品
/* @var ProductClass $ProductClass */
$ProductClass = $this->createProduct('test', 1)->getProductClasses()[0];
$ProductClass->setStockUnlimited(false);
$ProductClass->setStock(7);
$ProductClass->getProductStock()->setStock(7);
// 数量3の受注
$Customer = $this->createCustomer();
$Order = $this->createOrderWithProductClasses($Customer, [$ProductClass]);
$OrderItem = $Order->getProductOrderItems()[0];
$OrderItem->setQuantity(3);
$this->entityManager->persist($ProductClass);
$this->entityManager->flush();
$this->processor->rollback($Order, new PurchaseContext());
// 在庫が戻っている
$ProductClass = $this->entityManager->find(ProductClass::class, $ProductClass->getId());
self::assertEquals(10, $ProductClass->getStock());
}
public function testMultiShipping()
{
// 在庫10の商品
/* @var ProductClass $ProductClass */
$ProductClass = $this->createProduct('test', 1)->getProductClasses()[0];
$ProductClass->setStockUnlimited(false);
$ProductClass->setStock(10);
$ProductClass->getProductStock()->setStock(10);
// 数量3の受注
$Customer = $this->createCustomer();
$Order = $this->createOrderWithProductClasses($Customer, [$ProductClass,$ProductClass]);
$OrderItem = $Order->getProductOrderItems()[0];
$OrderItem->setQuantity(3);
// 数量7の受注
$OrderItem = $Order->getProductOrderItems()[1];
$OrderItem->setQuantity(7);
$this->entityManager->persist($ProductClass);
$this->entityManager->flush();
$this->processor->prepare($Order, new PurchaseContext());
// 複数のOrderItemで同じProductClassの場合、合算した在庫数が減っている
$ProductClass = $this->entityManager->find(ProductClass::class, $ProductClass->getId());
self::assertEquals(0, $ProductClass->getStock());
}
}