Failed Conditions
Push — master ( 36cd34...e25ade )
by
unknown
47:16 queued 16:37
created

setUp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 6
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 9
rs 10
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 SprykerTest\Zed\DataImportMerchant\Business\Facade;
9
10
use Codeception\Test\Unit;
11
use Generated\Shared\DataBuilder\DataImportMerchantFileCollectionRequestBuilder;
12
use Generated\Shared\Transfer\DataImportMerchantFileCollectionRequestTransfer;
13
use Generated\Shared\Transfer\DataImportMerchantFileCollectionResponseTransfer;
14
use Spryker\Shared\Kernel\Transfer\Exception\RequiredTransferPropertyException;
15
use Spryker\Zed\DataImportMerchant\DataImportMerchantDependencyProvider;
16
use Spryker\Zed\DataImportMerchant\Dependency\Service\DataImportMerchantToFileSystemServiceInterface;
17
use Spryker\Zed\DataImportMerchantExtension\Dependency\Plugin\DataImportMerchantFileRequestExpanderPluginInterface;
18
use Spryker\Zed\DataImportMerchantExtension\Dependency\Plugin\DataImportMerchantFileValidatorPluginInterface;
19
use SprykerTest\Zed\DataImportMerchant\DataImportMerchantBusinessTester;
20
21
/**
22
 * Auto-generated group annotations
23
 *
24
 * @group SprykerTest
25
 * @group Zed
26
 * @group DataImportMerchant
27
 * @group Business
28
 * @group Facade
29
 * @group CreateDataImportMerchantFileCollectionTest
30
 * Add your own group annotations below this line
31
 */
32
class CreateDataImportMerchantFileCollectionTest extends Unit
33
{
34
    /**
35
     * @uses \Spryker\Zed\DataImportMerchant\Business\Validator\Rule\DataImportMerchantFile\ImporterTypeValidatorRule::GLOSSARY_KEY_VALIDATION_IMPORTER_TYPE_NOT_SUPPORTED
36
     *
37
     * @var string
38
     */
39
    protected const GLOSSARY_KEY_VALIDATION_IMPORTER_TYPE_NOT_SUPPORTED = 'data_import_merchant.validation.importer_type_not_supported';
40
41
    /**
42
     * @uses \Spryker\Zed\DataImportMerchant\Business\Validator\Rule\DataImportMerchantFile\UserExistsValidatorRule::GLOSSARY_KEY_VALIDATION_USER_NOT_FOUND
43
     *
44
     * @var string
45
     */
46
    protected const GLOSSARY_KEY_VALIDATION_USER_NOT_FOUND = 'data_import_merchant.validation.user_not_found';
47
48
    /**
49
     * @uses \Spryker\Zed\DataImportMerchant\Business\Validator\Rule\DataImportMerchantFile\MerchantExistsValidatorRule::GLOSSARY_KEY_VALIDATION_MERCHANT_NOT_FOUND
50
     *
51
     * @var string
52
     */
53
    protected const GLOSSARY_KEY_VALIDATION_MERCHANT_NOT_FOUND = 'data_import_merchant.validation.merchant_not_found';
54
55
    /**
56
     * @uses \Spryker\Zed\DataImportMerchant\Business\Validator\Rule\DataImportMerchantFile\FileContentTypeValidatorRule::GLOSSARY_KEY_VALIDATION_INVALID_FILE_CONTENT_TYPE
57
     *
58
     * @var string
59
     */
60
    protected const GLOSSARY_KEY_VALIDATION_INVALID_FILE_CONTENT_TYPE = 'data_import_merchant.validation.invalid_file_content_type';
61
62
    /**
63
     * @var \SprykerTest\Zed\DataImportMerchant\DataImportMerchantBusinessTester
64
     */
65
    protected DataImportMerchantBusinessTester $tester;
66
67
    /**
68
     * @return void
69
     */
70
    protected function setUp(): void
71
    {
72
        parent::setUp();
73
74
        $this->tester->mockConfigMethod('getSupportedImporterTypes', ['merchant-product']);
75
        $this->tester->mockConfigMethod('getSupportedContentTypes', ['text/csv', 'application/csv', 'text/plain']);
76
        $this->tester->setDependency(
77
            DataImportMerchantDependencyProvider::SERVICE_FILE_SYSTEM,
78
            $this->createFileSystemServiceMock(),
79
        );
80
    }
81
82
    /**
83
     * @return void
84
     */
85
    public function testCreateDataImportMerchantFileCollectionReturnsSuccessfulResult(): void
86
    {
87
        // Arrange
88
        $dataImportMerchantFileTransfer = $this->tester->createValidDataImportMerchantFile();
89
90
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
91
            ->addDataImportMerchantFile($dataImportMerchantFileTransfer)
92
            ->setIsTransactional(true);
93
94
        // Act
95
        $dataImportMerchantFileCollectionResponseTransfer = $this->tester
96
            ->getFacade()
97
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
98
99
        // Assert
100
        $this->assertEmpty($dataImportMerchantFileCollectionResponseTransfer->getErrors());
101
        $this->assertCount(1, $dataImportMerchantFileCollectionResponseTransfer->getDataImportMerchantFiles());
102
103
        $createdDataImportMerchantFileTransfer = $dataImportMerchantFileCollectionResponseTransfer->getDataImportMerchantFiles()->getIterator()->current();
104
        $this->assertSame('pending', $createdDataImportMerchantFileTransfer->getStatus());
105
    }
106
107
    /**
108
     * @return void
109
     */
110
    public function testCreateDataImportMerchantFileCollectionReturnsErrorWhenUnsupportedImporterType(): void
111
    {
112
        // Arrange
113
        $invalidDataImportMerchantFileTransfer = $this->tester->createValidDataImportMerchantFile();
114
        $invalidDataImportMerchantFileTransfer->setImporterType('invalid-importer-type');
115
116
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
117
            ->addDataImportMerchantFile($this->tester->createValidDataImportMerchantFile())
118
            ->addDataImportMerchantFile($invalidDataImportMerchantFileTransfer)
119
            ->setIsTransactional(true);
120
121
        // Act
122
        $dataImportMerchantFileCollectionResponseTransfer = $this->tester
123
            ->getFacade()
124
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
125
126
        // Assert
127
        $this->assertCount(1, $dataImportMerchantFileCollectionResponseTransfer->getErrors());
128
129
        /** @var \Generated\Shared\Transfer\ErrorTransfer $errorTransfer */
130
        $errorTransfer = $dataImportMerchantFileCollectionResponseTransfer->getErrors()->getIterator()->current();
131
132
        $this->assertSame('1', $errorTransfer->getEntityIdentifierOrFail());
133
        $this->assertSame(static::GLOSSARY_KEY_VALIDATION_IMPORTER_TYPE_NOT_SUPPORTED, $errorTransfer->getMessageOrFail());
134
    }
135
136
    /**
137
     * @return void
138
     */
139
    public function testCreateDataImportMerchantFileCollectionReturnsErrorWhenUserNotFound(): void
140
    {
141
        // Arrange
142
        $dataImportMerchantFileTransfer = $this->tester->createValidDataImportMerchantFile();
143
        $dataImportMerchantFileTransfer->setIdUser(99999);
144
145
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
146
            ->addDataImportMerchantFile($dataImportMerchantFileTransfer)
147
            ->setIsTransactional(true);
148
149
        // Act
150
        $dataImportMerchantFileCollectionResponseTransfer = $this->tester
151
            ->getFacade()
152
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
153
154
        // Assert
155
        $this->assertCount(1, $dataImportMerchantFileCollectionResponseTransfer->getErrors());
156
157
        /** @var \Generated\Shared\Transfer\ErrorTransfer $errorTransfer */
158
        $errorTransfer = $dataImportMerchantFileCollectionResponseTransfer->getErrors()->getIterator()->current();
159
160
        $this->assertSame('0', $errorTransfer->getEntityIdentifierOrFail());
161
        $this->assertSame(static::GLOSSARY_KEY_VALIDATION_USER_NOT_FOUND, $errorTransfer->getMessageOrFail());
162
    }
163
164
    /**
165
     * @return void
166
     */
167
    public function testCreateDataImportMerchantFileCollectionReturnsErrorWhenMerchantNotFound(): void
168
    {
169
        // Arrange
170
        $dataImportMerchantFileTransfer = $this->tester->createValidDataImportMerchantFile();
171
        $dataImportMerchantFileTransfer->setMerchantReference('non-existing-merchant-reference');
172
173
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
174
            ->addDataImportMerchantFile($dataImportMerchantFileTransfer)
175
            ->setIsTransactional(true);
176
177
        // Act
178
        $dataImportMerchantFileCollectionResponseTransfer = $this->tester
179
            ->getFacade()
180
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
181
182
        // Assert
183
        $this->assertCount(1, $dataImportMerchantFileCollectionResponseTransfer->getErrors());
184
185
        /** @var \Generated\Shared\Transfer\ErrorTransfer $errorTransfer */
186
        $errorTransfer = $dataImportMerchantFileCollectionResponseTransfer->getErrors()->getIterator()->current();
187
188
        $this->assertSame('0', $errorTransfer->getEntityIdentifierOrFail());
189
        $this->assertSame(static::GLOSSARY_KEY_VALIDATION_MERCHANT_NOT_FOUND, $errorTransfer->getMessageOrFail());
190
    }
191
192
    /**
193
     * @return void
194
     */
195
    public function testCreateDataImportMerchantFileCollectionReturnsErrorWhenInvalidFileContentType(): void
196
    {
197
        // Arrange
198
        $invalidDataImportMerchantFileTransfer = $this->tester->createValidDataImportMerchantFile();
199
        $invalidDataImportMerchantFileTransfer->getFileInfoOrFail()->setContentType('application/pdf');
200
201
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
202
            ->addDataImportMerchantFile($this->tester->createValidDataImportMerchantFile())
203
            ->addDataImportMerchantFile($invalidDataImportMerchantFileTransfer)
204
            ->setIsTransactional(true);
205
206
        // Act
207
        $dataImportMerchantFileCollectionResponseTransfer = $this->tester
208
            ->getFacade()
209
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
210
211
        // Assert
212
        $this->assertCount(1, $dataImportMerchantFileCollectionResponseTransfer->getErrors());
213
214
        /** @var \Generated\Shared\Transfer\ErrorTransfer $errorTransfer */
215
        $errorTransfer = $dataImportMerchantFileCollectionResponseTransfer->getErrors()->getIterator()->current();
216
217
        $this->assertSame('1', $errorTransfer->getEntityIdentifierOrFail());
218
        $this->assertSame(static::GLOSSARY_KEY_VALIDATION_INVALID_FILE_CONTENT_TYPE, $errorTransfer->getMessageOrFail());
219
    }
220
221
    /**
222
     * @return void
223
     */
224
    public function testShouldExecuteDataImportMerchantFileValidatorPluginStack(): void
225
    {
226
        // Assert
227
        $this->tester->setDependency(
228
            DataImportMerchantDependencyProvider::PLUGINS_DATA_IMPORT_MERCHANT_FILE_VALIDATOR,
229
            [
230
                $this->getDataImportMerchantFileValidatorPluginMock(),
231
            ],
232
        );
233
234
        // Arrange
235
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
236
            ->addDataImportMerchantFile($this->tester->createValidDataImportMerchantFile())
237
            ->setIsTransactional(true);
238
239
        // Act
240
        $this->tester
241
            ->getFacade()
242
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
243
    }
244
245
    /**
246
     * @return void
247
     */
248
    public function testShouldExecuteDataImportMerchantFileRequestExpanderPluginStack(): void
249
    {
250
        // Assert
251
        $this->tester->setDependency(
252
            DataImportMerchantDependencyProvider::PLUGINS_DATA_IMPORT_MERCHANT_FILE_REQUEST_EXPANDER,
253
            [
254
                $this->getDataImportMerchantFileRequestExpanderPluginMock(),
255
            ],
256
        );
257
258
        // Arrange
259
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
260
            ->addDataImportMerchantFile($this->tester->createValidDataImportMerchantFile())
261
            ->setIsTransactional(true);
262
263
        // Act
264
        $this->tester
265
            ->getFacade()
266
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
267
    }
268
269
    /**
270
     * @dataProvider getRequiredFieldsDataProvider
271
     *
272
     * @param string $fieldName
273
     *
274
     * @return void
275
     */
276
    public function testCreateDataImportMerchantFileCollectionThrowsExceptionWhenRequiredFieldIsMissing(string $fieldName): void
277
    {
278
        // Arrange
279
        $dataImportMerchantFileTransfer = $this->tester->createValidDataImportMerchantFile();
280
281
        if (str_contains($fieldName, '.')) {
282
            $fieldParts = explode('.', $fieldName);
283
            $nestedObject = $dataImportMerchantFileTransfer->offsetGet($fieldParts[0]);
284
            $nestedObject->offsetSet($fieldParts[1], null);
285
        } else {
286
            $dataImportMerchantFileTransfer->offsetSet($fieldName, null);
287
        }
288
289
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestBuilder())
290
            ->build()
291
            ->addDataImportMerchantFile($dataImportMerchantFileTransfer)
292
            ->setIsTransactional(true);
293
294
        // Assert
295
        $this->expectException(RequiredTransferPropertyException::class);
296
297
        // Act
298
        $this->tester->getFacade()->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
299
    }
300
301
    /**
302
     * @return array<string, array<string>>
303
     */
304
    public static function getRequiredFieldsDataProvider(): array
305
    {
306
        return [
307
            'missing idUser' => ['idUser'],
308
            'missing merchantReference' => ['merchantReference'],
309
            'missing importerType' => ['importerType'],
310
            'missing fileInfo' => ['fileInfo'],
311
            'missing fileInfo.originalFileName' => ['fileInfo.originalFileName'],
312
            'missing fileInfo.contentType' => ['fileInfo.contentType'],
313
            'missing fileInfo.size' => ['fileInfo.size'],
314
            'missing fileInfo.content' => ['fileInfo.content'],
315
        ];
316
    }
317
318
    /**
319
     * @return void
320
     */
321
    public function testCreateDataImportMerchantFileCollectionWithTransactionalTrue(): void
322
    {
323
        // Arrange
324
        $this->tester->ensureDataImportMerchantTablesAreEmpty();
325
326
        $invalidDataImportMerchantFileTransfer = $this->tester->createValidDataImportMerchantFile();
327
        $invalidDataImportMerchantFileTransfer->setMerchantReference('non-existing-merchant-reference');
328
329
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
330
            ->addDataImportMerchantFile($this->tester->createValidDataImportMerchantFile())
331
            ->addDataImportMerchantFile($invalidDataImportMerchantFileTransfer)
332
            ->setIsTransactional(true);
333
334
        // Act
335
        $dataImportMerchantFileCollectionResponseTransfer = $this->tester
336
            ->getFacade()
337
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
338
339
        // Assert
340
        $this->assertCount(1, $dataImportMerchantFileCollectionResponseTransfer->getErrors());
341
342
        $dataImportMerchantFilesCount = $this->tester->getDataImportMerchantFileQuery()->count();
343
        $this->assertSame(0, $dataImportMerchantFilesCount, 'No files should be saved when transaction is enabled and an error occurs');
344
    }
345
346
    /**
347
     * @return void
348
     */
349
    public function testCreateDataImportMerchantFileCollectionWithTransactionalFalse(): void
350
    {
351
        // Arrange
352
        $this->tester->ensureDataImportMerchantTablesAreEmpty();
353
354
        $invalidDataImportMerchantFileTransfer = $this->tester->createValidDataImportMerchantFile();
355
        $invalidDataImportMerchantFileTransfer->setMerchantReference('non-existing-merchant-reference');
356
357
        $dataImportMerchantFileCollectionRequestTransfer = (new DataImportMerchantFileCollectionRequestTransfer())
358
            ->addDataImportMerchantFile($this->tester->createValidDataImportMerchantFile())
359
            ->addDataImportMerchantFile($invalidDataImportMerchantFileTransfer)
360
            ->setIsTransactional(false);
361
362
        // Act
363
        $dataImportMerchantFileCollectionResponseTransfer = $this->tester
364
            ->getFacade()
365
            ->createDataImportMerchantFileCollection($dataImportMerchantFileCollectionRequestTransfer);
366
367
        // Assert
368
        $this->assertCount(1, $dataImportMerchantFileCollectionResponseTransfer->getErrors());
369
370
        $dataImportMerchantFilesCount = $this->tester->getDataImportMerchantFileQuery()->count();
371
        $this->assertSame(1, $dataImportMerchantFilesCount, 'Valid files should be saved when transaction is disabled, even if another file has errors');
372
    }
373
374
    /**
375
     * @return \Spryker\Zed\DataImportMerchantExtension\Dependency\Plugin\DataImportMerchantFileValidatorPluginInterface
376
     */
377
    protected function getDataImportMerchantFileValidatorPluginMock(): DataImportMerchantFileValidatorPluginInterface
378
    {
379
        $dataImportMerchantFileValidatorPluginMock = $this
380
            ->getMockBuilder(DataImportMerchantFileValidatorPluginInterface::class)
381
            ->getMock();
382
383
        $dataImportMerchantFileValidatorPluginMock
384
            ->expects($this->once())
385
            ->method('validate')
386
            ->willReturnCallback(function (DataImportMerchantFileCollectionResponseTransfer $transfer) {
387
                return $transfer;
388
            });
389
390
        return $dataImportMerchantFileValidatorPluginMock;
391
    }
392
393
    /**
394
     * @return \Spryker\Zed\DataImportMerchantExtension\Dependency\Plugin\DataImportMerchantFileRequestExpanderPluginInterface
395
     */
396
    protected function getDataImportMerchantFileRequestExpanderPluginMock(): DataImportMerchantFileRequestExpanderPluginInterface
397
    {
398
        $dataImportMerchantFileRequestExpanderPluginMock = $this
399
            ->getMockBuilder(DataImportMerchantFileRequestExpanderPluginInterface::class)
400
            ->getMock();
401
402
        $dataImportMerchantFileRequestExpanderPluginMock
403
            ->expects($this->once())
404
            ->method('expand')
405
            ->willReturnCallback(function (DataImportMerchantFileCollectionRequestTransfer $transfer) {
406
                return $transfer;
407
            });
408
409
        return $dataImportMerchantFileRequestExpanderPluginMock;
410
    }
411
412
    /**
413
     * @return \Spryker\Zed\DataImportMerchant\Dependency\Service\DataImportMerchantToFileSystemServiceInterface
414
     */
415
    protected function createFileSystemServiceMock(): DataImportMerchantToFileSystemServiceInterface
416
    {
417
        $fileSystemServiceMock = $this->createMock(DataImportMerchantToFileSystemServiceInterface::class);
418
        $fileSystemServiceMock->method('write');
419
420
        return $fileSystemServiceMock;
421
    }
422
}
423