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

ProductConfigurationsApiTester   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 131
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 10
eloc 37
dl 0
loc 131
c 2
b 0
f 0
rs 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A amAuthorizedCustomer() 0 5 1
A grabProductConfigurationInstanceDataFromConcreteProductsResource() 0 3 1
A seeProductConfigurationInstanceEqualToExpectedValue() 0 11 1
A mapProductConfigurationTransferToRestProductConfigurationInstanceAttributesTransfer() 0 13 1
A grabIncludedByTypeAndSku() 0 15 3
A seeOrderItemContainProductConfigurationInstance() 0 11 1
A seeCartItemContainsProductConfigurationInstance() 0 7 1
A grabProductConfigurationInstanceDataFromOrdersResource() 0 3 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\ProductConfigurations;
9
10
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...
11
use Generated\Shared\Transfer\ProductConfigurationTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...ctConfigurationTransfer 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 Generated\Shared\Transfer\RestProductConfigurationInstanceAttributesTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...tanceAttributesTransfer 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...
13
use SprykerTest\Glue\Testify\Tester\ApiEndToEndTester;
14
15
/**
16
 * Inherited Methods
17
 *
18
 * @method void wantToTest($text)
19
 * @method void wantTo($text)
20
 * @method void execute($callable)
21
 * @method void expectTo($prediction)
22
 * @method void expect($prediction)
23
 * @method void amGoingTo($argumentation)
24
 * @method void am($role)
25
 * @method void lookForwardTo($achieveValue)
26
 * @method void comment($description)
27
 * @method void pause()
28
 *
29
 * @SuppressWarnings(\PyzTest\Glue\ProductConfigurations\PHPMD)
30
 */
31
class ProductConfigurationsApiTester extends ApiEndToEndTester
32
{
33
    use _generated\ProductConfigurationsApiTesterActions;
0 ignored issues
show
Bug introduced by
The type PyzTest\Glue\ProductConf...rationsApiTesterActions 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...
34
35
    /**
36
     * @var string
37
     */
38
    protected const ATTRIBUTE_KEY_SKU = 'sku';
39
40
    /**
41
     * @param \Generated\Shared\Transfer\CustomerTransfer $customerTransfer
42
     *
43
     * @return void
44
     */
45
    public function amAuthorizedCustomer(CustomerTransfer $customerTransfer): void
46
    {
47
        $token = $this->haveAuthorizationToGlue($customerTransfer)->getAccessTokenOrFail();
48
49
        $this->amBearerAuthenticated($token);
50
    }
51
52
    /**
53
     * @param \Generated\Shared\Transfer\ProductConfigurationTransfer $productConfigurationTransfer
54
     *
55
     * @return void
56
     */
57
    public function seeProductConfigurationInstanceEqualToExpectedValue(ProductConfigurationTransfer $productConfigurationTransfer): void
58
    {
59
        $productConfigurationData = $this->grabProductConfigurationInstanceDataFromConcreteProductsResource();
60
        $restProductConfigurationInstanceAttributesTransfer = $this->mapProductConfigurationTransferToRestProductConfigurationInstanceAttributesTransfer(
61
            $productConfigurationTransfer,
62
            new RestProductConfigurationInstanceAttributesTransfer(),
63
        );
64
65
        $this->assertEqualsCanonicalizing(
66
            $productConfigurationData,
67
            $restProductConfigurationInstanceAttributesTransfer->toArray(),
68
        );
69
    }
70
71
    /**
72
     * @param \Generated\Shared\Transfer\ProductConfigurationTransfer $productConfigurationTransfer
73
     *
74
     * @return void
75
     */
76
    public function seeOrderItemContainProductConfigurationInstance(ProductConfigurationTransfer $productConfigurationTransfer): void
77
    {
78
        $productConfigurationData = $this->grabProductConfigurationInstanceDataFromOrdersResource();
79
        $restProductConfigurationInstanceAttributesTransfer = $this->mapProductConfigurationTransferToRestProductConfigurationInstanceAttributesTransfer(
80
            $productConfigurationTransfer,
81
            new RestProductConfigurationInstanceAttributesTransfer(),
82
        );
83
84
        $this->assertEquals($productConfigurationData['displayData'], $restProductConfigurationInstanceAttributesTransfer->getDisplayData());
85
        $this->assertEquals($productConfigurationData['configuration'], $restProductConfigurationInstanceAttributesTransfer->getConfiguration());
86
        $this->assertEquals($productConfigurationData['configuratorKey'], $restProductConfigurationInstanceAttributesTransfer->getConfiguratorKey());
87
    }
88
89
    /**
90
     * @param string $resourceName
91
     * @param string $itemSku
92
     *
93
     * @return void
94
     */
95
    public function seeCartItemContainsProductConfigurationInstance(
96
        string $resourceName,
97
        string $itemSku,
98
    ): void {
99
        $includedByTypeAndSku = $this->grabIncludedByTypeAndSku($resourceName, $itemSku);
100
101
        $this->assertArrayHasKey('productConfigurationInstance', $includedByTypeAndSku);
102
    }
103
104
    /**
105
     * @param string $resourceName
106
     * @param string $sku
107
     *
108
     * @return array<string, mixed>
109
     */
110
    public function grabIncludedByTypeAndSku(string $resourceName, string $sku): array
111
    {
112
        $jsonPath = sprintf(
113
            '$..included[?(@.type == \'%s\')].attributes',
114
            $resourceName,
115
        );
116
117
        $attributes = $this->grabDataFromResponseByJsonPath($jsonPath);
118
        foreach ($attributes as $attribute) {
119
            if ($attribute[static::ATTRIBUTE_KEY_SKU] === $sku) {
120
                return $attribute;
121
            }
122
        }
123
124
        return [];
125
    }
126
127
    /**
128
     * @return array<string, mixed>
129
     */
130
    protected function grabProductConfigurationInstanceDataFromConcreteProductsResource(): array
131
    {
132
        return $this->getDataFromResponseByJsonPath('$.data.attributes.productConfigurationInstance');
133
    }
134
135
    /**
136
     * @return array<string, mixed>
137
     */
138
    protected function grabProductConfigurationInstanceDataFromOrdersResource(): array
139
    {
140
        return $this->getDataFromResponseByJsonPath('$.data.attributes.items[0].salesOrderItemConfiguration');
141
    }
142
143
    /**
144
     * @param \Generated\Shared\Transfer\ProductConfigurationTransfer $productConfigurationTransfer
145
     * @param \Generated\Shared\Transfer\RestProductConfigurationInstanceAttributesTransfer $restProductConfigurationInstanceAttributesTransfer
146
     *
147
     * @return \Generated\Shared\Transfer\RestProductConfigurationInstanceAttributesTransfer
148
     */
149
    protected function mapProductConfigurationTransferToRestProductConfigurationInstanceAttributesTransfer(
150
        ProductConfigurationTransfer $productConfigurationTransfer,
151
        RestProductConfigurationInstanceAttributesTransfer $restProductConfigurationInstanceAttributesTransfer,
152
    ): RestProductConfigurationInstanceAttributesTransfer {
153
        $restProductConfigurationInstanceAttributesTransfer = $restProductConfigurationInstanceAttributesTransfer->fromArray(
154
            $productConfigurationTransfer->toArray(),
155
            true,
156
        );
157
158
        $restProductConfigurationInstanceAttributesTransfer->setDisplayData($productConfigurationTransfer->getDefaultDisplayData());
159
        $restProductConfigurationInstanceAttributesTransfer->setConfiguration($productConfigurationTransfer->getDefaultConfiguration());
160
161
        return $restProductConfigurationInstanceAttributesTransfer;
162
    }
163
}
164