Passed
Push — master ( cacbf1...74b6c9 )
by
unknown
34:14
created

modelCreationFailureDataProvider()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 46
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 31
nc 1
nop 0
dl 0
loc 46
rs 9.424
c 0
b 0
f 0
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 SprykerFeatureTest\Zed\SelfServicePortal\Business\Facade;
9
10
use Codeception\Test\Unit;
11
use Generated\Shared\Transfer\SspModelCollectionRequestTransfer;
12
use Generated\Shared\Transfer\SspModelCollectionResponseTransfer;
13
use Generated\Shared\Transfer\SspModelTransfer;
14
use Spryker\Zed\FileManager\Dependency\Service\FileManagerToFileSystemServiceInterface;
15
use Spryker\Zed\FileManager\FileManagerDependencyProvider;
16
use SprykerFeature\Zed\SelfServicePortal\Business\SelfServicePortalFacade;
17
18
/**
19
 * @group SprykerFeatureTest
20
 * @group Zed
21
 * @group SelfServicePortal
22
 * @group Business
23
 * @group SspModelManagementFacadeTest
24
 */
25
class SspModelManagementFacadeTest extends Unit
26
{
27
    /**
28
     * @var \SprykerFeatureTest\Zed\SelfServicePortal\SelfServicePortalBusinessTester
29
     */
30
    protected $tester;
31
32
    /**
33
     * @var \SprykerFeature\Zed\SelfServicePortal\Business\SelfServicePortalFacade
34
     */
35
    protected $selfServicePortalFacade;
36
37
    protected function _before(): void
38
    {
39
        $this->selfServicePortalFacade = new SelfServicePortalFacade();
40
41
        $serviceFileSystemMock = $this->createMock(FileManagerToFileSystemServiceInterface::class);
42
        $serviceFileSystemMock->method('write')->willReturnCallback(function (): void {
43
        });
44
        $this->tester->setDependency(FileManagerDependencyProvider::SERVICE_FILE_SYSTEM, $serviceFileSystemMock);
45
    }
46
47
    /**
48
     * @dataProvider modelCreatedSuccessfulCollectionDataProvider
49
     *
50
     * @param array<mixed> $sspModelData
51
     * @param int $expectedModelCount
52
     * @param string $expectedName
53
     * @param array<string> $expectedValidationErrors
54
     *
55
     * @return void
56
     */
57
    public function testCreateSspModelCollectionIsSuccessful(
58
        array $sspModelData,
59
        int $expectedModelCount,
60
        string $expectedName,
61
        array $expectedValidationErrors
62
    ): void {
63
        // Arrange
64
        $sspModelTransfer = (new SspModelTransfer())
65
            ->setName($sspModelData['name'])
66
            ->setCode($sspModelData['code']);
67
68
        if (isset($sspModelData['generateImage']) && $sspModelData['generateImage']) {
69
            $fileTransfer = $this->tester->haveFile();
70
            $sspModelTransfer->setImage($fileTransfer);
71
        }
72
73
        $sspModelCollectionRequestTransfer = (new SspModelCollectionRequestTransfer())
74
            ->addSspModel($sspModelTransfer);
75
76
        // Act
77
        $sspModelCollectionResponseTransfer = $this->selfServicePortalFacade->createSspModelCollection(
78
            $sspModelCollectionRequestTransfer,
79
        );
80
81
        // Assert
82
        $this->assertCount($expectedModelCount, $sspModelCollectionResponseTransfer->getSspModels());
83
84
        if ($expectedModelCount > 0) {
85
            $createdModelTransfer = $sspModelCollectionResponseTransfer->getSspModels()->getIterator()->current();
86
            $this->assertNotNull($createdModelTransfer->getIdSspModel());
87
            $this->assertSame($expectedName, $createdModelTransfer->getName());
88
            $this->assertNotNull($createdModelTransfer->getReference());
89
90
            if (isset($sspModelData['generateImage']) && $sspModelData['generateImage']) {
91
                $this->assertNotNull($createdModelTransfer->getImage(), 'Image should be attached to the created model');
92
                $this->assertSame(
93
                    $sspModelTransfer->getImage()->getIdFile(),
94
                    $createdModelTransfer->getImage()->getIdFile(),
95
                    'Created model should reference the same image file ID as input',
96
                );
97
            } else {
98
                $this->assertNull($createdModelTransfer->getImage(), 'No image should be attached when not provided');
99
            }
100
        }
101
102
        $this->assertEmpty($sspModelCollectionResponseTransfer->getErrors()->getIterator());
103
    }
104
105
    /**
106
     * @dataProvider modelCreationFailureDataProvider
107
     *
108
     * @param array<mixed> $sspModelData
109
     * @param array<string> $expectedValidationErrors
110
     *
111
     * @return void
112
     */
113
    public function testCreateSspModelCollectionFailsWithInvalidData(
114
        array $sspModelData,
115
        array $expectedValidationErrors
116
    ): void {
117
        // Arrange
118
        $sspModelTransfer = (new SspModelTransfer())
119
            ->setName($sspModelData['name'] ?? null)
120
            ->setCode($sspModelData['code'] ?? null);
121
122
        $sspModelCollectionRequestTransfer = (new SspModelCollectionRequestTransfer())
123
            ->addSspModel($sspModelTransfer);
124
125
        // Act
126
        $sspModelCollectionResponseTransfer = $this->selfServicePortalFacade->createSspModelCollection(
127
            $sspModelCollectionRequestTransfer,
128
        );
129
130
        // Assert
131
        $this->assertInstanceOf(SspModelCollectionResponseTransfer::class, $sspModelCollectionResponseTransfer);
132
        $this->assertCount(0, $sspModelCollectionResponseTransfer->getSspModels(), 'No models should be created when validation fails');
133
        $this->assertGreaterThan(0, $sspModelCollectionResponseTransfer->getErrors()->count(), 'Validation errors should be present');
134
135
        $actualErrors = array_map(
136
            fn ($errorTransfer) => $errorTransfer->getMessage(),
137
            $sspModelCollectionResponseTransfer->getErrors()->getArrayCopy(),
138
        );
139
140
        foreach ($expectedValidationErrors as $expectedError) {
141
            $this->assertContains($expectedError, $actualErrors, "Expected validation error '{$expectedError}' not found");
142
        }
143
    }
144
145
    /**
146
     * @return array<mixed>
147
     */
148
    protected function modelCreatedSuccessfulCollectionDataProvider(): array
149
    {
150
        return [
151
            'success with all fields' => [
152
                'sspModelData' => [
153
                    'name' => 'Test Model',
154
                    'code' => 'TM001',
155
                ],
156
                'expectedModelCount' => 1,
157
                'expectedName' => 'Test Model',
158
                'expectedValidationErrors' => [],
159
            ],
160
            'success without code field' => [
161
                'sspModelData' => [
162
                    'name' => 'Test Model',
163
                    'code' => null,
164
                ],
165
                'expectedModelCount' => 1,
166
                'expectedName' => 'Test Model',
167
                'expectedValidationErrors' => [],
168
            ],
169
            'success with image' => [
170
                'sspModelData' => [
171
                    'name' => 'Test Model with Image',
172
                    'code' => 'TMI001',
173
                    'generateImage' => true,
174
                ],
175
                'expectedModelCount' => 1,
176
                'expectedName' => 'Test Model with Image',
177
                'expectedValidationErrors' => [],
178
            ],
179
        ];
180
    }
181
182
    /**
183
     * @return array<mixed>
184
     */
185
    protected function modelCreationFailureDataProvider(): array
186
    {
187
        return [
188
            'missing name' => [
189
                'sspModelData' => [
190
                    'name' => null,
191
                    'code' => 'VALID_CODE',
192
                ],
193
                'expectedValidationErrors' => [
194
                    'Model name is required.',
195
                ],
196
            ],
197
            'empty name' => [
198
                'sspModelData' => [
199
                    'name' => '',
200
                    'code' => 'VALID_CODE',
201
                ],
202
                'expectedValidationErrors' => [
203
                    'Model name is required.',
204
                ],
205
            ],
206
            'too long name' => [
207
                'sspModelData' => [
208
                    'name' => 'Test name that exceeds the maximum length of the model name field which is typically set to 255 characters. This name is intentionally made very long to trigger the validation error for exceeding the maximum length allowed for the model name field in the self-service portal. This should result in a validation error indicating that the model name is too long.',
209
                    'code' => 'VALID_CODE',
210
                ],
211
                'expectedValidationErrors' => [
212
                    'Model name cannot be longer than 255 characters.',
213
                ],
214
            ],
215
            'too long code' => [
216
                'sspModelData' => [
217
                    'name' => 'Test Name',
218
                    'code' => 'Too long code that exceeds the maximum length of the model code field which is typically set to 255 characters. This code is intentionally made very long to trigger the validation error for exceeding the maximum length allowed for the model code field in the self-service portal. This should result in a validation error indicating that the model code is too long.',
219
                ],
220
                'expectedValidationErrors' => [
221
                    'Model code cannot be longer than 100 characters.',
222
                ],
223
            ],
224
            'both name and code missing' => [
225
                'sspModelData' => [
226
                    'name' => null,
227
                    'code' => null,
228
                ],
229
                'expectedValidationErrors' => [
230
                    'Model name is required.',
231
                ],
232
            ],
233
        ];
234
    }
235
}
236