Issues (3641)

Client/Availability/AvailabilityClientTest.php (1 issue)

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\Client\Availability;
9
10
use Codeception\Test\Unit;
11
use Generated\Shared\Transfer\StorageAvailabilityTransfer;
12
use Generated\Shared\Transfer\StoreTransfer;
13
use Spryker\Client\Availability\AvailabilityClient;
14
use Spryker\Client\Availability\AvailabilityClientInterface;
15
use Spryker\Client\Availability\AvailabilityDependencyProvider;
16
use Spryker\Client\Availability\Dependency\Client\AvailabilityToStorageInterface;
17
use Spryker\Client\Availability\Dependency\Client\AvailabilityToStoreClientInterface;
18
use Spryker\Client\Availability\Exception\ProductAvailabilityNotFoundException;
19
use Spryker\Client\Availability\KeyBuilder\AvailabilityResourceKeyBuilder;
20
use Spryker\Client\Availability\Storage\AvailabilityStorage;
21
22
/**
23
 * Auto-generated group annotations
24
 *
25
 * @group SprykerTest
26
 * @group Client
27
 * @group Availability
28
 * @group AvailabilityClientTest
29
 * Add your own group annotations below this line
30
 */
31
class AvailabilityClientTest extends Unit
32
{
33
    /**
34
     * @var int
35
     */
36
    public const ID_PRODUCT_ABSTRACT = 5;
37
38
    /**
39
     * @var \SprykerTest\Client\Availability\AvailabilityClientTester
40
     */
41
    protected $tester;
42
43
    /**
44
     * @return void
45
     */
46
    protected function setUp(): void
47
    {
48
        parent::setUp();
49
50
        $this->tester->addDependencies();
51
    }
52
53
    /**
54
     * @return void
55
     */
56
    public function testFindProductAvailabilityByIdProductAbstractReturnsProductAvailabilityTransferObject(): void
57
    {
58
        // Arrange
59
        $productAvailability = [];
60
        $this->setStorageReturn($productAvailability);
61
62
        // Act
63
        $actualProductAvailability = $this->createAvailabilityClient()->findProductAvailabilityByIdProductAbstract(static::ID_PRODUCT_ABSTRACT);
64
65
        // Assert
66
        $this->assertSame(StorageAvailabilityTransfer::class, get_class($actualProductAvailability));
0 ignored issues
show
It seems like $actualProductAvailability can also be of type null; however, parameter $object of get_class() does only seem to accept object, maybe add an additional type check? ( Ignorable by Annotation )

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

66
        $this->assertSame(StorageAvailabilityTransfer::class, get_class(/** @scrutinizer ignore-type */ $actualProductAvailability));
Loading history...
67
    }
68
69
    /**
70
     * @return void
71
     */
72
    public function testFindProductAvailabilityByIdProductAbstractReturnsNullWhenProductAvailabilityWasNotFoundInStorage(): void
73
    {
74
        // Arrange
75
        $productAvailability = null;
76
        $this->setStorageReturn($productAvailability);
77
78
        // Act
79
        $actualResult = $this->createAvailabilityClient()->findProductAvailabilityByIdProductAbstract(static::ID_PRODUCT_ABSTRACT);
80
81
        // Assert
82
        $this->assertNull($actualResult);
83
    }
84
85
    /**
86
     * @return void
87
     */
88
    public function testGetProductAvailabilityByIdProductAbstractReturnsProductAvailabilityTransferObject(): void
89
    {
90
        // Arrange
91
        $productAvailability = [];
92
        $this->setStorageReturn($productAvailability);
93
94
        // Act
95
        $actualProductAvailability = $this->createAvailabilityClient()->getProductAvailabilityByIdProductAbstract(static::ID_PRODUCT_ABSTRACT);
96
97
        // Assert
98
        $this->assertSame(StorageAvailabilityTransfer::class, get_class($actualProductAvailability));
99
    }
100
101
    /**
102
     * @return void
103
     */
104
    public function testGetProductAvailabilityByIdProductAbstractThrowsExceptionWhenProductAvailabilityWasNotFoundInStorage(): void
105
    {
106
        // Arrange
107
        $productAvailability = null;
108
        $this->setStorageReturn($productAvailability);
109
110
        // Assert
111
        $this->expectException(ProductAvailabilityNotFoundException::class);
112
113
        // Act
114
        $this->createAvailabilityClient()->getProductAvailabilityByIdProductAbstract(static::ID_PRODUCT_ABSTRACT);
115
    }
116
117
    /**
118
     * @return void
119
     */
120
    public function testGetProductAvailabilityCallGenerateKeyContainsStoreName(): void
121
    {
122
        // Arrange
123
        $availabilityResourceKeyBuilderMock = $this->getAvailabilityResourceKeyBuilderMock();
124
125
        // Assert
126
        $availabilityResourceKeyBuilderMock->method('generateKey')
127
            ->with(
128
                $this->greaterThan(0),
129
                $this->stringContains($this->tester::DEFAULT_LOCALE_SHORT_NAME),
130
                $this->stringContains($this->tester::DEFAULT_STORE_NAME),
131
            )
132
            ->willReturn($this->tester::MOCK_RETURN_KEY);
133
134
        $availabilityToStoreClientMock = $this->getAvailabilityToStoreClientMock();
135
136
        $availabilityToStoreClientMock->method('isDynamicStoreEnabled')
137
            ->willReturn(true);
138
139
        $availabilityToStoreClientMock->method('getCurrentStore')
140
            ->willReturn((new StoreTransfer())->setName($this->tester::DEFAULT_STORE_NAME));
141
142
        $availabilityStorageMock = $this->createAvailabilityStorageMock(
143
            [],
144
            $availabilityResourceKeyBuilderMock,
145
            $this->tester::DEFAULT_LOCALE_NAME,
146
            $availabilityToStoreClientMock,
147
        );
148
149
        $factoryMock = $this->getFactoryMock($availabilityStorageMock);
150
151
        // Act
152
        $actualProductAvailability = $this->getAvailabilityClientWithMockFactory($factoryMock)->getProductAvailabilityByIdProductAbstract(static::ID_PRODUCT_ABSTRACT);
153
154
        // Assert
155
        $this->assertSame(StorageAvailabilityTransfer::class, get_class($actualProductAvailability));
156
    }
157
158
    /**
159
     * @return void
160
     */
161
    public function testGetProductAvailabilityCallGenerateKeyDoesNotContainStoreName(): void
162
    {
163
        // Arrange
164
        $availabilityResourceKeyBuilderMock = $this->getAvailabilityResourceKeyBuilderMock();
165
166
        // Assert
167
        $availabilityResourceKeyBuilderMock->method('generateKey')
168
            ->with(
169
                $this->greaterThan(0),
170
                $this->stringContains($this->tester::DEFAULT_LOCALE_SHORT_NAME),
171
                $this->isNull(),
172
            )
173
            ->willReturn($this->tester::MOCK_RETURN_KEY);
174
175
        $availabilityToStoreClientMock = $this->getAvailabilityToStoreClientMock();
176
177
        $availabilityToStoreClientMock->method('isDynamicStoreEnabled')
178
            ->willReturn(false);
179
180
        $availabilityToStoreClientMock->method('getCurrentStore')
181
            ->willReturn((new StoreTransfer())->setName($this->tester::DEFAULT_STORE_NAME));
182
183
        $availabilityStorageMock = $this->createAvailabilityStorageMock(
184
            [],
185
            $availabilityResourceKeyBuilderMock,
186
            $this->tester::DEFAULT_LOCALE_NAME,
187
            $availabilityToStoreClientMock,
188
        );
189
190
        $factoryMock = $this->getFactoryMock($availabilityStorageMock);
191
        // Act
192
        $actualProductAvailability = $this->getAvailabilityClientWithMockFactory($factoryMock)->getProductAvailabilityByIdProductAbstract(static::ID_PRODUCT_ABSTRACT);
193
194
        // Assert
195
        $this->assertSame(StorageAvailabilityTransfer::class, get_class($actualProductAvailability));
196
    }
197
198
    /**
199
     * @return void
200
     */
201
    public function testFindProductAvailabilityCallGenerateKeyContainsStoreName(): void
202
    {
203
        // Arrange
204
        $availabilityResourceKeyBuilderMock = $this->getAvailabilityResourceKeyBuilderMock();
205
206
        // Assert
207
        $availabilityResourceKeyBuilderMock->method('generateKey')
208
            ->with(
209
                $this->greaterThan(0),
210
                $this->stringContains($this->tester::DEFAULT_LOCALE_SHORT_NAME),
211
                $this->stringContains($this->tester::DEFAULT_STORE_NAME),
212
            )
213
            ->willReturn($this->tester::MOCK_RETURN_KEY);
214
215
        $availabilityToStoreClientMock = $this->getAvailabilityToStoreClientMock();
216
217
        $availabilityToStoreClientMock->method('isDynamicStoreEnabled')
218
            ->willReturn(true);
219
220
        $availabilityToStoreClientMock->method('getCurrentStore')
221
            ->willReturn((new StoreTransfer())->setName($this->tester::DEFAULT_STORE_NAME));
222
223
        $availabilityStorageMock = $this->createAvailabilityStorageMock(
224
            [],
225
            $availabilityResourceKeyBuilderMock,
226
            $this->tester::DEFAULT_LOCALE_NAME,
227
            $availabilityToStoreClientMock,
228
        );
229
230
        $factoryMock = $this->getFactoryMock($availabilityStorageMock);
231
232
        // Act
233
        $actualProductAvailability = $this->getAvailabilityClientWithMockFactory($factoryMock)->findProductAvailabilityByIdProductAbstract(static::ID_PRODUCT_ABSTRACT);
234
235
        // Assert
236
        $this->assertSame(StorageAvailabilityTransfer::class, get_class($actualProductAvailability));
237
    }
238
239
    /**
240
     * @return void
241
     */
242
    public function testFindProductAvailabilityCallGenerateKeyDoesNotContainStoreName(): void
243
    {
244
        // Arrange
245
        $availabilityResourceKeyBuilderMock = $this->getAvailabilityResourceKeyBuilderMock();
246
247
        // Assert
248
        $availabilityResourceKeyBuilderMock->method('generateKey')
249
            ->with(
250
                $this->greaterThan(0),
251
                $this->stringContains($this->tester::DEFAULT_LOCALE_SHORT_NAME),
252
                $this->isNull(),
253
            )
254
            ->willReturn($this->tester::MOCK_RETURN_KEY);
255
256
        $availabilityToStoreClientMock = $this->getAvailabilityToStoreClientMock();
257
258
        $availabilityToStoreClientMock->method('isDynamicStoreEnabled')
259
            ->willReturn(false);
260
261
        $availabilityToStoreClientMock->method('getCurrentStore')
262
            ->willReturn((new StoreTransfer())->setName($this->tester::DEFAULT_STORE_NAME));
263
264
        $availabilityStorageMock = $this->createAvailabilityStorageMock(
265
            [],
266
            $availabilityResourceKeyBuilderMock,
267
            $this->tester::DEFAULT_LOCALE_NAME,
268
            $availabilityToStoreClientMock,
269
        );
270
271
        $factoryMock = $this->getFactoryMock($availabilityStorageMock);
272
        // Act
273
        $actualProductAvailability = $this->getAvailabilityClientWithMockFactory($factoryMock)->findProductAvailabilityByIdProductAbstract(static::ID_PRODUCT_ABSTRACT);
274
275
        // Assert
276
        $this->assertSame(StorageAvailabilityTransfer::class, get_class($actualProductAvailability));
277
    }
278
279
    /**
280
     * @param array|null $returnedProductAvailability
281
     *
282
     * @return void
283
     */
284
    protected function setStorageReturn(?array $returnedProductAvailability): void
285
    {
286
        $availabilityToStorageBridge = $this->getMockBuilder(AvailabilityToStorageInterface::class)->getMock();
287
        $availabilityToStorageBridge->method('get')->willReturn($returnedProductAvailability);
288
        $this->tester->setDependency(AvailabilityDependencyProvider::KV_STORAGE, $availabilityToStorageBridge);
289
    }
290
291
    /**
292
     * @return \Spryker\Client\Availability\AvailabilityClientInterface
293
     */
294
    protected function createAvailabilityClient(): AvailabilityClientInterface
295
    {
296
        return new AvailabilityClient();
297
    }
298
299
    /**
300
     * @param \SprykerTest\Client\Availability\AvailabilityFactory $factoryMock
301
     *
302
     * @return \Spryker\Client\Availability\AvailabilityClient
303
     */
304
    protected function getAvailabilityClientWithMockFactory($factoryMock): AvailabilityClient
305
    {
306
        $availabilityClientMock = $this->getMockBuilder(AvailabilityClient::class)
307
            ->setMethods(['getFactory'])
308
            ->disableOriginalConstructor()
309
            ->getMock();
310
311
        $availabilityClientMock->expects($this->any())
312
            ->method('getFactory')
313
            ->will($this->returnValue($factoryMock));
314
315
        return $availabilityClientMock;
316
    }
317
318
    /**
319
     * @param \Spryker\Client\Availability\Storage\AvailabilityStorage $availabilityStorageMock
320
     *
321
     * @return \SprykerTest\Client\Availability\AvailabilityFactory
322
     */
323
    protected function getFactoryMock($availabilityStorageMock): AvailabilityFactory
324
    {
325
        $factoryMock = $this->getMockBuilder(AvailabilityFactory::class)
326
            ->setMethods(['createCurrentLocaleAvailabilityStorage'])
327
            ->disableOriginalConstructor()
328
            ->getMock();
329
330
        $factoryMock->method('createCurrentLocaleAvailabilityStorage')
331
            ->willReturn($availabilityStorageMock);
332
333
        return $factoryMock;
334
    }
335
336
    /**
337
     * @param array $storageReturn
338
     * @param $availabilityResourceKeyBuilderMock
339
     * @param $currentLocale
340
     * @param $availabilityToStoreClientMock
341
     *
342
     * @return \Spryker\Client\Availability\Storage\AvailabilityStorage
343
     */
344
    protected function createAvailabilityStorageMock(
345
        array $storageReturn = [],
346
        $availabilityResourceKeyBuilderMock = null,
347
        $currentLocale = 'en_US',
348
        $availabilityToStoreClientMock = null
349
    ): AvailabilityStorage {
350
        if ($availabilityResourceKeyBuilderMock === null) {
351
            $availabilityResourceKeyBuilderMock = $this->getAvailabilityResourceKeyBuilderMock();
352
        }
353
354
        if ($availabilityToStoreClientMock === null) {
355
            $availabilityToStoreClientMock = $this->getStorageClientMock($storageReturn);
356
        }
357
        $availabilityStorageMock = new AvailabilityStorage(
358
            $this->getStorageClientMock($storageReturn),
359
            $availabilityResourceKeyBuilderMock,
360
            $currentLocale,
361
            $availabilityToStoreClientMock,
362
        );
363
364
        return $availabilityStorageMock;
365
    }
366
367
    /**
368
     * @param array $storageReturn
369
     *
370
     * @return \Spryker\Client\Availability\Dependency\Client\AvailabilityToStorageInterface
371
     */
372
    protected function getStorageClientMock(array $storageReturn = []): AvailabilityToStorageInterface
373
    {
374
        $availabilityToStorageBridge = $this->getMockBuilder(AvailabilityToStorageInterface::class)->getMock();
375
        $availabilityToStorageBridge->method('get')->willReturn($storageReturn);
376
377
        return $availabilityToStorageBridge;
378
    }
379
380
    /**
381
     * @return \Spryker\Client\Availability\KeyBuilder\AvailabilityResourceKeyBuilder
382
     */
383
    protected function getAvailabilityResourceKeyBuilderMock(): AvailabilityResourceKeyBuilder
384
    {
385
        $availabilityResourceKeyBuilderMock = $this->getMockBuilder(AvailabilityResourceKeyBuilder::class)
386
            ->setMethods(['generateKey'])
387
            ->disableOriginalConstructor()
388
            ->getMock();
389
390
        return $availabilityResourceKeyBuilderMock;
391
    }
392
393
    /**
394
     * @return \Spryker\Client\Availability\Dependency\Client\AvailabilityToStoreClientInterface
395
     */
396
    protected function getAvailabilityToStoreClientMock(): AvailabilityToStoreClientInterface
397
    {
398
        $availabilityToStoreClientMock = $this->getMockBuilder(AvailabilityToStoreClientInterface::class)
399
            ->setMethods(['isDynamicStoreEnabled', 'getCurrentStore'])
400
            ->disableOriginalConstructor()
401
            ->getMock();
402
403
        return $availabilityToStoreClientMock;
404
    }
405
}
406