Passed
Pull Request — master (#365)
by Dmitry
21:01
created

CartsRestApiCest   A

Complexity

Total Complexity 34

Size/Duplication

Total Lines 1278
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 34
eloc 520
dl 0
loc 1278
c 1
b 0
f 0
rs 9.68

33 Methods

Rating   Name   Duplication   Size   Complexity  
A requestAddItemsToCartWithoutItemSku() 0 33 1
A requestDeleteCartWithoutAuthorizationToken() 0 15 1
A requestDeleteItemsFromCartWithoutAuthorizationToken() 0 25 1
A requestUpdatePriceModeOfNonEmptyCart() 0 42 1
A requestCreateCartWithoutPriceMode() 0 23 1
A requestCarts() 0 31 1
A requestUpdateItemsInCartWithoutCartUuid() 0 28 1
A requestCustomerCartsAuthorizationError() 0 20 1
A requestAddItemsToCartWithoutItemQuantity() 0 33 1
A requestAddItemsToCart() 0 59 1
A requestDeleteItemsFromCartWithoutCartUuid() 0 20 1
A requestAddItemsToCartWithoutAuthorizationToken() 0 33 1
A requestUpdateCartWithoutAuthorizationToken() 0 35 1
A requestDeleteItemsFromCartWithoutItemSku() 0 25 1
A requestCreateCartWithoutPriceCurrency() 0 23 1
A requestUpdateItemsInCartWithoutItemSku() 0 33 1
A requestCustomerCarts() 0 20 1
A requestCartByUuidWithCartItemsRelationship() 0 41 1
A requestCreateCartWithoutAuthorizationToken() 0 21 1
A requestDeleteCartWithoutCartUuid() 0 18 1
A requestCartByUuid() 0 32 1
A requestCreateCart() 0 42 1
A requestCartByUuidWithProductConcreteRelationship() 0 51 1
A loadFixtures() 0 6 1
A requestDeleteCart() 0 15 1
A requestUpdateItemsInCartWithoutQuantity() 0 33 1
A requestUpdateItemsInCartWithoutAuthorizationToken() 0 33 1
A requestUpdateCart() 0 57 1
A requestUpdateCartWithoutCartUuid() 0 30 1
A requestUpdateItemsInCart() 0 46 1
A authorizeCustomer() 0 9 2
A requestDeleteItemsFromCart() 0 25 1
A requestCartByNotExistingCartUuid() 0 13 1
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\RestApi;
9
10
use Codeception\Util\HttpCode;
11
use Generated\Shared\Transfer\CustomerTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\CustomerTransfer was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
12
use PyzTest\Glue\Carts\CartsApiTester;
13
use PyzTest\Glue\Carts\RestApi\Fixtures\CartsRestApiFixtures;
14
use Spryker\Glue\CartsRestApi\CartsRestApiConfig;
15
use Spryker\Glue\GlueApplication\Rest\RequestConstantsInterface;
16
use Spryker\Glue\ProductsRestApi\ProductsRestApiConfig;
17
use Spryker\Shared\Calculation\CalculationPriceMode;
18
19
/**
20
 * Auto-generated group annotations
21
 *
22
 * @group PyzTest
23
 * @group Glue
24
 * @group Carts
25
 * @group RestApi
26
 * @group CartsRestApiCest
27
 * Add your own group annotations below this line
28
 * @group EndToEnd
29
 */
30
class CartsRestApiCest
31
{
32
    /**
33
     * @var \PyzTest\Glue\Carts\RestApi\Fixtures\CartsRestApiFixtures
34
     */
35
    protected CartsRestApiFixtures $fixtures;
36
37
    /**
38
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
39
     *
40
     * @return void
41
     */
42
    public function loadFixtures(CartsApiTester $I): void
43
    {
44
        /** @var \PyzTest\Glue\Carts\RestApi\Fixtures\CartsRestApiFixtures $fixtures */
45
        $fixtures = $I->loadFixtures(CartsRestApiFixtures::class);
46
47
        $this->fixtures = $fixtures;
48
    }
49
50
    /**
51
     * @depends loadFixtures
52
     *
53
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
54
     *
55
     * @return void
56
     */
57
    public function requestCarts(CartsApiTester $I): void
58
    {
59
        // Arrange
60
        $quoteTransfer = $I->createPersistentQuote(
61
            $I,
62
            $this->fixtures->getCustomerTransfer(),
63
            [],
64
        );
65
        $quoteUuid = $quoteTransfer->getUuid();
66
        $oauthResponseTransfer = $I->haveAuthorizationToGlue($quoteTransfer->getCustomer());
67
        $I->amBearerAuthenticated($oauthResponseTransfer->getAccessToken());
68
69
        // Act
70
        $I->sendGET($I->buildCartsUrl());
71
72
        // Assert
73
        $I->seeResponseCodeIs(HttpCode::OK);
74
        $I->seeResponseIsJson();
75
        $I->seeResponseMatchesOpenApiSchema();
76
77
        $I->amSure('Response data contains resource collection')
78
            ->whenI()
79
            ->seeResponseDataContainsResourceCollectionOfType(CartsRestApiConfig::RESOURCE_CARTS);
0 ignored issues
show
Bug introduced by
It seems like seeResponseDataContainsResourceCollectionOfType() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

79
            ->/** @scrutinizer ignore-call */ seeResponseDataContainsResourceCollectionOfType(CartsRestApiConfig::RESOURCE_CARTS);
Loading history...
80
81
        $I->amSure('Resource collection has resource')
82
            ->whenI()
83
            ->seeResourceCollectionHasResourceWithId($quoteUuid);
0 ignored issues
show
Bug introduced by
It seems like seeResourceCollectionHasResourceWithId() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

83
            ->/** @scrutinizer ignore-call */ seeResourceCollectionHasResourceWithId($quoteUuid);
Loading history...
84
85
        $I->amSure('Resource has correct self-link')
86
            ->whenI()
87
            ->seeResourceByIdHasSelfLink($quoteUuid, $I->buildCartUrl($quoteUuid));
0 ignored issues
show
Bug introduced by
It seems like seeResourceByIdHasSelfLink() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

87
            ->/** @scrutinizer ignore-call */ seeResourceByIdHasSelfLink($quoteUuid, $I->buildCartUrl($quoteUuid));
Loading history...
88
    }
89
90
    /**
91
     * @depends loadFixtures
92
     *
93
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
94
     *
95
     * @return void
96
     */
97
    public function requestCartByUuid(CartsApiTester $I): void
98
    {
99
        // Arrange
100
        $quoteTransfer = $I->createPersistentQuote(
101
            $I,
102
            $this->fixtures->getCustomerTransfer(),
103
            [],
104
        );
105
        $quoteUuid = $quoteTransfer->getUuid();
106
        $url = $I->buildCartUrl($quoteUuid);
107
        $oauthResponseTransfer = $I->haveAuthorizationToGlue($quoteTransfer->getCustomer());
108
        $I->amBearerAuthenticated($oauthResponseTransfer->getAccessToken());
109
110
        // Act
111
        $I->sendGET($url);
112
113
        // Assert
114
        $I->seeResponseCodeIs(HttpCode::OK);
115
        $I->seeResponseIsJson();
116
        $I->seeResponseMatchesOpenApiSchema();
117
118
        $I->amSure('The returned resource is of correct type')
119
            ->whenI()
120
            ->seeResponseDataContainsSingleResourceOfType(CartsRestApiConfig::RESOURCE_CARTS);
0 ignored issues
show
Bug introduced by
It seems like seeResponseDataContainsSingleResourceOfType() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

120
            ->/** @scrutinizer ignore-call */ seeResponseDataContainsSingleResourceOfType(CartsRestApiConfig::RESOURCE_CARTS);
Loading history...
121
122
        $I->amSure('The returned resource has correct id')
123
            ->whenI()
124
            ->seeSingleResourceIdEqualTo($quoteUuid);
0 ignored issues
show
Bug introduced by
It seems like seeSingleResourceIdEqualTo() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

124
            ->/** @scrutinizer ignore-call */ seeSingleResourceIdEqualTo($quoteUuid);
Loading history...
125
126
        $I->amSure('The returned resource has correct self-link')
127
            ->whenI()
128
            ->seeSingleResourceHasSelfLink($url);
0 ignored issues
show
Bug introduced by
It seems like seeSingleResourceHasSelfLink() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

128
            ->/** @scrutinizer ignore-call */ seeSingleResourceHasSelfLink($url);
Loading history...
129
    }
130
131
    /**
132
     * @depends loadFixtures
133
     *
134
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
135
     *
136
     * @return void
137
     */
138
    public function requestCartByUuidWithCartItemsRelationship(CartsApiTester $I): void
139
    {
140
        // Arrange
141
        $quoteTransfer = $I->createPersistentQuote(
142
            $I,
143
            $this->fixtures->getCustomerTransfer(),
144
            [$this->fixtures->getProductConcreteTransfer()],
145
        );
146
        $cartItemGroupKey = $quoteTransfer->getItems()->offsetGet(0)->getGroupKey();
147
148
        $oauthResponseTransfer = $I->haveAuthorizationToGlue($quoteTransfer->getCustomer());
149
        $I->amBearerAuthenticated($oauthResponseTransfer->getAccessToken());
150
151
        // Act
152
        $I->sendGET($I->buildCartUrl($quoteTransfer->getUuid(), [CartsRestApiConfig::RESOURCE_CART_ITEMS]));
153
154
        // Assert
155
        $I->seeResponseCodeIs(HttpCode::OK);
156
        $I->seeResponseIsJson();
157
        $I->seeResponseMatchesOpenApiSchema();
158
159
        $I->amSure('The returned resource has relationship')
160
            ->whenI()
161
            ->seeSingleResourceHasRelationshipByTypeAndId(
0 ignored issues
show
Bug introduced by
It seems like seeSingleResourceHasRelationshipByTypeAndId() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

161
            ->/** @scrutinizer ignore-call */ seeSingleResourceHasRelationshipByTypeAndId(
Loading history...
162
                CartsRestApiConfig::RESOURCE_CART_ITEMS,
163
                $cartItemGroupKey,
164
            );
165
166
        $I->amSure('The returned resource has include')
167
            ->whenI()
168
            ->seeIncludesContainsResourceByTypeAndId(
0 ignored issues
show
Bug introduced by
It seems like seeIncludesContainsResourceByTypeAndId() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

168
            ->/** @scrutinizer ignore-call */ seeIncludesContainsResourceByTypeAndId(
Loading history...
169
                CartsRestApiConfig::RESOURCE_CART_ITEMS,
170
                $cartItemGroupKey,
171
            );
172
173
        $I->amSure('The include has correct self-link')
174
            ->whenI()
175
            ->seeIncludedResourceByTypeAndIdHasSelfLink(
0 ignored issues
show
Bug introduced by
It seems like seeIncludedResourceByTypeAndIdHasSelfLink() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

175
            ->/** @scrutinizer ignore-call */ seeIncludedResourceByTypeAndIdHasSelfLink(
Loading history...
176
                CartsRestApiConfig::RESOURCE_CART_ITEMS,
177
                $cartItemGroupKey,
178
                $I->buildCartItemUrl($quoteTransfer->getUuid(), $cartItemGroupKey),
179
            );
180
    }
181
182
    /**
183
     * @depends loadFixtures
184
     *
185
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
186
     *
187
     * @return void
188
     */
189
    public function requestCartByUuidWithProductConcreteRelationship(CartsApiTester $I): void
190
    {
191
        // Arrange
192
        $quoteTransfer = $I->createPersistentQuote(
193
            $I,
194
            $this->fixtures->getCustomerTransfer(),
195
            [$this->fixtures->getProductConcreteTransfer()],
196
        );
197
        $cartItemGroupKey = $quoteTransfer->getItems()->offsetGet(0)->getGroupKey();
198
        $productConcreteSku = $this->fixtures->getProductConcreteTransfer()->getSku();
199
        $url = $I->buildCartUrl(
200
            $quoteTransfer->getUuid(),
201
            [
202
                CartsRestApiConfig::RESOURCE_CART_ITEMS,
203
                ProductsRestApiConfig::RESOURCE_CONCRETE_PRODUCTS,
204
            ],
205
        );
206
207
        $oauthResponseTransfer = $I->haveAuthorizationToGlue($quoteTransfer->getCustomer());
208
        $I->amBearerAuthenticated($oauthResponseTransfer->getAccessToken());
209
210
        // Act
211
        $I->sendGET($url);
212
213
        // Assert
214
        $I->seeResponseCodeIs(HttpCode::OK);
215
        $I->seeResponseIsJson();
216
        $I->seeResponseMatchesOpenApiSchema();
217
218
        $I->amSure('The included resource has a relationship')
219
            ->whenI()
220
            ->seeIncludedResourceByTypeAndIdHasRelationshipByTypeAndId(
0 ignored issues
show
Bug introduced by
It seems like seeIncludedResourceByTyp...lationshipByTypeAndId() must be provided by classes using this trait. How about adding it as abstract method to this trait? ( Ignorable by Annotation )

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

220
            ->/** @scrutinizer ignore-call */ seeIncludedResourceByTypeAndIdHasRelationshipByTypeAndId(
Loading history...
221
                CartsRestApiConfig::RESOURCE_CART_ITEMS,
222
                $cartItemGroupKey,
223
                ProductsRestApiConfig::RESOURCE_CONCRETE_PRODUCTS,
224
                $productConcreteSku,
225
            );
226
227
        $I->amSure('The returned resource has include')
228
            ->whenI()
229
            ->seeIncludesContainsResourceByTypeAndId(
230
                ProductsRestApiConfig::RESOURCE_CONCRETE_PRODUCTS,
231
                $productConcreteSku,
232
            );
233
234
        $I->amSure('The include has correct self-link')
235
            ->whenI()
236
            ->seeIncludedResourceByTypeAndIdHasSelfLink(
237
                ProductsRestApiConfig::RESOURCE_CONCRETE_PRODUCTS,
238
                $productConcreteSku,
239
                $I->buildProductConcreteUrl($productConcreteSku),
240
            );
241
    }
242
243
    /**
244
     * @depends loadFixtures
245
     *
246
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
247
     *
248
     * @return void
249
     */
250
    public function requestCartByNotExistingCartUuid(CartsApiTester $I): void
251
    {
252
        // Arrange
253
        $oauthResponseTransfer = $I->haveAuthorizationToGlue($this->fixtures->getCustomerTransfer());
254
        $I->amBearerAuthenticated($oauthResponseTransfer->getAccessToken());
255
256
        // Act
257
        $I->sendGET($I->buildCartUrl('NotExistingUuid'));
258
259
        // Assert
260
        $I->seeResponseCodeIs(HttpCode::NOT_FOUND);
261
        $I->seeResponseIsJson();
262
        $I->seeResponseMatchesOpenApiSchema();
263
    }
264
265
    /**
266
     * @depends loadFixtures
267
     *
268
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
269
     *
270
     * @return void
271
     */
272
    public function requestCreateCart(CartsApiTester $I): void
273
    {
274
        // Arrange
275
        $customerTransfer = $I->confirmCustomer($I->haveCustomer([
276
            CustomerTransfer::PASSWORD => $this->fixtures::TEST_PASSWORD,
277
            CustomerTransfer::NEW_PASSWORD => $this->fixtures::TEST_PASSWORD,
278
        ]));
279
        $this->authorizeCustomer($I, $customerTransfer);
280
281
        // Act
282
        $I->sendPOST(
283
            CartsRestApiConfig::RESOURCE_CARTS,
284
            [
285
                'data' => [
286
                    'type' => CartsRestApiConfig::RESOURCE_CARTS,
287
                    'attributes' => [
288
                        'priceMode' => CalculationPriceMode::PRICE_MODE_GROSS,
289
                        'currency' => $this->fixtures::CURRENCY_EUR,
290
                        'store' => $this->fixtures::STORE_DE,
291
                        'name' => $this->fixtures::TEST_CART_NAME,
292
                    ],
293
                ],
294
            ],
295
        );
296
297
        // Assert
298
        $I->seeResponseCodeIs(HttpCode::CREATED);
299
        $I->seeResponseMatchesOpenApiSchema();
300
301
        $I->seeSingleResourceHasSelfLink(
302
            $I->formatFullUrl(
303
                '{resourceCarts}/{cartUuid}',
304
                [
305
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
306
                    'cartUuid' => $I->getDataFromResponseByJsonPath('$.data')['id'],
307
                ],
308
            ),
309
        );
310
311
        $I->amSure(sprintf('Returned resource is of type %s', CartsRestApiConfig::RESOURCE_CARTS))
312
            ->whenI()
313
            ->seeResponseDataContainsSingleResourceOfType(CartsRestApiConfig::RESOURCE_CARTS);
314
    }
315
316
    /**
317
     * @depends loadFixtures
318
     *
319
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
320
     *
321
     * @return void
322
     */
323
    public function requestCreateCartWithoutAuthorizationToken(CartsApiTester $I): void
324
    {
325
        // Act
326
        $I->sendPOST(
327
            CartsRestApiConfig::RESOURCE_CARTS,
328
            [
329
                'data' => [
330
                    'type' => CartsRestApiConfig::RESOURCE_CARTS,
331
                    'attributes' => [
332
                        'priceMode' => CalculationPriceMode::PRICE_MODE_GROSS,
333
                        'currency' => $this->fixtures::CURRENCY_EUR,
334
                        'store' => $this->fixtures::STORE_DE,
335
                        'name' => $this->fixtures::TEST_CART_NAME,
336
                    ],
337
                ],
338
            ],
339
        );
340
341
        // Assert
342
        $I->seeResponseCodeIs(HttpCode::FORBIDDEN);
343
        $I->seeResponseMatchesOpenApiSchema();
344
    }
345
346
    /**
347
     * @depends loadFixtures
348
     *
349
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
350
     *
351
     * @return void
352
     */
353
    public function requestCreateCartWithoutPriceMode(CartsApiTester $I): void
354
    {
355
        // Arrange
356
        $this->authorizeCustomer($I);
357
358
        // Act
359
        $I->sendPOST(
360
            CartsRestApiConfig::RESOURCE_CARTS,
361
            [
362
                'data' => [
363
                    'type' => CartsRestApiConfig::RESOURCE_CARTS,
364
                    'attributes' => [
365
                        'currency' => $this->fixtures::CURRENCY_EUR,
366
                        'store' => $this->fixtures::STORE_DE,
367
                        'name' => $this->fixtures::TEST_CART_NAME,
368
                    ],
369
                ],
370
            ],
371
        );
372
373
        // Assert
374
        $I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY);
375
        $I->seeResponseMatchesOpenApiSchema();
376
    }
377
378
    /**
379
     * @depends loadFixtures
380
     *
381
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
382
     *
383
     * @return void
384
     */
385
    public function requestCreateCartWithoutPriceCurrency(CartsApiTester $I): void
386
    {
387
        // Arrange
388
        $this->authorizeCustomer($I);
389
390
        // Act
391
        $I->sendPOST(
392
            CartsRestApiConfig::RESOURCE_CARTS,
393
            [
394
                'data' => [
395
                    'type' => CartsRestApiConfig::RESOURCE_CARTS,
396
                    'attributes' => [
397
                        'priceMode' => CalculationPriceMode::PRICE_MODE_GROSS,
398
                        'store' => $this->fixtures::STORE_DE,
399
                        'name' => $this->fixtures::TEST_CART_NAME,
400
                    ],
401
                ],
402
            ],
403
        );
404
405
        // Assert
406
        $I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY);
407
        $I->seeResponseMatchesOpenApiSchema();
408
    }
409
410
    /**
411
     * @depends loadFixtures
412
     *
413
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
414
     *
415
     * @return void
416
     */
417
    public function requestUpdateCart(CartsApiTester $I): void
418
    {
419
        // Arrange
420
        $this->authorizeCustomer($I);
421
422
        $emptyQuoteTransfer = $I->createPersistentQuote(
423
            $I,
424
            $this->fixtures->getCustomerTransfer(),
425
            [],
426
        );
427
        $entityTag = $I->createCartResourceEntityTag(
428
            $I,
429
            $emptyQuoteTransfer->getUuid(),
430
            $emptyQuoteTransfer->toArray(),
431
        );
432
        $I->haveHttpHeader(RequestConstantsInterface::HEADER_IF_MATCH, $entityTag);
433
        $emptyQuoteUuid = $emptyQuoteTransfer->getUuid();
434
435
        // Act
436
        $I->sendPATCH(
437
            $I->formatUrl(
438
                '{resourceCarts}/{cartUuid}',
439
                [
440
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
441
                    'cartUuid' => $emptyQuoteUuid,
442
                ],
443
            ),
444
            [
445
                'data' => [
446
                    'type' => CartsRestApiConfig::RESOURCE_CARTS,
447
                    'attributes' => [
448
                        'name' => $this->fixtures::TEST_CART_NAME,
449
                        'currency' => $this->fixtures::CURRENCY_EUR,
450
                        'priceMode' => CalculationPriceMode::PRICE_MODE_GROSS,
451
                    ],
452
                ],
453
            ],
454
        );
455
456
        // Assert
457
        $I->seeResponseCodeIs(HttpCode::OK);
458
        $I->seeResponseMatchesOpenApiSchema();
459
460
        $I->amSure('Returned resource has correct id')
461
            ->whenI()
462
            ->seeSingleResourceIdEqualTo($emptyQuoteUuid);
463
464
        $I->amSure(sprintf('Returned resource is of type %s', CartsRestApiConfig::RESOURCE_CARTS))
465
            ->whenI()
466
            ->seeResponseDataContainsSingleResourceOfType(CartsRestApiConfig::RESOURCE_CARTS);
467
468
        $I->seeSingleResourceHasSelfLink(
469
            $I->formatFullUrl(
470
                '{resourceCarts}/{cartUuid}',
471
                [
472
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
473
                    'cartUuid' => $emptyQuoteUuid,
474
                ],
475
            ),
476
        );
477
    }
478
479
    /**
480
     * @depends loadFixtures
481
     *
482
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
483
     *
484
     * @return void
485
     */
486
    public function requestUpdatePriceModeOfNonEmptyCart(CartsApiTester $I): void
487
    {
488
        // Arrange
489
        $this->authorizeCustomer($I);
490
        $quoteTransfer = $I->createPersistentQuote(
491
            $I,
492
            $this->fixtures->getCustomerTransfer(),
493
            [$this->fixtures->getProductConcreteTransfer()],
494
        );
495
        $cartUuid = $quoteTransfer->getUuid();
496
        $entityTag = $I->createCartResourceEntityTag(
497
            $I,
498
            $cartUuid,
499
            $quoteTransfer->toArray(),
500
        );
501
502
        $I->haveHttpHeader(RequestConstantsInterface::HEADER_IF_MATCH, $entityTag);
503
504
        // Act
505
        $I->sendPATCH(
506
            $I->formatUrl(
507
                '{resourceCarts}/{cartUuid}',
508
                [
509
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
510
                    'cartUuid' => $cartUuid,
511
                ],
512
            ),
513
            [
514
                'data' => [
515
                    'type' => CartsRestApiConfig::RESOURCE_CARTS,
516
                    'attributes' => [
517
                        'name' => $this->fixtures::TEST_CART_NAME,
518
                        'currency' => $this->fixtures::CURRENCY_EUR,
519
                        'priceMode' => CalculationPriceMode::PRICE_MODE_NET,
520
                    ],
521
                ],
522
            ],
523
        );
524
525
        // Assert
526
        $I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY);
527
        $I->seeResponseMatchesOpenApiSchema();
528
    }
529
530
    /**
531
     * @depends loadFixtures
532
     *
533
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
534
     *
535
     * @return void
536
     */
537
    public function requestUpdateCartWithoutCartUuid(CartsApiTester $I): void
538
    {
539
        // Arrange
540
        $this->authorizeCustomer($I);
541
        $quoteTransfer = $I->createPersistentQuote(
542
            $I,
543
            $this->fixtures->getCustomerTransfer(),
544
            [],
545
        );
546
        $entityTag = $I->createCartResourceEntityTag($I, $quoteTransfer->getUuid(), $quoteTransfer->toArray());
547
        $I->haveHttpHeader(RequestConstantsInterface::HEADER_IF_MATCH, $entityTag);
548
549
        // Act
550
        $I->sendPATCH(
551
            CartsRestApiConfig::RESOURCE_CARTS,
552
            [
553
                'data' => [
554
                    'type' => CartsRestApiConfig::RESOURCE_CARTS,
555
                    'attributes' => [
556
                        'name' => $this->fixtures::TEST_CART_NAME,
557
                        'currency' => $this->fixtures::CURRENCY_EUR,
558
                        'priceMode' => CalculationPriceMode::PRICE_MODE_GROSS,
559
                    ],
560
                ],
561
            ],
562
        );
563
564
        // Assert
565
        $I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
566
        $I->seeResponseIsJson();
567
    }
568
569
    /**
570
     * @depends loadFixtures
571
     *
572
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
573
     *
574
     * @return void
575
     */
576
    public function requestUpdateCartWithoutAuthorizationToken(CartsApiTester $I): void
577
    {
578
        // Arrange
579
        $quoteTransfer = $I->createPersistentQuote(
580
            $I,
581
            $this->fixtures->getCustomerTransfer(),
582
            [],
583
        );
584
        $entityTag = $I->createCartResourceEntityTag($I, $quoteTransfer->getUuid(), $quoteTransfer->toArray());
585
        $I->haveHttpHeader(RequestConstantsInterface::HEADER_IF_MATCH, $entityTag);
586
587
        // Act
588
        $I->sendPATCH(
589
            $I->formatUrl(
590
                '{resourceCarts}/{cartUuid}',
591
                [
592
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
593
                    'cartUuid' => $quoteTransfer->getUuid(),
594
                ],
595
            ),
596
            [
597
                'data' => [
598
                    'type' => CartsRestApiConfig::RESOURCE_CARTS,
599
                    'attributes' => [
600
                        'name' => $this->fixtures::TEST_CART_NAME,
601
                        'currency' => $this->fixtures::CURRENCY_EUR,
602
                        'priceMode' => CalculationPriceMode::PRICE_MODE_GROSS,
603
                    ],
604
                ],
605
            ],
606
        );
607
608
        // Assert
609
        $I->seeResponseCodeIs(HttpCode::FORBIDDEN);
610
        $I->seeResponseMatchesOpenApiSchema();
611
    }
612
613
    /**
614
     * @depends loadFixtures
615
     *
616
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
617
     *
618
     * @return void
619
     */
620
    public function requestAddItemsToCart(CartsApiTester $I): void
621
    {
622
        // Arrange
623
        $this->authorizeCustomer($I);
624
        $quoteTransfer = $I->createPersistentQuote(
625
            $I,
626
            $this->fixtures->getCustomerTransfer(),
627
            [],
628
        );
629
        $quoteUuid = $quoteTransfer->getUuid();
630
631
        // Act
632
        $I->sendPOST(
633
            $I->formatUrl(
634
                '{resourceCarts}/{cartUuid}/{resourceCartItems}?include={resourceCartItems}',
635
                [
636
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
637
                    'cartUuid' => $quoteUuid,
638
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
639
                ],
640
            ),
641
            [
642
                'data' => [
643
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
644
                    'attributes' => [
645
                        'sku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
646
                        'quantity' => 1,
647
                    ],
648
                ],
649
            ],
650
        );
651
652
        $quoteTransfer = $I->getLocator()->quote()->facade()->findQuoteByUuid($quoteTransfer)->getQuoteTransfer();
653
654
        // Assert
655
        $I->seeResponseCodeIs(HttpCode::CREATED);
656
        $I->seeResponseMatchesOpenApiSchema();
657
658
        $I->amSure('Returned resource has correct id')
659
            ->whenI()
660
            ->seeSingleResourceIdEqualTo($quoteUuid);
661
662
        $I->amSure(sprintf('Returned resource is of type %s', CartsRestApiConfig::RESOURCE_CARTS))
663
            ->whenI()
664
            ->seeResponseDataContainsSingleResourceOfType(CartsRestApiConfig::RESOURCE_CARTS);
665
666
        $I->amSure('Returned resource has include of type items')
667
            ->whenI()
668
            ->seeIncludesContainsResourceByTypeAndId(
669
                CartsRestApiConfig::RESOURCE_CART_ITEMS,
670
                $I->getGroupKeyFromQuote($quoteTransfer, $this->fixtures->getProductConcreteTransfer()->getSku()),
671
            );
672
673
        $I->seeSingleResourceHasSelfLink(
674
            $I->formatFullUrl(
675
                '{resourceCarts}/{cartUuid}',
676
                [
677
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
678
                    'cartUuid' => $I->getDataFromResponseByJsonPath('$.data')['id'],
679
                ],
680
            ),
681
        );
682
    }
683
684
    /**
685
     * @depends loadFixtures
686
     *
687
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
688
     *
689
     * @return void
690
     */
691
    public function requestAddItemsToCartWithoutAuthorizationToken(CartsApiTester $I): void
692
    {
693
        // Arrange
694
        $quoteTransfer = $I->createPersistentQuote(
695
            $I,
696
            $this->fixtures->getCustomerTransfer(),
697
            [],
698
        );
699
700
        // Act
701
        $I->sendPOST(
702
            $I->formatUrl(
703
                '{resourceCarts}/{cartUuid}/{resourceCartItems}',
704
                [
705
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
706
                    'cartUuid' => $quoteTransfer->getUuid(),
707
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
708
                ],
709
            ),
710
            [
711
                'data' => [
712
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
713
                    'attributes' => [
714
                        'sku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
715
                        'quantity' => 1,
716
                    ],
717
                ],
718
            ],
719
        );
720
721
        // Assert
722
        $I->seeResponseCodeIs(HttpCode::FORBIDDEN);
723
        $I->seeResponseMatchesOpenApiSchema();
724
    }
725
726
    /**
727
     * @depends loadFixtures
728
     *
729
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
730
     *
731
     * @return void
732
     */
733
    public function requestAddItemsToCartWithoutItemSku(CartsApiTester $I): void
734
    {
735
        // Arrange
736
        $this->authorizeCustomer($I);
737
        $quoteTransfer = $I->createPersistentQuote(
738
            $I,
739
            $this->fixtures->getCustomerTransfer(),
740
            [],
741
        );
742
743
        // Act
744
        $I->sendPOST(
745
            $I->formatUrl(
746
                '{resourceCarts}/{cartUuid}/{resourceCartItems}',
747
                [
748
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
749
                    'cartUuid' => $quoteTransfer->getUuid(),
750
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
751
                ],
752
            ),
753
            [
754
                'data' => [
755
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
756
                    'attributes' => [
757
                        'quantity' => 1,
758
                    ],
759
                ],
760
            ],
761
        );
762
763
        // Assert
764
        $I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY);
765
        $I->seeResponseMatchesOpenApiSchema();
766
    }
767
768
    /**
769
     * @depends loadFixtures
770
     *
771
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
772
     *
773
     * @return void
774
     */
775
    public function requestAddItemsToCartWithoutItemQuantity(CartsApiTester $I): void
776
    {
777
        // Arrange
778
        $this->authorizeCustomer($I);
779
        $quoteTransfer = $I->createPersistentQuote(
780
            $I,
781
            $this->fixtures->getCustomerTransfer(),
782
            [],
783
        );
784
785
        // Act
786
        $I->sendPOST(
787
            $I->formatUrl(
788
                '{resourceCarts}/{cartUuid}/{resourceCartItems}',
789
                [
790
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
791
                    'cartUuid' => $quoteTransfer->getUuid(),
792
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
793
                ],
794
            ),
795
            [
796
                'data' => [
797
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
798
                    'attributes' => [
799
                        'sku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
800
                    ],
801
                ],
802
            ],
803
        );
804
805
        // Assert
806
        $I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY);
807
        $I->seeResponseMatchesOpenApiSchema();
808
    }
809
810
    /**
811
     * @depends loadFixtures
812
     *
813
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
814
     *
815
     * @return void
816
     */
817
    public function requestUpdateItemsInCart(CartsApiTester $I): void
818
    {
819
        // Arrange
820
        $this->authorizeCustomer($I);
821
822
        $quoteTransfer = $I->createPersistentQuote(
823
            $I,
824
            $this->fixtures->getCustomerTransfer(),
825
            [$this->fixtures->getProductConcreteTransfer()],
826
        );
827
828
        $itemGroupKey = $I->getGroupKeyFromQuote($quoteTransfer, $this->fixtures->getProductConcreteTransfer()->getSku());
829
830
        // Act
831
        $I->sendPATCH(
832
            $I->formatUrl(
833
                '{resourceCarts}/{cartUuid}/{resourceCartItems}/{itemId}?include={resourceCartItems}',
834
                [
835
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
836
                    'cartUuid' => $quoteTransfer->getUuid(),
837
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
838
                    'itemId' => $itemGroupKey,
839
                ],
840
            ),
841
            [
842
                'data' => [
843
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
844
                    'attributes' => [
845
                        'quantity' => $this->fixtures::QUANTITY_FOR_ITEM_UPDATE,
846
                    ],
847
                ],
848
            ],
849
        );
850
851
        // Assert
852
        $I->seeResponseCodeIs(HttpCode::OK);
853
        $I->seeResponseMatchesOpenApiSchema();
854
855
        $I->amSure(sprintf('Returned resource is of type %s', CartsRestApiConfig::RESOURCE_CARTS))
856
            ->whenI()
857
            ->seeResponseDataContainsSingleResourceOfType(CartsRestApiConfig::RESOURCE_CARTS);
858
859
        $I->seeCartItemQuantityEqualsToQuantityInRequest(
860
            $this->fixtures::QUANTITY_FOR_ITEM_UPDATE,
861
            CartsRestApiConfig::RESOURCE_CART_ITEMS,
862
            $itemGroupKey,
0 ignored issues
show
Bug introduced by
It seems like $itemGroupKey can also be of type null; however, parameter $itemSku of PyzTest\Glue\Carts\Carts...lsToQuantityInRequest() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

862
            /** @scrutinizer ignore-type */ $itemGroupKey,
Loading history...
863
        );
864
    }
865
866
    /**
867
     * @depends loadFixtures
868
     *
869
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
870
     *
871
     * @return void
872
     */
873
    public function requestUpdateItemsInCartWithoutCartUuid(CartsApiTester $I): void
874
    {
875
        // Arrange
876
        $this->authorizeCustomer($I);
877
878
        // Act
879
        $I->sendPATCH(
880
            $I->formatUrl(
881
                '{resourceCarts}//{resourceCartItems}/{cartItemSku}',
882
                [
883
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
884
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
885
                    'cartItemSku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
886
                ],
887
            ),
888
            [
889
                'data' => [
890
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
891
                    'attributes' => [
892
                        'quantity' => $this->fixtures::QUANTITY_FOR_ITEM_UPDATE,
893
                    ],
894
                ],
895
            ],
896
        );
897
898
        // Assert
899
        $I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
900
        $I->seeResponseMatchesOpenApiSchema();
901
    }
902
903
    /**
904
     * @depends loadFixtures
905
     *
906
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
907
     *
908
     * @return void
909
     */
910
    public function requestUpdateItemsInCartWithoutAuthorizationToken(CartsApiTester $I): void
911
    {
912
        // Arrange
913
        $quoteTransfer = $I->createPersistentQuote(
914
            $I,
915
            $this->fixtures->getCustomerTransfer(),
916
            [$this->fixtures->getProductConcreteTransfer()],
917
        );
918
919
        // Act
920
        $I->sendPATCH(
921
            $I->formatUrl(
922
                '{resourceCarts}/{cartUuid}/{resourceCartItems}/{itemSku}',
923
                [
924
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
925
                    'cartUuid' => $quoteTransfer->getUuid(),
926
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
927
                    'itemSku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
928
                ],
929
            ),
930
            [
931
                'data' => [
932
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
933
                    'attributes' => [
934
                        'quantity' => $this->fixtures::QUANTITY_FOR_ITEM_UPDATE,
935
                    ],
936
                ],
937
            ],
938
        );
939
940
        // Assert
941
        $I->seeResponseCodeIs(HttpCode::FORBIDDEN);
942
        $I->seeResponseMatchesOpenApiSchema();
943
    }
944
945
    /**
946
     * @depends loadFixtures
947
     *
948
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
949
     *
950
     * @return void
951
     */
952
    public function requestUpdateItemsInCartWithoutQuantity(CartsApiTester $I): void
953
    {
954
        // Arrange
955
        $this->authorizeCustomer($I);
956
        $quoteTransfer = $I->createPersistentQuote(
957
            $I,
958
            $this->fixtures->getCustomerTransfer(),
959
            [$this->fixtures->getProductConcreteTransfer()],
960
        );
961
962
        // Act
963
        $I->sendPATCH(
964
            $I->formatUrl(
965
                '{resourceCarts}/{cartUuid}/{resourceCartItems}/{itemSku}',
966
                [
967
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
968
                    'cartUuid' => $quoteTransfer->getUuid(),
969
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
970
                    'itemSku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
971
                ],
972
            ),
973
            [
974
                'data' => [
975
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
976
                    'attributes' => [
977
                    ],
978
                ],
979
            ],
980
        );
981
982
        // Assert
983
        $I->seeResponseCodeIs(HttpCode::UNPROCESSABLE_ENTITY);
984
        $I->seeResponseMatchesOpenApiSchema();
985
    }
986
987
    /**
988
     * @depends loadFixtures
989
     *
990
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
991
     *
992
     * @return void
993
     */
994
    public function requestUpdateItemsInCartWithoutItemSku(CartsApiTester $I): void
995
    {
996
        // Arrange
997
        $this->authorizeCustomer($I);
998
        $quoteTransfer = $I->createPersistentQuote(
999
            $I,
1000
            $this->fixtures->getCustomerTransfer(),
1001
            [$this->fixtures->getProductConcreteTransfer()],
1002
        );
1003
1004
        // Act
1005
        $I->sendPATCH(
1006
            $I->formatUrl(
1007
                '{resourceCarts}/{cartUuid}/{resourceCartItems}',
1008
                [
1009
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
1010
                    'cartUuid' => $quoteTransfer->getUuid(),
1011
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
1012
                ],
1013
            ),
1014
            [
1015
                'data' => [
1016
                    'type' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
1017
                    'attributes' => [
1018
                        'quantity' => $this->fixtures::QUANTITY_FOR_ITEM_UPDATE,
1019
                    ],
1020
                ],
1021
            ],
1022
        );
1023
1024
        // Assert
1025
        $I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
1026
        $I->seeResponseIsJson();
1027
    }
1028
1029
    /**
1030
     * @depends loadFixtures
1031
     *
1032
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1033
     *
1034
     * @return void
1035
     */
1036
    public function requestDeleteItemsFromCart(CartsApiTester $I): void
1037
    {
1038
        // Arrange
1039
        $this->authorizeCustomer($I);
1040
        $quoteTransfer = $I->createPersistentQuote(
1041
            $I,
1042
            $this->fixtures->getCustomerTransfer(),
1043
            [$this->fixtures->getProductConcreteTransfer()],
1044
        );
1045
1046
        // Act
1047
        $I->sendDelete(
1048
            $I->formatUrl(
1049
                '{resourceCarts}/{cartUuid}/{resourceCartItems}/{itemSku}',
1050
                [
1051
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
1052
                    'cartUuid' => $quoteTransfer->getUuid(),
1053
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
1054
                    'itemSku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
1055
                ],
1056
            ),
1057
        );
1058
1059
        // Assert
1060
        $I->seeResponseCodeIs(HttpCode::NO_CONTENT);
1061
    }
1062
1063
    /**
1064
     * @depends loadFixtures
1065
     *
1066
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1067
     *
1068
     * @return void
1069
     */
1070
    public function requestDeleteItemsFromCartWithoutCartUuid(CartsApiTester $I): void
1071
    {
1072
        // Arrange
1073
        $this->authorizeCustomer($I);
1074
1075
        // Act
1076
        $I->sendDelete(
1077
            $I->formatUrl(
1078
                '{resourceCarts}//{resourceCartItems}/{itemSku}',
1079
                [
1080
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
1081
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
1082
                    'itemSku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
1083
                ],
1084
            ),
1085
        );
1086
1087
        // Assert
1088
        $I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
1089
        $I->seeResponseMatchesOpenApiSchema();
1090
    }
1091
1092
    /**
1093
     * @depends loadFixtures
1094
     *
1095
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1096
     *
1097
     * @return void
1098
     */
1099
    public function requestDeleteItemsFromCartWithoutAuthorizationToken(CartsApiTester $I): void
1100
    {
1101
        // Arrange
1102
        $quoteTransfer = $I->createPersistentQuote(
1103
            $I,
1104
            $this->fixtures->getCustomerTransfer(),
1105
            [$this->fixtures->getProductConcreteTransfer()],
1106
        );
1107
1108
        // Act
1109
        $I->sendDelete(
1110
            $I->formatUrl(
1111
                '{resourceCarts}/{cartUuid}/{resourceCartItems}/{itemSku}',
1112
                [
1113
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
1114
                    'cartUuid' => $quoteTransfer->getUuid(),
1115
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
1116
                    'itemSku' => $this->fixtures->getProductConcreteTransfer()->getSku(),
1117
                ],
1118
            ),
1119
        );
1120
1121
        // Assert
1122
        $I->seeResponseCodeIs(HttpCode::FORBIDDEN);
1123
        $I->seeResponseMatchesOpenApiSchema();
1124
    }
1125
1126
    /**
1127
     * @depends loadFixtures
1128
     *
1129
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1130
     *
1131
     * @return void
1132
     */
1133
    public function requestDeleteItemsFromCartWithoutItemSku(CartsApiTester $I): void
1134
    {
1135
        // Arrange
1136
        $this->authorizeCustomer($I);
1137
        $quoteTransfer = $I->createPersistentQuote(
1138
            $I,
1139
            $this->fixtures->getCustomerTransfer(),
1140
            [$this->fixtures->getProductConcreteTransfer()],
1141
        );
1142
1143
        // Act
1144
        $I->sendDelete(
1145
            $I->formatUrl(
1146
                '{resourceCarts}/{cartUuid}/{resourceCartItems}',
1147
                [
1148
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
1149
                    'cartUuid' => $quoteTransfer->getUuid(),
1150
                    'resourceCartItems' => CartsRestApiConfig::RESOURCE_CART_ITEMS,
1151
                ],
1152
            ),
1153
        );
1154
1155
        // Assert
1156
        $I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
1157
        $I->seeResponseIsJson();
1158
    }
1159
1160
    /**
1161
     * @depends loadFixtures
1162
     *
1163
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1164
     *
1165
     * @return void
1166
     */
1167
    public function requestDeleteCart(CartsApiTester $I): void
1168
    {
1169
        // Arrange
1170
        $this->authorizeCustomer($I);
1171
        $quoteTransfer = $I->createPersistentQuote(
1172
            $I,
1173
            $this->fixtures->getCustomerTransfer(),
1174
            [],
1175
        );
1176
1177
        // Act
1178
        $I->sendDelete($I->buildCartUrl($quoteTransfer->getUuid()));
1179
1180
        // Assert
1181
        $I->seeResponseCodeIs(HttpCode::NO_CONTENT);
1182
    }
1183
1184
    /**
1185
     * @depends loadFixtures
1186
     *
1187
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1188
     *
1189
     * @return void
1190
     */
1191
    public function requestDeleteCartWithoutCartUuid(CartsApiTester $I): void
1192
    {
1193
        // Arrange
1194
        $this->authorizeCustomer($I);
1195
1196
        // Act
1197
        $I->sendDelete(
1198
            $I->formatUrl(
1199
                '{resourceCarts}',
1200
                [
1201
                    'resourceCarts' => CartsRestApiConfig::RESOURCE_CARTS,
1202
                ],
1203
            ),
1204
        );
1205
1206
        // Assert
1207
        $I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
1208
        $I->seeResponseIsJson();
1209
    }
1210
1211
    /**
1212
     * @depends loadFixtures
1213
     *
1214
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1215
     *
1216
     * @return void
1217
     */
1218
    public function requestDeleteCartWithoutAuthorizationToken(CartsApiTester $I): void
1219
    {
1220
        // Arrange
1221
        $quoteTransfer = $I->createPersistentQuote(
1222
            $I,
1223
            $this->fixtures->getCustomerTransfer(),
1224
            [],
1225
        );
1226
1227
        // Act
1228
        $I->sendDelete($I->buildCartUrl($quoteTransfer->getUuid()));
1229
1230
        // Assert
1231
        $I->seeResponseCodeIs(HttpCode::FORBIDDEN);
1232
        $I->seeResponseMatchesOpenApiSchema();
1233
    }
1234
1235
    /**
1236
     * @depends loadFixtures
1237
     *
1238
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1239
     *
1240
     * @return void
1241
     */
1242
    public function requestCustomerCarts(CartsApiTester $I): void
1243
    {
1244
        // Arrange
1245
        $quoteTransfer = $I->createPersistentQuote(
1246
            $I,
1247
            $this->fixtures->getCustomerTransfer(),
1248
            [],
1249
        );
1250
1251
        $url = $I->buildCustomerCartUrl($quoteTransfer->getCustomer()->getCustomerReference());
1252
1253
        $oauthResponseTransfer = $I->haveAuthorizationToGlue($quoteTransfer->getCustomer());
1254
        $I->amBearerAuthenticated($oauthResponseTransfer->getAccessToken());
1255
1256
        // Act
1257
        $I->sendGET($url);
1258
1259
        // Assert
1260
        $I->seeResponseCodeIs(HttpCode::OK);
1261
        $I->seeResponseMatchesOpenApiSchema();
1262
    }
1263
1264
    /**
1265
     * @depends loadFixtures
1266
     *
1267
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1268
     *
1269
     * @return void
1270
     */
1271
    public function requestCustomerCartsAuthorizationError(CartsApiTester $I): void
1272
    {
1273
        // Arrange
1274
        $quoteTransfer = $I->createPersistentQuote(
1275
            $I,
1276
            $this->fixtures->getCustomerTransfer(),
1277
            [],
1278
        );
1279
1280
        $url = $I->buildCustomerCartUrl('wrongCustomerReference');
1281
1282
        $oauthResponseTransfer = $I->haveAuthorizationToGlue($quoteTransfer->getCustomer());
1283
        $I->amBearerAuthenticated($oauthResponseTransfer->getAccessToken());
1284
1285
        // Act
1286
        $I->sendGET($url);
1287
1288
        // Assert
1289
        $I->seeResponseCodeIs(HttpCode::FORBIDDEN);
1290
        $I->seeResponseMatchesOpenApiSchema();
1291
    }
1292
1293
    /**
1294
     * @param \PyzTest\Glue\Carts\CartsApiTester $I
1295
     * @param \Generated\Shared\Transfer\CustomerTransfer|null $customerTransfer
1296
     *
1297
     * @return void
1298
     */
1299
    protected function authorizeCustomer(CartsApiTester $I, ?CustomerTransfer $customerTransfer = null): void
1300
    {
1301
        if (!$customerTransfer) {
1302
            $customerTransfer = $this->fixtures->getCustomerTransfer();
1303
        }
1304
1305
        $token = $I->haveAuthorizationToGlue($customerTransfer)->getAccessToken();
1306
1307
        $I->amBearerAuthenticated($token);
1308
    }
1309
}
1310