Issues (3641)

Facade/CreateAclEntitiesForMerchantUserTest.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 Spryker Marketplace License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerTest\Zed\AclMerchantPortal\Business\Facade;
9
10
use Codeception\Test\Unit;
11
use Generated\Shared\DataBuilder\MerchantBuilder;
12
use Generated\Shared\DataBuilder\UserBuilder;
13
use Generated\Shared\Transfer\AclEntityRuleTransfer;
14
use Generated\Shared\Transfer\GroupTransfer;
15
use Generated\Shared\Transfer\MerchantUserTransfer;
16
use Generated\Shared\Transfer\RuleTransfer;
17
use Spryker\Shared\Kernel\Transfer\Exception\NullValueException;
18
use Spryker\Zed\AclMerchantPortal\AclMerchantPortalDependencyProvider;
19
use Spryker\Zed\AclMerchantPortalExtension\Dependency\Plugin\MerchantUserAclEntityRuleExpanderPluginInterface;
20
use Spryker\Zed\AclMerchantPortalExtension\Dependency\Plugin\MerchantUserAclRuleExpanderPluginInterface;
21
use SprykerTest\Zed\AclMerchantPortal\AclMerchantPortalBusinessTester;
22
23
/**
24
 * Auto-generated group annotations
25
 *
26
 * @group SprykerTest
27
 * @group Zed
28
 * @group AclMerchantPortal
29
 * @group Business
30
 * @group Facade
31
 * @group CreateAclEntitiesForMerchantUserTest
32
 * Add your own group annotations below this line
33
 */
34
class CreateAclEntitiesForMerchantUserTest extends Unit
35
{
36
    /**
37
     * @uses {@link \Spryker\Zed\AclMerchantPortal\AclMerchantPortalConfig::ACL_ROLE_PRODUCT_VIEWER_REFERENCE}
38
     *
39
     * @var string
40
     */
41
    protected const ACL_ROLE_PRODUCT_VIEWER_REFERENCE = 'product-viewer-for-offer-creation';
42
43
    /**
44
     * @var \SprykerTest\Zed\AclMerchantPortal\AclMerchantPortalBusinessTester
45
     */
46
    protected AclMerchantPortalBusinessTester $tester;
47
48
    /**
49
     * @return void
50
     */
51
    public function setUp(): void
52
    {
53
        parent::setUp();
54
55
        $this->tester->clearAllAclMerchantData();
56
    }
57
58
    /**
59
     * @dataProvider getMandatoryPropertyDataProvider
60
     *
61
     * @param \Generated\Shared\Transfer\MerchantUserTransfer $merchantUserTransfer
62
     *
63
     * @return void
64
     */
65
    public function testCreateAclEntitiesForMerchantUserFailsWithoutRequiredProperties(MerchantUserTransfer $merchantUserTransfer): void
66
    {
67
        // Assert
68
        $this->expectException(NullValueException::class);
69
70
        // Act
71
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($merchantUserTransfer);
72
    }
73
74
    /**
75
     * @return array<string, \Generated\Shared\Transfer\MerchantUserTransfer>
76
     */
77
    public function getMandatoryPropertyDataProvider(): array
78
    {
79
        return [
0 ignored issues
show
Bug Best Practice introduced by
The expression return array('requires `...ild()->setName(null)))) returns the type array<string,array> which is incompatible with the documented return type array<string,Generated\S...r\MerchantUserTransfer>.
Loading history...
80
            'requires `id_merchant_user` to be set' => [
81
                (new MerchantUserTransfer())
82
                    ->setIdMerchantUser(null)
83
                    ->setUser((new UserBuilder())->build()->setIdUser(1234))
84
                    ->setMerchant((new MerchantBuilder())->build()),
85
            ],
86
            'requires `id_user` to be set' => [
87
                (new MerchantUserTransfer())
88
                    ->setIdMerchantUser(1234)
89
                    ->setUser((new UserBuilder())->build()->setIdUser(null))
90
                    ->setMerchant((new MerchantBuilder())->build()),
91
            ],
92
            'requires `first_name` to be set' => [
93
                (new MerchantUserTransfer())
94
                    ->setIdMerchantUser(1234)
95
                    ->setUser((new UserBuilder())->build()->setIdUser(1234)->setFirstName(null))
96
                    ->setMerchant((new MerchantBuilder())->build()),
97
            ],
98
            'requires `last_name` to be set' => [
99
                (new MerchantUserTransfer())
100
                    ->setIdMerchantUser(1234)
101
                    ->setUser((new UserBuilder())->build()->setIdUser(1234)->setLastName(null))
102
                    ->setMerchant((new MerchantBuilder())->build())],
103
            'requires `name` to be set' => [
104
                (new MerchantUserTransfer())
105
                    ->setIdMerchantUser(1234)
106
                    ->setUser((new UserBuilder())->build()->setIdUser(1234))
107
                    ->setMerchant((new MerchantBuilder())->build()->setName(null)),
108
            ],
109
        ];
110
    }
111
112
    /**
113
     * @return void
114
     */
115
    public function testCreateAclEntitiesForMerchantUserFailsWithoutRequiredMerchantReference(): void
116
    {
117
        // Arrange
118
        $merchantUserTransfer = $this->tester->createMerchantUser();
119
        $merchantUserTransfer->getMerchant()->setMerchantReference(null);
120
121
        // Assert
122
        $this->expectException(NullValueException::class);
123
124
        // Act
125
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($merchantUserTransfer);
126
    }
127
128
    /**
129
     * @return void
130
     */
131
    public function testCreateAclEntitiesForMerchantUserExecutesMerchantUserAclRuleExpanderPlugins(): void
132
    {
133
        // Assert
134
        $merchantUserAclRuleExpanderPluginMock = $this
135
            ->getMockBuilder(MerchantUserAclRuleExpanderPluginInterface::class)
136
            ->getMock();
137
138
        $merchantUserAclRuleExpanderPluginMock
139
            ->expects($this->once())
140
            ->method('expand')
141
            ->willReturnCallback(function (array $ruleTransfers) {
142
                return $ruleTransfers;
143
            });
144
145
        // Arrange
146
        $this->tester->setDependency(
147
            AclMerchantPortalDependencyProvider::PLUGINS_MERCHANT_USER_ACL_RULE_EXPANDER,
148
            [$merchantUserAclRuleExpanderPluginMock],
149
        );
150
151
        // Act
152
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
153
    }
154
155
    /**
156
     * @return void
157
     */
158
    public function testCreateAclEntitiesForMerchantUserExecutesMerchantUserAclEntityRuleExpanderPlugins(): void
159
    {
160
        // Assert
161
        $merchantUserAclEntityRuleExpanderPluginMock = $this
162
            ->getMockBuilder(MerchantUserAclEntityRuleExpanderPluginInterface::class)
163
            ->getMock();
164
165
        $merchantUserAclEntityRuleExpanderPluginMock
166
            ->expects($this->once())
167
            ->method('expand')
168
            ->willReturnCallback(function (array $aclEntityRuleTransfers) {
169
                return $aclEntityRuleTransfers;
170
            });
171
172
        // Arrange
173
        $this->tester->setDependency(
174
            AclMerchantPortalDependencyProvider::PLUGINS_MERCHANT_USER_ACL_ENTITY_RULE_EXPANDER,
175
            [$merchantUserAclEntityRuleExpanderPluginMock],
176
        );
177
178
        // Act
179
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
180
    }
181
182
    /**
183
     * @return void
184
     */
185
    public function testCreateAclEntitiesForMerchantUserCreatesSegment(): void
186
    {
187
        // Arrange
188
        $this->assertSame(0, $this->tester->getAclEntitySegmentPropelQuery()->count());
189
190
        // Act
191
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
192
193
        // Assert
194
        $this->assertSame(1, $this->tester->getAclEntitySegmentPropelQuery()->count());
195
    }
196
197
    /**
198
     * @return void
199
     */
200
    public function testCreateAclEntitiesForMerchantUserCreatesRole(): void
201
    {
202
        // Arrange
203
        $this->assertSame(0, $this->tester->getAclRolePropelQuery()->count());
204
205
        // Act
206
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
207
208
        // Assert
209
        $this->assertSame(1, $this->tester->getAclRolePropelQuery()->count());
210
    }
211
212
    /**
213
     * @return void
214
     */
215
    public function testCreateAclEntitiesForMerchantUserCreatesRules(): void
216
    {
217
        // Arrange
218
        $this->assertSame(0, $this->tester->getAclRulePropelQuery()->count());
219
220
        $merchantUserAclRuleExpanderPluginMock = $this
221
            ->getMockBuilder(MerchantUserAclRuleExpanderPluginInterface::class)
222
            ->getMock();
223
224
        $merchantUserAclRuleExpanderPluginMock
225
            ->method('expand')
226
            ->willReturnCallback(function (array $ruleTransfers) {
227
                $ruleTransfers[] = (new RuleTransfer())
228
                    ->setBundle('security-merchant-portal-gui')
229
                    ->setController('*')
230
                    ->setAction('*')
231
                    ->setType('allow');
232
233
                return $ruleTransfers;
234
            });
235
236
        $this->tester->setDependency(
237
            AclMerchantPortalDependencyProvider::PLUGINS_MERCHANT_USER_ACL_RULE_EXPANDER,
238
            [$merchantUserAclRuleExpanderPluginMock],
239
        );
240
241
        // Act
242
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
243
244
        // Assert
245
        $this->assertSame(1, $this->tester->getAclRulePropelQuery()->count());
246
    }
247
248
    /**
249
     * @return void
250
     */
251
    public function testCreateAclEntitiesForMerchantUserCreatesEntityRules(): void
252
    {
253
        // Arrange
254
        $this->assertSame(0, $this->tester->getAclEntityRulePropelQuery()->count());
255
256
        $merchantUserAclEntityRuleExpanderPluginMock = $this
257
            ->getMockBuilder(MerchantUserAclEntityRuleExpanderPluginInterface::class)
258
            ->getMock();
259
260
        $merchantUserAclEntityRuleExpanderPluginMock
261
            ->method('expand')
262
            ->willReturnCallback(function (array $aclEntityRuleTransfers) {
263
                $aclEntityRuleTransfers[] = (new AclEntityRuleTransfer())
264
                    ->setEntity('Orm\Zed\MerchantUser\Persistence\SpyMerchantUser')
265
                    ->setScope('segment')
266
                    ->setPermissionMask(0b1 | 0b100);
267
268
                return $aclEntityRuleTransfers;
269
            });
270
271
        $this->tester->setDependency(
272
            AclMerchantPortalDependencyProvider::PLUGINS_MERCHANT_USER_ACL_ENTITY_RULE_EXPANDER,
273
            [$merchantUserAclEntityRuleExpanderPluginMock],
274
        );
275
276
        // Act
277
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
278
279
        // Assert
280
        $this->assertSame(1, $this->tester->getAclEntityRulePropelQuery()->count());
281
    }
282
283
    /**
284
     * @return void
285
     */
286
    public function testCreateAclEntitiesForMerchantUserCreatesGroup(): void
287
    {
288
        // Arrange
289
        $this->assertSame(0, $this->tester->getAclGroupPropelQuery()->count());
290
291
        // Act
292
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
293
294
        // Assert
295
        $this->assertSame(1, $this->tester->getAclGroupPropelQuery()->count());
296
    }
297
298
    /**
299
     * @return void
300
     */
301
    public function testCreateAclEntitiesForMerchantUserAddsMerchantUserToMerchantUserGroup(): void
302
    {
303
        // Arrange
304
        $this->assertSame(0, $this->tester->getAclUserHasGroupQuery()->count());
305
306
        // Act
307
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
308
309
        // Assert
310
        $this->assertSame(1, $this->tester->getAclUserHasGroupQuery()->count());
311
    }
312
313
    /**
314
     * @return void
315
     */
316
    public function testCreateAclEntitiesForMerchantUserAddsMerchantUserToProductViewerGroup(): void
317
    {
318
        // Arrange
319
        $this->assertSame(0, $this->tester->getAclUserHasGroupQuery()->count());
320
        $this->tester->haveGroup([GroupTransfer::REFERENCE => static::ACL_ROLE_PRODUCT_VIEWER_REFERENCE]);
321
322
        // Act
323
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($this->tester->createMerchantUser());
324
325
        // Assert
326
        $this->assertSame(2, $this->tester->getAclUserHasGroupQuery()->count());
327
    }
328
329
    /**
330
     * @return void
331
     */
332
    public function testCreateAclEntitiesForMerchantUserAddsMerchantUserToMerchantGroup(): void
333
    {
334
        // Arrange
335
        $merchantUserTransfer = $this->tester->createMerchantUser();
336
        $this->assertSame(0, $this->tester->getAclUserHasGroupQuery()->count());
337
338
        $this->tester->haveGroup([
339
            GroupTransfer::REFERENCE => sprintf('%s%s', '__MERCHANT_', $merchantUserTransfer->getMerchant()->getMerchantReference()),
340
        ]);
341
342
        // Act
343
        $this->tester->getFacade()->createAclEntitiesForMerchantUser($merchantUserTransfer);
344
345
        // Assert
346
        $this->assertSame(2, $this->tester->getAclUserHasGroupQuery()->count());
347
    }
348
}
349