Failed Conditions
Push — master ( ae631c...a04781 )
by
unknown
52:50 queued 12:37
created

testWriteCollectionByProductLabelProductAbstractEventsRefreshesProductPageSearchWithCorrectData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 31
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 16
nc 1
nop 0
dl 0
loc 31
rs 9.7333
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 SprykerTest\Zed\ProductLabelSearch\Business;
9
10
use Codeception\Test\Unit;
11
use Generated\Shared\DataBuilder\EventEntityBuilder;
12
use Generated\Shared\DataBuilder\ProductPayloadBuilder;
13
use Generated\Shared\Transfer\EventEntityTransfer;
14
use Generated\Shared\Transfer\ProductLabelTransfer;
15
use Generated\Shared\Transfer\ProductPageLoadTransfer;
16
use Generated\Shared\Transfer\ProductPayloadTransfer;
17
use Generated\Shared\Transfer\StoreRelationTransfer;
18
use Generated\Shared\Transfer\StoreTransfer;
19
use Spryker\Zed\ProductLabelSearch\Dependency\Facade\ProductLabelSearchToProductPageSearchInterface;
20
use Spryker\Zed\ProductLabelSearch\ProductLabelSearchDependencyProvider;
21
22
/**
23
 * Auto-generated group annotations
24
 *
25
 * @group SprykerTest
26
 * @group Zed
27
 * @group ProductLabelSearch
28
 * @group Business
29
 * @group Facade
30
 * @group ProductLabelSearchFacadeTest
31
 * Add your own group annotations below this line
32
 */
33
class ProductLabelSearchFacadeTest extends Unit
34
{
35
    /**
36
     * @var int
37
     */
38
    protected const TIMESTAMP = 123;
39
40
    /**
41
     * @var \SprykerTest\Zed\ProductLabelSearch\ProductLabelSearchBusinessTester
42
     */
43
    protected $tester;
44
45
    /**
46
     * @uses \Orm\Zed\ProductLabel\Persistence\Map\SpyProductLabelProductAbstractTableMap::COL_FK_PRODUCT_ABSTRACT
47
     *
48
     * @var string
49
     */
50
    protected const COL_PRODUCT_LABEL_PRODUCT_ABSTRACT_FK_PRODUCT_ABSTRACT = 'spy_product_label_product_abstract.fk_product_abstract';
51
52
    /**
53
     * @uses \Orm\Zed\ProductLabel\Persistence\Map\SpyProductLabelStoreTableMap::COL_FK_PRODUCT_ABSTRACT
54
     *
55
     * @var string
56
     */
57
    protected const COL_PRODUCT_LABEL_STORE_FK_PRODUCT_LABEL = 'spy_product_label_store.fk_product_label';
58
59
    /**
60
     * @var string
61
     */
62
    protected const STORE_NAME_DE = 'DE';
63
64
    /**
65
     * @return void
66
     */
67
    public function testWriteCollectionByProductLabelEventspublishWithTimestampsProductPageSearchWithCorrectData(): void
68
    {
69
        // Arrange
70
        $productPageSearchFacadeMock = $this->getProductPageSearchFacadeMock();
71
72
        $productTransfer1 = $this->tester->haveProduct();
73
        $productTransfer2 = $this->tester->haveProduct();
74
        $productLabelTransfer = $this->tester->haveProductLabel();
75
        $this->tester->haveProductLabelToAbstractProductRelation(
76
            $productLabelTransfer->getIdProductLabel(),
77
            $productTransfer1->getFkProductAbstract(),
78
        );
79
        $this->tester->haveProductLabelToAbstractProductRelation(
80
            $productLabelTransfer->getIdProductLabel(),
81
            $productTransfer2->getFkProductAbstract(),
82
        );
83
84
        $eventTransfers = [
85
            $this->getEventEntityTransfer([
86
                EventEntityTransfer::ID => $productLabelTransfer->getIdProductLabel(),
87
                EventEntityTransfer::TIMESTAMP => static::TIMESTAMP,
88
            ]),
89
        ];
90
91
        // Assert
92
        $productPageSearchFacadeMock->expects($this->once())
0 ignored issues
show
Bug introduced by
The method expects() does not exist on Spryker\Zed\ProductLabel...ductPageSearchInterface. ( Ignorable by Annotation )

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

92
        $productPageSearchFacadeMock->/** @scrutinizer ignore-call */ 
93
                                      expects($this->once())

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
93
            ->method('publishWithTimestamp')
94
            ->with([
95
                $productTransfer1->getFkProductAbstract() => static::TIMESTAMP,
96
                $productTransfer2->getFkProductAbstract() => static::TIMESTAMP,
97
            ]);
98
99
        // Act
100
        $this->tester->getFacade()->writeCollectionByProductLabelEvents($eventTransfers);
101
    }
102
103
    /**
104
     * @return void
105
     */
106
    public function testWriteCollectionByProductLabelEventsDoesNothingWithIncorrectData(): void
107
    {
108
        // Arrange
109
        $productPageSearchFacadeMock = $this->getProductPageSearchFacadeMock();
110
111
        $productTransfer = $this->tester->haveProduct();
112
        $productLabelTransfer1 = $this->tester->haveProductLabel();
113
        $this->tester->haveProductLabelToAbstractProductRelation(
114
            $productLabelTransfer1->getIdProductLabel(),
115
            $productTransfer->getFkProductAbstract(),
116
        );
117
118
        $productLabelTransfer2 = $this->tester->haveProductLabel();
119
120
        $eventTransfers = [
121
            $this->getEventEntityTransfer([
122
                EventEntityTransfer::ID => $productLabelTransfer2->getIdProductLabel(),
123
            ]),
124
        ];
125
126
        // Assert
127
        $productPageSearchFacadeMock->expects($this->never())
128
            ->method('publishWithTimestamp');
129
130
        // Act
131
        $this->tester->getFacade()->writeCollectionByProductLabelEvents($eventTransfers);
132
    }
133
134
    /**
135
     * @return void
136
     */
137
    public function testWriteCollectionByProductLabelProductAbstractEventspublishWithTimestampsProductPageSearchWithCorrectData(): void
138
    {
139
        // Arrange
140
        $productPageSearchFacadeMock = $this->getProductPageSearchFacadeMock();
141
142
        $productTransfer1 = $this->tester->haveProduct();
143
        $productTransfer2 = $this->tester->haveProduct();
144
145
        $eventTransfers = [
146
            $this->getEventEntityTransfer([
147
                EventEntityTransfer::FOREIGN_KEYS => [
148
                    static::COL_PRODUCT_LABEL_PRODUCT_ABSTRACT_FK_PRODUCT_ABSTRACT => $productTransfer1->getFkProductAbstract(),
149
                ],
150
                EventEntityTransfer::TIMESTAMP => static::TIMESTAMP,
151
            ]),
152
            $this->getEventEntityTransfer([
153
                EventEntityTransfer::FOREIGN_KEYS => [
154
                    static::COL_PRODUCT_LABEL_PRODUCT_ABSTRACT_FK_PRODUCT_ABSTRACT => $productTransfer2->getFkProductAbstract(),
155
                ],
156
                EventEntityTransfer::TIMESTAMP => static::TIMESTAMP,
157
            ]),
158
        ];
159
160
        // Assert
161
        $productPageSearchFacadeMock->expects($this->once())
162
            ->method('publishWithTimestamp')
163
            ->with([
164
                $productTransfer1->getFkProductAbstract() => static::TIMESTAMP,
165
                $productTransfer2->getFkProductAbstract() => static::TIMESTAMP,
166
            ]);
167
168
        // Act
169
        $this->tester->getFacade()->writeCollectionByProductLabelProductAbstractEvents($eventTransfers);
170
    }
171
172
    /**
173
     * @return void
174
     */
175
    public function testWriteCollectionByProductLabelProductAbstractEventsDoesNothingWithIncorrectData(): void
176
    {
177
        // Arrange
178
        $productPageSearchFacadeMock = $this->getProductPageSearchFacadeMock();
179
180
        $productTransfer = $this->tester->haveProduct();
181
182
        $eventTransfers = [
183
            $this->getEventEntityTransfer([
184
                EventEntityTransfer::ID => $productTransfer->getFkProductAbstract(),
185
            ]),
186
        ];
187
188
        // Assert
189
        $productPageSearchFacadeMock->expects($this->never())
190
            ->method('publishWithTimestamp');
191
192
        // Act
193
        $this->tester->getFacade()->writeCollectionByProductLabelProductAbstractEvents($eventTransfers);
194
    }
195
196
    /**
197
     * @return void
198
     */
199
    public function testWriteCollectionByProductLabelStoreEventspublishWithTimestampsProductPageSearchWithCorrectData(): void
200
    {
201
        // Arrange
202
        $productPageSearchFacadeMock = $this->getProductPageSearchFacadeMock();
203
204
        $productTransfer1 = $this->tester->haveProduct();
205
        $productLabelTransfer1 = $this->tester->haveProductLabel();
206
        $this->tester->haveProductLabelToAbstractProductRelation(
207
            $productLabelTransfer1->getIdProductLabel(),
208
            $productTransfer1->getFkProductAbstract(),
209
        );
210
211
        $productTransfer2 = $this->tester->haveProduct();
212
        $productLabelTransfer2 = $this->tester->haveProductLabel();
213
        $this->tester->haveProductLabelToAbstractProductRelation(
214
            $productLabelTransfer2->getIdProductLabel(),
215
            $productTransfer2->getFkProductAbstract(),
216
        );
217
218
        $eventTransfers = [
219
            $this->getEventEntityTransfer([
220
                EventEntityTransfer::FOREIGN_KEYS => [
221
                    static::COL_PRODUCT_LABEL_STORE_FK_PRODUCT_LABEL => $productLabelTransfer1->getIdProductLabel(),
222
                ],
223
                EventEntityTransfer::TIMESTAMP => static::TIMESTAMP,
224
            ]),
225
            $this->getEventEntityTransfer([
226
                EventEntityTransfer::FOREIGN_KEYS => [
227
                    static::COL_PRODUCT_LABEL_STORE_FK_PRODUCT_LABEL => $productLabelTransfer2->getIdProductLabel(),
228
                ],
229
                EventEntityTransfer::TIMESTAMP => static::TIMESTAMP,
230
            ]),
231
        ];
232
233
        // Assert
234
        $productPageSearchFacadeMock->expects($this->once())
235
            ->method('publishWithTimestamp')
236
            ->with([
237
                $productTransfer1->getFkProductAbstract() => static::TIMESTAMP,
238
                $productTransfer2->getFkProductAbstract() => static::TIMESTAMP,
239
            ]);
240
241
        // Act
242
        $this->tester->getFacade()->writeCollectionByProductLabelStoreEvents($eventTransfers);
243
    }
244
245
    /**
246
     * @return void
247
     */
248
    public function testWriteCollectionByProductLabelStoreEventsDoesNothingWithIncorrectData(): void
249
    {
250
        // Arrange
251
        $productPageSearchFacadeMock = $this->getProductPageSearchFacadeMock();
252
253
        $productTransfer = $this->tester->haveProduct();
254
255
        $eventTransfers = [
256
            $this->getEventEntityTransfer([
257
                EventEntityTransfer::ID => $productTransfer->getFkProductAbstract(),
258
            ]),
259
        ];
260
261
        // Assert
262
        $productPageSearchFacadeMock->expects($this->never())
263
            ->method('publishWithTimestamp');
264
265
        // Act
266
        $this->tester->getFacade()->writeCollectionByProductLabelStoreEvents($eventTransfers);
267
    }
268
269
    /**
270
     * @return void
271
     */
272
    public function testExpandProductPageDataTransferWithProductLabelIdsReturnsUpdatedTransferWithCorrectData(): void
273
    {
274
        // Arrange
275
        $productTransfer1 = $this->tester->haveProduct();
276
        $productTransfer2 = $this->tester->haveProduct();
277
        $storeTransfer = $this->tester->haveStore([StoreTransfer::NAME => static::STORE_NAME_DE]);
278
        $storeRelationSeedData = [
279
            StoreRelationTransfer::ID_STORES => [
280
                $storeTransfer->getIdStore(),
281
            ],
282
        ];
283
        $productLabelTransfer1 = $this->tester->haveProductLabel([
284
            ProductLabelTransfer::STORE_RELATION => $storeRelationSeedData,
285
        ]);
286
        $productLabelTransfer2 = $this->tester->haveProductLabel([
287
            ProductLabelTransfer::STORE_RELATION => $storeRelationSeedData,
288
        ]);
289
        $this->tester->haveProductLabelToAbstractProductRelation(
290
            $productLabelTransfer1->getIdProductLabel(),
291
            $productTransfer1->getFkProductAbstract(),
292
        );
293
        $this->tester->haveProductLabelToAbstractProductRelation(
294
            $productLabelTransfer2->getIdProductLabel(),
295
            $productTransfer2->getFkProductAbstract(),
296
        );
297
298
        $productLabelIdsMappedByIdProductAbstractAndStoreName = [
299
            $productTransfer1->getFkProductAbstract() => [
300
                $storeTransfer->getName() => [
301
                    $productLabelTransfer1->getIdProductLabel(),
302
                ],
303
            ],
304
            $productTransfer2->getFkProductAbstract() => [
305
                $storeTransfer->getName() => [
306
                    $productLabelTransfer2->getIdProductLabel(),
307
                ],
308
            ],
309
        ];
310
311
        $productPageLoadTransfer = (new ProductPageLoadTransfer())
312
            ->setProductAbstractIds([
313
                $productTransfer1->getFkProductAbstract(),
314
                $productTransfer2->getFkProductAbstract(),
315
            ])
316
            ->setPayloadTransfers([
317
                $this->getProductPayloadTransfer([
318
                    ProductPayloadTransfer::ID_PRODUCT_ABSTRACT => $productTransfer1->getFkProductAbstract(),
319
                ]),
320
                $this->getProductPayloadTransfer([
321
                    ProductPayloadTransfer::ID_PRODUCT_ABSTRACT => $productTransfer2->getFkProductAbstract(),
322
                ]),
323
            ]);
324
325
        // Act
326
        $expandedProductPageLoadTransfer = $this->tester->getFacade()
327
            ->expandProductPageDataTransferWithProductLabelIds($productPageLoadTransfer);
328
329
        // Assert
330
        /** @var \Generated\Shared\Transfer\ProductPayloadTransfer $payloadTransfer */
331
        foreach ($expandedProductPageLoadTransfer->getPayloadTransfers() as $payloadTransfer) {
332
            $this->assertNotEmpty($payloadTransfer->getLabelIds());
333
            $this->assertEquals(
334
                $productLabelIdsMappedByIdProductAbstractAndStoreName[$payloadTransfer->getIdProductAbstract()],
335
                $payloadTransfer->getLabelIds(),
336
            );
337
        }
338
    }
339
340
    /**
341
     * @return void
342
     */
343
    public function testExpandProductPageDataTransferWithProductLabelIdsDoesNothingWithIncorrectData(): void
344
    {
345
        // Arrange
346
        $productTransfer1 = $this->tester->haveProduct();
347
        $productTransfer2 = $this->tester->haveProduct();
348
349
        $productPageLoadTransfer = (new ProductPageLoadTransfer())
350
            ->setProductAbstractIds([
351
                $productTransfer1->getFkProductAbstract(),
352
                $productTransfer2->getFkProductAbstract(),
353
            ])
354
            ->setPayloadTransfers([
355
                $this->getProductPayloadTransfer([
356
                    ProductPayloadTransfer::ID_PRODUCT_ABSTRACT => $productTransfer1->getFkProductAbstract(),
357
                ]),
358
                $this->getProductPayloadTransfer([
359
                    ProductPayloadTransfer::ID_PRODUCT_ABSTRACT => $productTransfer2->getFkProductAbstract(),
360
                ]),
361
            ]);
362
363
        // Act
364
        $expandedProductPageLoadTransfer = $this->tester->getFacade()
365
            ->expandProductPageDataTransferWithProductLabelIds($productPageLoadTransfer);
366
367
        // Assert
368
        /** @var \Generated\Shared\Transfer\ProductPayloadTransfer $payloadTransfer */
369
        foreach ($expandedProductPageLoadTransfer->getPayloadTransfers() as $payloadTransfer) {
370
            $this->assertEmpty($payloadTransfer->getLabelIds());
371
        }
372
    }
373
374
    /**
375
     * @return void
376
     */
377
    public function testExpandProductPageDataTransferWithProductLabelIdsShouldAvoidExpandingWhenProductAbstractIdsAreEmpty(): void
378
    {
379
        // Arrange
380
        $productTransfer1 = $this->tester->haveProduct();
381
        $productTransfer2 = $this->tester->haveProduct();
382
383
        $productPageLoadTransfer = (new ProductPageLoadTransfer())
384
            ->setProductAbstractIds([])
385
            ->setPayloadTransfers([
386
                $this->getProductPayloadTransfer([
387
                    ProductPayloadTransfer::ID_PRODUCT_ABSTRACT => $productTransfer1->getFkProductAbstract(),
388
                ]),
389
                $this->getProductPayloadTransfer([
390
                    ProductPayloadTransfer::ID_PRODUCT_ABSTRACT => $productTransfer2->getFkProductAbstract(),
391
                ]),
392
            ]);
393
394
        // Act
395
        $expandedProductPageLoadTransfer = $this->tester->getFacade()
396
            ->expandProductPageDataTransferWithProductLabelIds($productPageLoadTransfer);
397
398
        // Assert
399
        /** @var \Generated\Shared\Transfer\ProductPayloadTransfer $payloadTransfer */
400
        foreach ($expandedProductPageLoadTransfer->getPayloadTransfers() as $payloadTransfer) {
401
            $this->assertEmpty($payloadTransfer->getLabelIds());
402
        }
403
    }
404
405
    /**
406
     * @return void
407
     */
408
    public function testExpandProductPageDataTransferWithProductLabelIdsShouldAvoidExpandingWhenProductAbstractIdsIsNull(): void
409
    {
410
        // Arrange
411
        $productTransfer1 = $this->tester->haveProduct();
412
        $productTransfer2 = $this->tester->haveProduct();
413
414
        $productPageLoadTransfer = (new ProductPageLoadTransfer())
415
            ->setProductAbstractIds(null)
416
            ->setPayloadTransfers([
417
                $this->getProductPayloadTransfer([
418
                    ProductPayloadTransfer::ID_PRODUCT_ABSTRACT => $productTransfer1->getFkProductAbstract(),
419
                ]),
420
                $this->getProductPayloadTransfer([
421
                    ProductPayloadTransfer::ID_PRODUCT_ABSTRACT => $productTransfer2->getFkProductAbstract(),
422
                ]),
423
            ]);
424
425
        // Act
426
        $expandedProductPageLoadTransfer = $this->tester->getFacade()
427
            ->expandProductPageDataTransferWithProductLabelIds($productPageLoadTransfer);
428
429
        // Assert
430
        /** @var \Generated\Shared\Transfer\ProductPayloadTransfer $payloadTransfer */
431
        foreach ($expandedProductPageLoadTransfer->getPayloadTransfers() as $payloadTransfer) {
432
            $this->assertEmpty($payloadTransfer->getLabelIds());
433
        }
434
    }
435
436
    /**
437
     * @return \PHPUnit\Framework\MockObject\MockObject|\Spryker\Zed\ProductLabelSearch\Dependency\Facade\ProductLabelSearchToProductPageSearchInterface
438
     */
439
    protected function getProductPageSearchFacadeMock(): ProductLabelSearchToProductPageSearchInterface
440
    {
441
        $productPageSearchFacadeMock = $this
442
            ->getMockBuilder(ProductLabelSearchToProductPageSearchInterface::class)
443
            ->getMock();
444
445
        $this->tester->setDependency(
446
            ProductLabelSearchDependencyProvider::FACADE_PRODUCT_PAGE_SEARCH,
447
            $productPageSearchFacadeMock,
448
        );
449
450
        return $productPageSearchFacadeMock;
451
    }
452
453
    /**
454
     * @param array $seedData
455
     *
456
     * @return \Generated\Shared\Transfer\EventEntityTransfer
457
     */
458
    protected function getEventEntityTransfer(array $seedData): EventEntityTransfer
459
    {
460
        return (new EventEntityBuilder())->seed($seedData)->build();
461
    }
462
463
    /**
464
     * @param array $seedData
465
     *
466
     * @return \Generated\Shared\Transfer\ProductPayloadTransfer
467
     */
468
    protected function getProductPayloadTransfer(array $seedData): ProductPayloadTransfer
469
    {
470
        return (new ProductPayloadBuilder())->seed($seedData)->build();
471
    }
472
}
473