Passed
Pull Request — master (#356)
by Denys
05:13
created

CartsApiTester   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 213
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 15
eloc 63
dl 0
loc 213
rs 10
c 1
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
A createPersistentQuote() 0 23 1
A buildCartUrl() 0 7 1
A seeCartItemQuantityEqualsToQuantityInRequest() 0 9 1
A buildCartsUrl() 0 6 1
A createCartResourceEntityTag() 0 9 1
A getGroupKeyFromQuote() 0 9 3
A formatQueryInclude() 0 7 2
A buildProductConcreteUrl() 0 7 1
A buildCustomerCartUrl() 0 8 1
A buildCartItemUrl() 0 9 1
A mapProductConcreteTransfersToQuoteTransferItems() 0 17 2
1
<?php
2
3
/**
4
 * This file is part of the Spryker Commerce OS.
5
 * For full license information, please view the LICENSE file that was distributed with this source code.
6
 */
7
8
namespace PyzTest\Glue\Carts;
9
10
use Generated\Shared\Transfer\CustomerTransfer;
11
use Generated\Shared\Transfer\ItemTransfer;
12
use Generated\Shared\Transfer\QuoteTransfer;
13
use Generated\Shared\Transfer\StoreTransfer;
14
use Generated\Shared\Transfer\TotalsTransfer;
15
use Spryker\Glue\CartsRestApi\CartsRestApiConfig;
16
use Spryker\Glue\GlueApplication\Rest\RequestConstantsInterface;
17
use Spryker\Glue\ProductsRestApi\ProductsRestApiConfig;
18
use Spryker\Shared\Price\PriceConfig;
19
use SprykerTest\Glue\Testify\Tester\ApiEndToEndTester;
20
21
/**
22
 * Inherited Methods
23
 *
24
 * @method void wantToTest($text)
25
 * @method void wantTo($text)
26
 * @method void execute($callable)
27
 * @method void expectTo($prediction)
28
 * @method void expect($prediction)
29
 * @method void amGoingTo($argumentation)
30
 * @method void am($role)
31
 * @method void lookForwardTo($achieveValue)
32
 * @method void comment($description)
33
 * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = null)
34
 *
35
 * @SuppressWarnings(\PyzTest\Glue\Carts\PHPMD)
36
 */
37
class CartsApiTester extends ApiEndToEndTester
38
{
39
    use _generated\CartsApiTesterActions;
40
41
    /**
42
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
43
     * @param \Generated\Shared\Transfer\CustomerTransfer $customerTransfer
44
     * @param array<\Generated\Shared\Transfer\ProductConcreteTransfer> $productConcreteTransfers
45
     *
46
     * @return \Generated\Shared\Transfer\QuoteTransfer
47
     */
48
    public function createPersistentQuote(
49
        CartsApiTester $I,
50
        CustomerTransfer $customerTransfer,
51
        array $productConcreteTransfers,
52
    ): QuoteTransfer {
53
        $quoteTransfer = $I->havePersistentQuote([
54
            QuoteTransfer::CUSTOMER => $customerTransfer,
55
            QuoteTransfer::TOTALS => (new TotalsTransfer())
56
                ->setSubtotal(random_int(1000, 10000))
57
                ->setPriceToPay(random_int(1000, 10000)),
58
            QuoteTransfer::ITEMS => $this->mapProductConcreteTransfersToQuoteTransferItems($productConcreteTransfers),
59
            QuoteTransfer::STORE => [
60
                StoreTransfer::NAME => 'DE',
61
                StoreTransfer::DEFAULT_CURRENCY_ISO_CODE => 'EUR',
62
                StoreTransfer::AVAILABLE_CURRENCY_ISO_CODES => ['EUR'],
63
            ],
64
            QuoteTransfer::PRICE_MODE => PriceConfig::PRICE_MODE_GROSS,
65
        ]);
66
67
        $quoteTransfer = $I->getLocator()->cart()->facade()->reloadItems($quoteTransfer);
68
        $I->getLocator()->quote()->facade()->updateQuote($quoteTransfer);
69
70
        return $quoteTransfer;
71
    }
72
73
    /**
74
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
75
     * @param string $sku
76
     *
77
     * @return string|null
78
     */
79
    public function getGroupKeyFromQuote(QuoteTransfer $quoteTransfer, string $sku): ?string
80
    {
81
        foreach ($quoteTransfer->getItems() as $itemTransfer) {
82
            if ($itemTransfer->getSku() === $sku) {
83
                return $itemTransfer->getGroupKey();
84
            }
85
        }
86
87
        return null;
88
    }
89
90
    /**
91
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
92
     * @param string $cartUuid
93
     * @param array $attributes
94
     *
95
     * @return string
96
     */
97
    public function createCartResourceEntityTag(
98
        CartsApiTester $I,
99
        string $cartUuid,
100
        array $attributes,
101
    ): string {
102
        return $I->haveEntityTag(
103
            CartsRestApiConfig::RESOURCE_CARTS,
104
            $cartUuid,
105
            $attributes,
106
        );
107
    }
108
109
    /**
110
     * @param int $quantity
111
     * @param string $resourceName
112
     * @param string $itemSku
113
     *
114
     * @return void
115
     */
116
    public function seeCartItemQuantityEqualsToQuantityInRequest(
117
        int $quantity,
118
        string $resourceName,
119
        string $itemSku,
120
    ): void {
121
        $includedByTypeAndId = $this->grabIncludedByTypeAndId($resourceName, $itemSku);
122
123
        $this->assertArrayHasKey('quantity', $includedByTypeAndId);
124
        $this->assertEquals($quantity, $includedByTypeAndId['quantity']);
125
    }
126
127
    /**
128
     * @param array<string> $includes
129
     *
130
     * @return string
131
     */
132
    public function formatQueryInclude(array $includes = []): string
133
    {
134
        if (!$includes) {
135
            return '';
136
        }
137
138
        return sprintf('?%s=%s', RequestConstantsInterface::QUERY_INCLUDE, implode(',', $includes));
139
    }
140
141
    /**
142
     * @param string $productConcreteSku
143
     * @param array<string> $includes
144
     *
145
     * @return string
146
     */
147
    public function buildProductConcreteUrl(string $productConcreteSku, array $includes = []): string
148
    {
149
        return $this->formatFullUrl(
150
            '{resourceConcreteProducts}/{productConcreteSku}' . $this->formatQueryInclude($includes),
151
            [
152
                'resourceConcreteProducts' => ProductsRestApiConfig::RESOURCE_CONCRETE_PRODUCTS,
153
                'productConcreteSku' => $productConcreteSku,
154
            ],
155
        );
156
    }
157
158
    /**
159
     * @param array<string> $includes
160
     *
161
     * @return string
162
     */
163
    public function buildCartsUrl(array $includes = []): string
164
    {
165
        return $this->formatFullUrl(
166
            '{resourceCarts}' . $this->formatQueryInclude($includes),
167
            [
168
                'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
169
            ],
170
        );
171
    }
172
173
    /**
174
     * @param string $customerReference
175
     * @param array<string> $includes
176
     *
177
     * @return string
178
     */
179
    public function buildCustomerCartUrl(string $customerReference, array $includes = []): string
180
    {
181
        return $this->formatFullUrl(
182
            '{customers}/{customerReference}/{resourceCarts}' . $this->formatQueryInclude($includes),
183
            [
184
                'customers' => CartsRestApiConfig::RESOURCE_CUSTOMERS,
185
                'customerReference' => $customerReference,
186
                'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
187
            ],
188
        );
189
    }
190
191
    /**
192
     * @param string $cartUuid
193
     * @param array<string> $includes
194
     *
195
     * @return string
196
     */
197
    public function buildCartUrl(string $cartUuid, array $includes = []): string
198
    {
199
        return $this->formatFullUrl(
200
            '{resourceCarts}/{cartUuid}' . $this->formatQueryInclude($includes),
201
            [
202
                'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
203
                'cartUuid' => $cartUuid,
204
            ],
205
        );
206
    }
207
208
    /**
209
     * @param string $cartUuid
210
     * @param string $cartItemGroupKey
211
     * @param array<string> $includes
212
     *
213
     * @return string
214
     */
215
    public function buildCartItemUrl(string $cartUuid, string $cartItemGroupKey, array $includes = []): string
216
    {
217
        return $this->formatFullUrl(
218
            '{resourceCarts}/{cartUuid}/{resourceCartItems}/{cartItemGroupKey}' . $this->formatQueryInclude($includes),
219
            [
220
                'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
221
                'cartUuid' => $cartUuid,
222
                'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
223
                'cartItemGroupKey' => $cartItemGroupKey,
224
            ],
225
        );
226
    }
227
228
    /**
229
     * @param array<\Generated\Shared\Transfer\ProductConcreteTransfer> $productConcreteTransfers
230
     *
231
     * @return array
232
     */
233
    protected function mapProductConcreteTransfersToQuoteTransferItems(array $productConcreteTransfers): array
234
    {
235
        $quoteTransferItems = [];
236
237
        foreach ($productConcreteTransfers as $productConcreteTransfer) {
238
            $quoteTransferItems[] = [
239
                ItemTransfer::SKU => $productConcreteTransfer->getSku(),
240
                ItemTransfer::GROUP_KEY => $productConcreteTransfer->getSku(),
241
                ItemTransfer::ABSTRACT_SKU => $productConcreteTransfer->getAbstractSku(),
242
                ItemTransfer::ID_PRODUCT_ABSTRACT => $productConcreteTransfer->getFkProductAbstract(),
243
                ItemTransfer::UNIT_PRICE => random_int(100, 1000),
244
                ItemTransfer::UNIT_GROSS_PRICE => random_int(100, 1000),
245
                ItemTransfer::QUANTITY => 1,
246
            ];
247
        }
248
249
        return $quoteTransferItems;
250
    }
251
}
252