Issues (3641)

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
        $availabilityFacadeMock
52
            ->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

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