Issues (3412)

ProductBundleCartAvailabilityCheckTest.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\Zed\ProductBundle\Business\Availability\PreCheck;
9
10
use Generated\Shared\DataBuilder\ProductForBundleBuilder;
11
use Generated\Shared\Transfer\CartChangeTransfer;
12
use Generated\Shared\Transfer\ItemTransfer;
13
use Generated\Shared\Transfer\ProductConcreteAvailabilityTransfer;
14
use Generated\Shared\Transfer\ProductForBundleTransfer;
15
use Orm\Zed\ProductBundle\Persistence\SpyProductBundleQuery;
16
use Spryker\DecimalObject\Decimal;
17
use Spryker\Zed\ProductBundle\Business\ProductBundle\Availability\PreCheck\ProductBundleCartAvailabilityCheck;
18
use Spryker\Zed\ProductBundle\Business\ProductBundle\ProductBundleReaderInterface;
19
use Spryker\Zed\ProductBundle\Dependency\Facade\ProductBundleToAvailabilityFacadeInterface;
20
use Spryker\Zed\ProductBundle\Dependency\Facade\ProductBundleToStoreFacadeInterface;
21
use Spryker\Zed\ProductBundle\Persistence\ProductBundleQueryContainerInterface;
22
use Spryker\Zed\ProductBundle\ProductBundleConfig;
23
24
/**
25
 * Auto-generated group annotations
26
 *
27
 * @group SprykerTest
28
 * @group Zed
29
 * @group ProductBundle
30
 * @group Business
31
 * @group Availability
32
 * @group PreCheck
33
 * @group ProductBundleCartAvailabilityCheckTest
34
 * Add your own group annotations below this line
35
 */
36
class ProductBundleCartAvailabilityCheckTest extends PreCheckMocks
37
{
38
    /**
39
     * @var int
40
     */
41
    public const ID_STORE = 1;
42
43
    /**
44
     * return void
45
     *
46
     * @return void
47
     */
48
    public function testCheckCartAvailabilityWhenBundledItemsAvailableShouldReturnEmptyMessageContainer(): void
49
    {
50
        $availabilityFacadeMock = $this->createAvailabilityFacadeMock();
51
        $expectedArgs = [
52
            [$this->fixtures['bundledProductSku'], new Decimal(15)],
53
        ];
54
        $callIndex = 0;
55
        $availabilityFacadeMock
56
            ->expects($this->once())
0 ignored issues
show
The method expects() does not exist on Spryker\Zed\ProductBundl...labilityFacadeInterface. ( Ignorable by Annotation )

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

56
            ->/** @scrutinizer ignore-call */ 
57
              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...
57
            ->method('isProductSellableForStore')
58
            ->willReturnCallback(function ($sku, $quantity) use (&$callIndex, $expectedArgs) {
59
                $this->assertEquals($expectedArgs[$callIndex][0], $sku);
60
                $this->assertEquals($expectedArgs[$callIndex][1], $quantity);
61
                $callIndex++;
62
63
                return true;
64
            });
65
66
        $availabilityTransfer = new ProductConcreteAvailabilityTransfer();
67
        $availabilityTransfer->setAvailability(0);
68
69
        $availabilityFacadeMock->method('findOrCreateProductConcreteAvailabilityBySkuForStore')
70
            ->willReturn($availabilityTransfer);
71
72
        $productBundleAvailabilityCheckMock = $this->createProductBundleCartAvailabilityCheckMock($availabilityFacadeMock);
73
74
        $this->setupFindBundledProducts($this->fixtures, $productBundleAvailabilityCheckMock);
75
76
        $quoteTransfer = $this->createTestQuoteTransfer();
77
78
        $cartChangeTransfer = new CartChangeTransfer();
79
        $cartChangeTransfer->setQuote($quoteTransfer);
80
81
        $itemTransfer = new ItemTransfer();
82
        $itemTransfer->setSku($this->fixtures['bundle-sku']);
83
        $itemTransfer->setQuantity(3);
84
        $cartChangeTransfer->addItem($itemTransfer);
85
86
        $cartPreCheckResponseTransfer = $productBundleAvailabilityCheckMock->checkCartAvailability($cartChangeTransfer);
87
88
        $this->assertCount(0, $cartPreCheckResponseTransfer->getMessages());
89
        $this->assertTrue($cartPreCheckResponseTransfer->getIsSuccess());
90
    }
91
92
    /**
93
     * return void
94
     *
95
     * @return void
96
     */
97
    public function testCheckCartAvailabilityWhenBundledItemsNotAvailableShouldStoreErrorMessages(): void
98
    {
99
        $availabilityFacadeMock = $this->createAvailabilityFacadeMock();
100
        $availabilityFacadeMock->expects($this->once())
101
            ->method('isProductSellableForStore')
102
            ->willReturn(false);
103
104
        $productBundleAvailabilityCheckMock = $this->createProductBundleCartAvailabilityCheckMock($availabilityFacadeMock);
105
106
        $availabilityTransfer = new ProductConcreteAvailabilityTransfer();
107
        $availabilityTransfer->setAvailability(0);
108
109
        $availabilityFacadeMock->method('findOrCreateProductConcreteAvailabilityBySkuForStore')
110
            ->willReturn($availabilityTransfer);
111
112
        $this->setupFindBundledProducts($this->fixtures, $productBundleAvailabilityCheckMock);
113
114
        $quoteTransfer = $this->createTestQuoteTransfer();
115
116
        $cartChangeTransfer = new CartChangeTransfer();
117
        $cartChangeTransfer->setQuote($quoteTransfer);
118
119
        $itemTransfer = new ItemTransfer();
120
        $itemTransfer->setSku($this->fixtures['bundle-sku']);
121
        $itemTransfer->setQuantity(3);
122
        $cartChangeTransfer->addItem($itemTransfer);
123
124
        $cartPreCheckResponseTransfer = $productBundleAvailabilityCheckMock->checkCartAvailability($cartChangeTransfer);
125
126
        $this->assertCount(1, $cartPreCheckResponseTransfer->getMessages());
127
        $this->assertFalse($cartPreCheckResponseTransfer->getIsSuccess());
128
    }
129
130
    /**
131
     * @param \Spryker\Zed\ProductBundle\Dependency\Facade\ProductBundleToAvailabilityFacadeInterface|null $availabilityFacadeMock
132
     * @param \Spryker\Zed\ProductBundle\Dependency\Facade\ProductBundleToStoreFacadeInterface|null $storeFacadeMock
133
     *
134
     * @return \PHPUnit\Framework\MockObject\MockObject|\Spryker\Zed\ProductBundle\Business\ProductBundle\Availability\PreCheck\ProductBundleCartAvailabilityCheck
135
     */
136
    protected function createProductBundleCartAvailabilityCheckMock(
137
        ?ProductBundleToAvailabilityFacadeInterface $availabilityFacadeMock = null,
138
        ?ProductBundleToStoreFacadeInterface $storeFacadeMock = null
139
    ): ProductBundleCartAvailabilityCheck {
140
        if ($availabilityFacadeMock === null) {
141
            $availabilityFacadeMock = $this->createAvailabilityFacadeMock();
142
        }
143
144
        $productBundleQueryMock = $this->getMockBuilder(SpyProductBundleQuery::class)->getMock();
145
        $productBundleQueryMock
146
            ->method('exists')
147
            ->willReturn(true);
148
149
        $productBundleQueryContainerMock = $this->getMockBuilder(ProductBundleQueryContainerInterface::class)->getMock();
150
        $productBundleQueryContainerMock
151
            ->method('queryBundleProductBySku')
152
            ->willReturn($productBundleQueryMock);
153
154
        if ($storeFacadeMock === null) {
155
            $storeFacadeMock = $this->getStoreFacadeMock();
156
        }
157
158
        $productBundleConfig = $this->createProductBundleConfigMock();
159
160
        $productBundleReader = $this->createProductBundleReaderMock();
161
162
        $productBundleCartAvailabilityCheckMock = $this->getMockBuilder(ProductBundleCartAvailabilityCheck::class)
163
            ->setConstructorArgs([
164
                $availabilityFacadeMock,
165
                $productBundleQueryContainerMock,
166
                $storeFacadeMock,
167
                $productBundleConfig,
168
                $productBundleReader,
169
            ])
170
            ->onlyMethods(['findBundledProducts'])
171
            ->getMock();
172
173
        return $productBundleCartAvailabilityCheckMock;
174
    }
175
176
    /**
177
     * @return \PHPUnit\Framework\MockObject\MockObject|\Spryker\Zed\ProductBundle\Dependency\Facade\ProductBundleToStoreFacadeInterface
178
     */
179
    protected function createStoreFacadeMock(): ProductBundleToStoreFacadeInterface
180
    {
181
        return $this->getMockBuilder(ProductBundleToStoreFacadeInterface::class)->getMock();
182
    }
183
184
    /**
185
     * @return \PHPUnit\Framework\MockObject\MockObject|\Spryker\Zed\ProductBundle\ProductBundleConfig
186
     */
187
    protected function createProductBundleConfigMock(): ProductBundleConfig
188
    {
189
        return $this->getMockBuilder(ProductBundleConfig::class)->getMock();
190
    }
191
192
    /**
193
     * @return \PHPUnit\Framework\MockObject\MockObject|\Spryker\Zed\ProductBundle\Business\ProductBundle\ProductBundleReaderInterface
194
     */
195
    protected function createProductBundleReaderMock(): ProductBundleReaderInterface
196
    {
197
        $mock = $this->getMockBuilder(ProductBundleReaderInterface::class)
198
            ->getMock();
199
        $mock->method('getProductForBundleTransfersByProductConcreteSkus')
200
            ->willReturn([
201
                $this->fixtures['bundle-sku'] => [
202
                    $this->createProductForBundleTransfer(['sku' => $this->fixtures['bundle-sku']]),
203
                ],
204
            ]);
205
206
        return $mock;
207
    }
208
209
    /**
210
     * @param array $seed
211
     *
212
     * @return \Generated\Shared\Transfer\ProductForBundleTransfer
213
     */
214
    protected function createProductForBundleTransfer(array $seed): ProductForBundleTransfer
215
    {
216
        return (new ProductForBundleBuilder($seed))->build();
217
    }
218
}
219