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
|
|
|
|