Issues (3641)

Business/SharedCartFacade/QuoteShareTest.php (2 issues)

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\SharedCart\Business\SharedCartFacade;
9
10
use ArrayObject;
11
use Codeception\Test\Unit;
12
use Generated\Shared\Transfer\CompanyUserTransfer;
13
use Generated\Shared\Transfer\QuoteCollectionTransfer;
14
use Generated\Shared\Transfer\QuoteCriteriaFilterTransfer;
15
use Generated\Shared\Transfer\QuotePermissionGroupCriteriaFilterTransfer;
16
use Generated\Shared\Transfer\QuotePermissionGroupTransfer;
17
use Generated\Shared\Transfer\QuoteTransfer;
18
use Generated\Shared\Transfer\StoreTransfer;
19
use Spryker\Zed\MultiCart\Communication\Plugin\AddDefaultNameBeforeQuoteSavePlugin;
20
use Spryker\Zed\Permission\PermissionDependencyProvider;
21
use Spryker\Zed\Quote\QuoteDependencyProvider;
22
use Spryker\Zed\SharedCart\Communication\Plugin\QuotePermissionStoragePlugin;
23
use Spryker\Zed\SharedCart\Communication\Plugin\ReadSharedCartPermissionPlugin;
24
use Spryker\Zed\SharedCart\Communication\Plugin\UpdateShareDetailsQuoteAfterSavePlugin;
25
use Spryker\Zed\SharedCart\Communication\Plugin\WriteSharedCartPermissionPlugin;
26
27
/**
28
 * Auto-generated group annotations
29
 *
30
 * @group SprykerTest
31
 * @group Zed
32
 * @group SharedCart
33
 * @group Business
34
 * @group SharedCartFacade
35
 * @group QuoteShareTest
36
 * Add your own group annotations below this line
37
 */
38
class QuoteShareTest extends Unit
39
{
40
    /**
41
     * @var string
42
     */
43
    protected const READ_ONLY = 'READ_ONLY';
44
45
    /**
46
     * @var string
47
     */
48
    protected const STORE_NAME_DE = 'DE';
49
50
    /**
51
     * @var string
52
     */
53
    protected const CURRENCY_EUR = 'EUR';
54
55
    /**
56
     * @var \SprykerTest\Zed\SharedCart\SharedCartBusinessTester
57
     */
58
    protected $tester;
59
60
    /**
61
     * @return void
62
     */
63
    protected function setUp(): void
64
    {
65
        parent::setUp();
66
67
        $this->tester->setDependency(PermissionDependencyProvider::PLUGINS_PERMISSION_STORAGE, [
68
            new QuotePermissionStoragePlugin(),
69
        ]);
70
71
        $this->tester->setDependency(PermissionDependencyProvider::PLUGINS_PERMISSION, [
72
            new ReadSharedCartPermissionPlugin(),
73
            new WriteSharedCartPermissionPlugin(),
74
        ]);
75
76
        $this->tester->setDependency(QuoteDependencyProvider::PLUGINS_QUOTE_CREATE_BEFORE, [
77
            new AddDefaultNameBeforeQuoteSavePlugin(),
78
        ]);
79
        $this->tester->setDependency(QuoteDependencyProvider::PLUGINS_QUOTE_CREATE_AFTER, [
80
            new UpdateShareDetailsQuoteAfterSavePlugin(),
81
        ]);
82
83
        $this->tester->setDependency(QuoteDependencyProvider::PLUGINS_QUOTE_UPDATE_BEFORE, [
84
            new AddDefaultNameBeforeQuoteSavePlugin(),
85
        ]);
86
        $this->tester->setDependency(QuoteDependencyProvider::PLUGINS_QUOTE_UPDATE_AFTER, [
87
            new UpdateShareDetailsQuoteAfterSavePlugin(),
88
        ]);
89
90
        $this->tester->getFacade()->installSharedCartPermissions();
91
    }
92
93
    /**
94
     * @return void
95
     */
96
    public function testCompanyUserShouldNotHaveAccessToForeignCartsByDefault(): void
97
    {
98
        // Arrange
99
        $storeTransfer = $this->tester->haveStore([StoreTransfer::NAME => static::STORE_NAME_DE]);
100
        /*
101
         * Used in a context of {@link \Spryker\Zed\ShoppingList\Communication\Controller\GatewayController::createShoppingListFromQuoteAction}
102
         */
103
        $this->tester->addCurrentStore($storeTransfer);
104
105
        $customerTransfer1 = $this->tester->haveCustomer();
106
        $quoteTransfer = $this->tester->createQuote($customerTransfer1);
107
108
        $customerTransfer2 = $this->tester->haveCustomer();
109
        $this->tester->createCompanyUser($customerTransfer2);
110
111
        // Act
112
        $actualQuoteResponseTransfer = $this->tester->getLocator()->persistentCart()->facade()->findQuote($quoteTransfer->getIdQuote(), $customerTransfer2);
113
114
        // Assert
115
        $this->assertFalse($actualQuoteResponseTransfer->getIsSuccessful(), 'Company user shouldn\'t have been able to read the quote from database.');
116
    }
117
118
    /**
119
     * @return void
120
     */
121
    public function testShareCartWithCompanyUserShouldGiveAccessToRead(): void
122
    {
123
        // Arrange
124
        $storeTransfer = $this->tester->haveStore([StoreTransfer::NAME => static::STORE_NAME_DE]);
125
        /*
126
         * Used in a context of {@link \Spryker\Zed\ShoppingList\Communication\Controller\GatewayController::createShoppingListFromQuoteAction}
127
         */
128
        $this->tester->addCurrentStore($storeTransfer);
129
130
        $customerTransfer1 = $this->tester->haveCustomer();
131
        $quoteTransfer = $this->tester->createQuote($customerTransfer1);
132
133
        $customerTransfer2 = $this->tester->haveCustomer();
134
        $companyUserTransfer = $this->tester->createCompanyUser($customerTransfer2);
135
136
        // Act
137
        $quoteTransfer->addShareDetail(
138
            $this->tester->createShareCartDetail(
139
                $companyUserTransfer->getIdCompanyUser(),
140
                $this->findQuotePermissionGroup(static::READ_ONLY),
0 ignored issues
show
It seems like $this->findQuotePermissi...roup(static::READ_ONLY) can also be of type null; however, parameter $permissionQuoteGroup of SprykerTest\Zed\SharedCa...createShareCartDetail() does only seem to accept Generated\Shared\Transfe...PermissionGroupTransfer, 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

140
                /** @scrutinizer ignore-type */ $this->findQuotePermissionGroup(static::READ_ONLY),
Loading history...
141
            ),
142
        );
143
        $this->tester->getLocator()->quote()->facade()->updateQuote($quoteTransfer);
144
145
        $actualQuoteResponseTransfer = $this->tester->getLocator()->persistentCart()->facade()->findQuote($quoteTransfer->getIdQuote(), $customerTransfer2);
146
147
        // Assert
148
        $this->assertInstanceOf(QuoteTransfer::class, $actualQuoteResponseTransfer->getQuoteTransfer(), 'Company user should have been able to read the quote from database.');
149
    }
150
151
    /**
152
     * @return void
153
     */
154
    public function testRemoveCompanyUserPermissionGroupShouldDisallowToRead(): void
155
    {
156
        // Arrange
157
        $storeTransfer = $this->tester->haveStore([StoreTransfer::NAME => static::STORE_NAME_DE]);
158
        /*
159
         * Used in a context of {@link \Spryker\Zed\ShoppingList\Communication\Controller\GatewayController::createShoppingListFromQuoteAction}
160
         */
161
        $this->tester->addCurrentStore($storeTransfer);
162
163
        $customerTransfer1 = $this->tester->haveCustomer();
164
        $quoteTransfer = $this->tester->createQuote($customerTransfer1);
165
166
        $customerTransfer2 = $this->tester->haveCustomer();
167
        $companyUserTransfer = $this->tester->createCompanyUser($customerTransfer2);
168
169
        // Act
170
        $quoteTransfer->addShareDetail(
171
            $this->tester->createShareCartDetail(
172
                $companyUserTransfer->getIdCompanyUser(),
173
                $this->findQuotePermissionGroup(static::READ_ONLY),
0 ignored issues
show
It seems like $this->findQuotePermissi...roup(static::READ_ONLY) can also be of type null; however, parameter $permissionQuoteGroup of SprykerTest\Zed\SharedCa...createShareCartDetail() does only seem to accept Generated\Shared\Transfe...PermissionGroupTransfer, 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

173
                /** @scrutinizer ignore-type */ $this->findQuotePermissionGroup(static::READ_ONLY),
Loading history...
174
            ),
175
        );
176
        $this->tester->getLocator()->quote()->facade()->updateQuote($quoteTransfer);
177
178
        // Act 2
179
        $quoteTransfer->setShareDetails(new ArrayObject());
180
        $this->tester->getLocator()->quote()->facade()->updateQuote($quoteTransfer);
181
182
        $actualQuoteResponseTransfer = $this->tester->getLocator()->persistentCart()->facade()->findQuote($quoteTransfer->getIdQuote(), $customerTransfer2);
183
184
        // Assert
185
        $this->assertFalse($actualQuoteResponseTransfer->getIsSuccessful(), 'Company user shouldn\'t have been able to read the quote from database.');
186
    }
187
188
    /**
189
     * @return void
190
     */
191
    public function testExpandQuoteCollectionWithCustomerSharedQuoteCollectionWillExpandQuoteCollectionWithSharedQuotes(): void
192
    {
193
        // Arrange
194
        $ownerCustomerTransfer = $this->tester->haveCustomer();
195
        $customerTransfer = $this->tester->haveCustomer();
196
        $companyTransfer = $this->tester->haveCompany();
197
        $companyUserTransfer = $this->tester->haveCompanyUser([
198
            CompanyUserTransfer::CUSTOMER => $customerTransfer,
199
            CompanyUserTransfer::FK_COMPANY => $companyTransfer->getIdCompany(),
200
        ]);
201
        $storeTransfer = $this->tester->haveStore([
202
            StoreTransfer::NAME => static::STORE_NAME_DE,
203
            StoreTransfer::DEFAULT_CURRENCY_ISO_CODE => static::CURRENCY_EUR,
204
        ]);
205
        $quoteTransfer = $this->tester->havePersistentQuote([
206
            QuoteTransfer::CUSTOMER_REFERENCE => $ownerCustomerTransfer->getCustomerReference(),
207
            QuoteTransfer::CUSTOMER => $ownerCustomerTransfer,
208
            QuoteTransfer::STORE => $storeTransfer,
209
        ]);
210
        $spyQuotePermissionGroupEntityTransfer = $this->tester->haveQuotePermissionGroup(
211
            static::READ_ONLY,
212
            [ReadSharedCartPermissionPlugin::KEY],
213
        );
214
        $this->tester->haveQuoteCompanyUser(
215
            $companyUserTransfer,
216
            $quoteTransfer,
217
            $spyQuotePermissionGroupEntityTransfer,
218
        );
219
220
        // Act
221
        $quoteCollectionTransfer = $this->tester->getFacade()->expandQuoteCollectionWithCustomerSharedQuoteCollection(
222
            (new QuoteCollectionTransfer()),
223
            (new QuoteCriteriaFilterTransfer())
224
                ->setIdCompanyUser($companyUserTransfer->getIdCompanyUser())
225
                ->setIdStore($storeTransfer->getIdStore()),
226
        );
227
228
        // Assert
229
        $this->assertCount(1, $quoteCollectionTransfer->getQuotes());
230
        /** @var \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer */
231
        $quoteTransfer = $quoteCollectionTransfer->getQuotes()->offsetGet(0);
232
        $this->assertNotNull($quoteTransfer->getQuotePermissionGroup());
233
        $this->assertEquals(
234
            $spyQuotePermissionGroupEntityTransfer->getIdQuotePermissionGroup(),
235
            $quoteTransfer->getQuotePermissionGroup()->getIdQuotePermissionGroup(),
236
        );
237
        $this->assertEquals($spyQuotePermissionGroupEntityTransfer->getName(), $quoteTransfer->getQuotePermissionGroup()->getName());
238
    }
239
240
    /**
241
     * @param string $permissionQuoteGroupName
242
     *
243
     * @return \Generated\Shared\Transfer\QuotePermissionGroupTransfer|null
244
     */
245
    protected function findQuotePermissionGroup(string $permissionQuoteGroupName): ?QuotePermissionGroupTransfer
246
    {
247
        $criteriaFilterTransfer = new QuotePermissionGroupCriteriaFilterTransfer();
248
        $criteriaFilterTransfer->setName($permissionQuoteGroupName);
249
250
        $quotePermissionGroupTransferList = $this->tester->getFacade()->getQuotePermissionGroupList($criteriaFilterTransfer);
251
252
        return $quotePermissionGroupTransferList->getQuotePermissionGroups()->offsetGet(0);
253
    }
254
}
255