Issues (3877)

Business/Facade/SalesPaymentFacadeTest.php (2 issues)

1
<?php
2
3
/**
4
 * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerTest\Zed\SalesPayment\Business\Facade;
9
10
use Codeception\Test\Unit;
11
use Generated\Shared\Transfer\OrderTransfer;
12
use Generated\Shared\Transfer\PaymentTransfer;
13
use Generated\Shared\Transfer\QuoteTransfer;
14
use Generated\Shared\Transfer\SalesPaymentTransfer;
15
use Generated\Shared\Transfer\SaveOrderTransfer;
16
use Generated\Shared\Transfer\TotalsTransfer;
17
use Spryker\Zed\SalesPayment\SalesPaymentDependencyProvider;
18
use Spryker\Zed\SalesPaymentExtension\Dependency\Plugin\OrderPaymentExpanderPluginInterface;
19
use SprykerTest\Shared\Testify\Helper\DependencyHelperTrait;
20
use SprykerTest\Zed\Sales\Helper\BusinessHelper;
21
22
/**
23
 * Auto-generated group annotations
24
 *
25
 * @group SprykerTest
26
 * @group Zed
27
 * @group SalesPayment
28
 * @group Business
29
 * @group Facade
30
 * @group Facade
31
 * @group SalesPaymentFacadeTest
32
 * Add your own group annotations below this line
33
 *
34
 * @property \SprykerTest\Zed\SalesPayment\SalesPaymentBusinessTester $tester
35
 */
36
class SalesPaymentFacadeTest extends Unit
37
{
38
    use DependencyHelperTrait;
39
40
    /**
41
     * @var string
42
     */
43
    protected const TEST_PROVIDER_ONE = 'Test one';
44
45
    /**
46
     * @var string
47
     */
48
    protected const TEST_PROVIDER_TWO = 'Test two';
49
50
    /**
51
     * @var int
52
     */
53
    protected const TEST_GRAND_TOTAL = 125;
54
55
    /**
56
     * @var string
57
     */
58
    protected const ITEM_NAME = 'ITEM_NAME';
59
60
    /**
61
     * @var string
62
     */
63
    protected const CURRENCY_ISO_CODE = 'CODE';
64
65
    /**
66
     * @var string
67
     */
68
    protected const CUSTOMER_REFERENCE = 'CUSTOMER_REFERENCE';
69
70
    /**
71
     * @var \Spryker\Zed\SalesPayment\Business\SalesPaymentFacadeInterface|\Spryker\Zed\Kernel\Business\AbstractFacade
72
     */
73
    protected $salesPaymentFacade;
74
75
    /**
76
     * @return void
77
     */
78
    protected function setUp(): void
79
    {
80
        parent::setUp();
81
82
        $this->salesPaymentFacade = $this->tester->getFacade();
83
    }
84
85
    /**
86
     * @return void
87
     */
88
    public function testSaveOrderPaymentsPaymentTransfersHaveIdSalesPayment(): void
89
    {
90
        // Arrange
91
        $this->tester->configureTestStateMachine([BusinessHelper::DEFAULT_OMS_PROCESS_NAME]);
92
        $saveOrderTransfer = $this->tester->haveOrder([], BusinessHelper::DEFAULT_OMS_PROCESS_NAME);
93
94
        $paymentTransferOne = (new PaymentTransfer())
95
            ->setAmount(100)
96
            ->setPaymentProvider(static::TEST_PROVIDER_ONE)
97
            ->setPaymentMethod('Method one');
98
99
        $paymentTransferTwo = (new PaymentTransfer())
100
            ->setAmount(150)
101
            ->setPaymentProvider(static::TEST_PROVIDER_TWO)
102
            ->setPaymentMethod('Method one');
103
104
        $quoteTransfer = (new QuoteTransfer())
105
            ->addPayment($paymentTransferOne)
106
            ->addPayment($paymentTransferTwo);
107
108
        // Act
109
        $this->salesPaymentFacade->saveOrderPayments($quoteTransfer, $saveOrderTransfer);
0 ignored issues
show
The method saveOrderPayments() does not exist on Spryker\Zed\Kernel\Business\AbstractFacade. It seems like you code against a sub-type of Spryker\Zed\Kernel\Business\AbstractFacade such as Spryker\Zed\SalesPayment...ness\SalesPaymentFacade. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

109
        $this->salesPaymentFacade->/** @scrutinizer ignore-call */ 
110
                                   saveOrderPayments($quoteTransfer, $saveOrderTransfer);
Loading history...
110
111
        // Assert
112
        foreach ($quoteTransfer->getPayments() as $paymentTransfer) {
113
            $this->tester->assertIsSalesPaymentSaved($paymentTransfer);
114
        }
115
    }
116
117
    /**
118
     * @return void
119
     */
120
    public function testExpandOrderWithPaymentsExecutePluginStack(): void
121
    {
122
        // Arrange
123
        $this->tester->configureTestStateMachine([BusinessHelper::DEFAULT_OMS_PROCESS_NAME]);
124
        $salesOrderEntityTransfer = $this->tester->haveOrder([], BusinessHelper::DEFAULT_OMS_PROCESS_NAME);
125
        $orderTransfer = $this->createOrderTransfer($salesOrderEntityTransfer);
126
127
        $salesPaymentExpanderPluginMock = $this->getMockBuilder(OrderPaymentExpanderPluginInterface::class)
128
            ->getMock();
129
        $salesPaymentExpanderPluginMock->expects($this->exactly(2))
130
            ->method('expand')
131
            ->willReturnCallback(function (OrderTransfer $orderTransfer, PaymentTransfer $paymentTransfer): PaymentTransfer {
132
                return $paymentTransfer;
133
            });
134
135
        $this->getDependencyHelper()->setDependency(
136
            SalesPaymentDependencyProvider::SALES_PAYMENT_EXPANDER_PLUGINS,
137
            [
138
                $salesPaymentExpanderPluginMock,
139
            ],
140
        );
141
142
        // Act
143
        $this->assertCount(0, $orderTransfer->getPayments());
144
        $this->salesPaymentFacade->expandOrderWithPayments($orderTransfer);
0 ignored issues
show
The method expandOrderWithPayments() does not exist on Spryker\Zed\Kernel\Business\AbstractFacade. It seems like you code against a sub-type of Spryker\Zed\Kernel\Business\AbstractFacade such as Spryker\Zed\SalesPayment...ness\SalesPaymentFacade. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

144
        $this->salesPaymentFacade->/** @scrutinizer ignore-call */ 
145
                                   expandOrderWithPayments($orderTransfer);
Loading history...
145
        $this->assertCount(2, $orderTransfer->getPayments());
146
    }
147
148
    /**
149
     * @return void
150
     */
151
    public function testExpandOrderWithPaymentsPriceToPayAmountIsNotAffected(): void
152
    {
153
        // Arrange
154
        $this->tester->configureTestStateMachine([BusinessHelper::DEFAULT_OMS_PROCESS_NAME]);
155
        $salesOrderEntityTransfer = $this->tester->haveOrder([], BusinessHelper::DEFAULT_OMS_PROCESS_NAME);
156
        $orderTransfer = $this->createOrderTransfer($salesOrderEntityTransfer);
157
158
        // Act
159
        $this->salesPaymentFacade->expandOrderWithPayments($orderTransfer);
160
        $this->assertSame(static::TEST_GRAND_TOTAL, $orderTransfer->getTotals()->getPriceToPay());
161
    }
162
163
    /**
164
     * @return void
165
     */
166
    public function testExpandOrderWithPaymentsPriceToPayShouldNotBeEqualToGrandTotal(): void
167
    {
168
        // Arrange
169
        $this->tester->configureTestStateMachine([BusinessHelper::DEFAULT_OMS_PROCESS_NAME]);
170
        $salesOrderEntityTransfer = $this->tester->haveOrder([], BusinessHelper::DEFAULT_OMS_PROCESS_NAME);
171
        $orderTransfer = $this->createOrderTransfer($salesOrderEntityTransfer);
172
        $fakeAvailableAmount = 50;
173
174
        $salesPaymentExpanderPluginMock = $this->getMockBuilder(OrderPaymentExpanderPluginInterface::class)
175
            ->getMock();
176
        $salesPaymentExpanderPluginMock->expects($this->exactly(2))
177
            ->method('expand')
178
            ->willReturnCallback(function (OrderTransfer $orderTransfer, PaymentTransfer $paymentTransfer) use ($fakeAvailableAmount): PaymentTransfer {
179
                return $paymentTransfer->setIsLimitedAmount(true)
180
                    ->setAvailableAmount($fakeAvailableAmount);
181
            });
182
183
        $this->getDependencyHelper()->setDependency(
184
            SalesPaymentDependencyProvider::SALES_PAYMENT_EXPANDER_PLUGINS,
185
            [
186
                $salesPaymentExpanderPluginMock,
187
            ],
188
        );
189
190
        // Act
191
        $this->salesPaymentFacade->expandOrderWithPayments($orderTransfer);
192
        $this->assertSame(static::TEST_GRAND_TOTAL - 2 * $fakeAvailableAmount, $orderTransfer->getTotals()->getPriceToPay());
193
    }
194
195
    /**
196
     * @param \Generated\Shared\Transfer\SaveOrderTransfer $salesOrderTransfer
197
     *
198
     * @return \Generated\Shared\Transfer\OrderTransfer
199
     */
200
    protected function createOrderTransfer(SaveOrderTransfer $salesOrderTransfer): OrderTransfer
201
    {
202
        $totalsTransfer = new TotalsTransfer();
203
        $totalsTransfer->setGrandTotal(static::TEST_GRAND_TOTAL);
204
205
        $orderTransfer = (new OrderTransfer())
206
            ->setIdSalesOrder($salesOrderTransfer->getIdSalesOrder())
207
            ->setTotals($totalsTransfer);
208
209
        $salesPaymentTransferOne = (new SalesPaymentTransfer())
210
            ->setFkSalesOrder($salesOrderTransfer->getIdSalesOrder())
211
            ->setAmount(100)
212
            ->setPaymentProvider(static::TEST_PROVIDER_ONE)
213
            ->setPaymentMethod('Method one');
214
215
        $salesPaymentTransferTwo = (new SalesPaymentTransfer())
216
            ->setFkSalesOrder($salesOrderTransfer->getIdSalesOrder())
217
            ->setAmount(150)
218
            ->setPaymentProvider(static::TEST_PROVIDER_TWO)
219
            ->setPaymentMethod('Method one');
220
221
        $this->tester->haveSalesPaymentEntities([
222
            $salesPaymentTransferOne,
223
            $salesPaymentTransferTwo,
224
        ]);
225
226
        return $orderTransfer;
227
    }
228
}
229