Completed
Push — master ( f9a038...cc9983 )
by Kamil
22:34
created

ManagingPromotionCouponsContext::iAddIt()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sylius\Behat\Context\Ui\Admin;
13
14
use Behat\Behat\Context\Context;
15
use Sylius\Behat\NotificationType;
16
use Sylius\Behat\Page\Admin\PromotionCoupon\CreatePageInterface;
17
use Sylius\Behat\Page\Admin\Crud\IndexPageInterface;
18
use Sylius\Behat\Page\Admin\PromotionCoupon\GeneratePageInterface;
19
use Sylius\Behat\Page\Admin\PromotionCoupon\UpdatePageInterface;
20
use Sylius\Behat\Service\CurrentPageResolverInterface;
21
use Sylius\Behat\Service\NotificationCheckerInterface;
22
use Sylius\Component\Core\Model\CouponInterface;
23
use Sylius\Component\Promotion\Model\PromotionInterface;
24
use Webmozart\Assert\Assert;
25
26
/**
27
 * @author Arkadiusz Krakowiak <[email protected]>
28
 */
29
final class ManagingPromotionCouponsContext implements Context
30
{
31
    /**
32
     * @var CreatePageInterface
33
     */
34
    private $createPage;
35
36
    /**
37
     * @var GeneratePageInterface
38
     */
39
    private $generatePage;
40
41
    /**
42
     * @var IndexPageInterface
43
     */
44
    private $indexPage;
45
46
    /**
47
     * @var UpdatePageInterface
48
     */
49
    private $updatePage;
50
51
    /**
52
     * @var CurrentPageResolverInterface
53
     */
54
    private $currentPageResolver;
55
56
    /**
57
     * @var NotificationCheckerInterface
58
     */
59
    private $notificationChecker;
60
61
    /**
62
     * @param CreatePageInterface $createPage
63
     * @param GeneratePageInterface $generatePage
64
     * @param IndexPageInterface $indexPage
65
     * @param UpdatePageInterface $updatePage
66
     * @param CurrentPageResolverInterface $currentPageResolver
67
     * @param NotificationCheckerInterface $notificationChecker
68
     */
69
    public function __construct(
70
        CreatePageInterface $createPage,
71
        GeneratePageInterface $generatePage,
72
        IndexPageInterface $indexPage,
73
        UpdatePageInterface $updatePage,
74
        CurrentPageResolverInterface $currentPageResolver,
75
        NotificationCheckerInterface $notificationChecker
76
    ) {
77
        $this->createPage = $createPage;
78
        $this->generatePage = $generatePage;
79
        $this->indexPage = $indexPage;
80
        $this->updatePage = $updatePage;
81
        $this->currentPageResolver = $currentPageResolver;
82
        $this->notificationChecker = $notificationChecker;
83
    }
84
85
    /**
86
     * @Given /^I want to view all coupons of (this promotion)$/
87
     * @Given /^I want to view all coupons of ("[^"]+" promotion)$/
88
     */
89
    public function iWantToViewAllCouponsOfThisPromotion(PromotionInterface $promotion)
90
    {
91
        $this->indexPage->open(['promotionId' => $promotion->getId()]);
92
    }
93
94
    /**
95
     * @Given /^I want to create a new coupon for (this promotion)$/
96
     */
97
    public function iWantToCreateANewCouponForThisPromotion(PromotionInterface $promotion)
98
    {
99
        $this->createPage->open(['promotionId' => $promotion->getId()]);
100
    }
101
102
    /**
103
     * @Given /^I want to modify the ("[^"]+" coupon) for (this promotion)$/
104
     */
105
    public function iWantToModifyTheCoupon(CouponInterface $coupon, PromotionInterface $promotion)
106
    {
107
        $this->updatePage->open(['id' => $coupon->getId(), 'promotionId' => $promotion->getId()]);
108
    }
109
110
    /**
111
     * @Given /^I want to generate a new coupons for (this promotion)$/
112
     */
113
    public function iWantToGenerateANewCouponsForThisPromotion(PromotionInterface $promotion)
114
    {
115
        $this->generatePage->open(['promotionId' => $promotion->getId()]);
116
    }
117
118
    /**
119
     * @When /^I limit generated coupons usage to (\d+) times$/
120
     */
121
    public function iSetGeneratedCouponsUsageLimitTo($limit)
122
    {
123
        $this->generatePage->setUsageLimit($limit);
124
    }
125
126
    /**
127
     * @When I make generated coupons valid until :date
128
     */
129
    public function iMakeGeneratedCouponsValidUntil(\DateTime $date)
130
    {
131
        $this->generatePage->setExpiresAt($date);
132
    }
133
134
    /**
135
     * @When I specify its code as :code
136
     */
137
    public function iSpecifyItsCodeAs($code)
138
    {
139
        $this->createPage->specifyCode($code);
140
    }
141
142
    /**
143
     * @When I do not specify its code
144
     */
145
    public function iDoNotSpecifyItsCode()
146
    {
147
        // Intentionally left blank to fulfill context expectation
148
    }
149
150
    /**
151
     * @When I do not specify its amount
152
     */
153
    public function iDoNotSpecifyItsAmount()
154
    {
155
        // Intentionally left blank to fulfill context expectation
156
    }
157
158
    /**
159
     * @When I limit its usage to :limit times
160
     */
161
    public function iLimitItsUsageLimitTo($limit)
162
    {
163
        $this->createPage->setUsageLimit($limit);
164
    }
165
166
    /**
167
     * @When I change its usage limit to :limit
168
     */
169
    public function iChangeItsUsageLimitTo($limit)
170
    {
171
        $this->updatePage->setUsageLimit($limit);
172
    }
173
174
    /**
175
     * @When I specify its amount as :amount
176
     */
177
    public function iSpecifyItsAmountAs($amount)
178
    {
179
        $this->generatePage->specifyAmount($amount);
180
    }
181
182
    /**
183
     * @When I limit its per customer usage to :limit times
184
     */
185
    public function iLimitItsPerCustomerUsageLimitTo($limit)
186
    {
187
        $this->createPage->setCustomerUsageLimit($limit);
188
    }
189
190
    /**
191
     * @When I change its per customer usage limit to :limit
192
     */
193
    public function iChangeItsPerCustomerUsageLimitTo($limit)
194
    {
195
        $this->updatePage->setCustomerUsageLimit($limit);
196
    }
197
198
    /**
199
     * @When I make it valid until :date
200
     */
201
    public function iMakeItValidUntil(\DateTime $date)
202
    {
203
        $this->createPage->setExpiresAt($date);
204
    }
205
206
    /**
207
     * @When I change expires date to :date
208
     */
209
    public function iChangeExpiresDateTo(\DateTime $date)
210
    {
211
        $this->updatePage->setExpiresAt($date);
212
    }
213
214
    /**
215
     * @When I add it
216
     * @When I try to add it
217
     */
218
    public function iAddIt()
219
    {
220
        $this->createPage->create();
221
    }
222
223
    /**
224
     * @When I save my changes
225
     */
226
    public function iSaveMyChanges()
227
    {
228
        $this->updatePage->saveChanges();
229
    }
230
231
    /**
232
     * @When I generate it
233
     * @When I try to generate it
234
     */
235
    public function iGenerateIt()
236
    {
237
        $this->generatePage->generate();
238
    }
239
240
    /**
241
     * @When /^I delete ("[^"]+" coupon) related to (this promotion)$/
242
     * @When /^I try to delete ("[^"]+" coupon) related to (this promotion)$/
243
     */
244
    public function iDeleteCouponRelatedToThisPromotion(CouponInterface $coupon, PromotionInterface $promotion)
245
    {
246
        $this->indexPage->open(['promotionId' => $promotion->getId()]);
247
        $this->indexPage->deleteResourceOnPage(['code' => $coupon->getCode()]);
248
    }
249
250
    /**
251
     * @Then /^there should be (\d+) coupon related to (this promotion)$/
252
     */
253
    public function thereShouldBeCouponRelatedTo($number, PromotionInterface $promotion)
254
    {
255
        $this->indexPage->open(['promotionId' => $promotion->getId()]);
256
257
        Assert::eq(
258
            $number,
259
            $this->indexPage->countItems(),
260
            'There should be %s coupons but is %s'
261
        );
262
    }
263
264
    /**
265
     * @Then /^there should be coupon with code "([^"]+)"$/
266
     */
267
    public function thereShouldBeCouponWithCode($code)
268
    {
269
        Assert::true(
270
            $this->indexPage->isSingleResourceOnPage(['code' => $code]),
271
            sprintf('There should be coupon with code %s but it is not.', $code)
272
        );
273
    }
274
275
    /**
276
     * @Then this coupon should be valid until :date
277
     */
278
    public function thisCouponShouldBeValidUntil(\DateTime $date)
279
    {
280
        Assert::true(
281
            $this->indexPage->isSingleResourceOnPage(['Expires at' => date('d-m-Y', $date->getTimestamp())]),
282
            sprintf('There should be coupon with expires date %s', date('d-m-Y', $date->getTimestamp()))
283
        );
284
    }
285
286
    /**
287
     * @Then /^this coupon should have (\d+) usage limit$/
288
     */
289
    public function thisCouponShouldHaveUsageLimit($limit)
290
    {
291
        Assert::true(
292
            $this->indexPage->isSingleResourceOnPage(['Usage limit' => $limit]),
293
            sprintf('There should be coupon with %s usage limit', $limit)
294
        );
295
    }
296
297
    /**
298
     * @Then /^this coupon should have (\d+) per customer usage limit$/
299
     */
300
    public function thisCouponShouldHavePerCustomerUsageLimit($limit)
301
    {
302
        Assert::true(
303
            $this->indexPage->isSingleResourceOnPage(['Per customer usage limit' => $limit]),
304
            sprintf('There should be coupon with %s per customer usage limit', $limit)
305
        );
306
    }
307
308
    /**
309
     * @Then the code field should be disabled
310
     */
311
    public function theCodeFieldShouldBeDisabled()
312
    {
313
        Assert::true(
314
            $this->updatePage->isCodeDisabled(),
315
            'Code field should be disabled'
316
        );
317
    }
318
319
    /**
320
     * @Then /^I should be notified that coupon with this code already exists$/
321
     */
322
    public function iShouldBeNotifiedThatCouponWithThisCodeAlreadyExists()
323
    {
324
        $currentPage = $this->currentPageResolver->getCurrentPageWithForm([$this->createPage, $this->updatePage]);
325
326
        Assert::true(
327
            $currentPage->checkValidationMessageFor('code', 'This coupon already exists.'),
328
            'Unique code violation message should appear on page, but it does not.'
329
        );
330
    }
331
332
    /**
333
     * @Then I should be notified that :element is required
334
     */
335
    public function iShouldBeNotifiedThatIsRequired($element)
336
    {
337
        $currentPage = $this->currentPageResolver->getCurrentPageWithForm([$this->createPage, $this->updatePage]);
338
339
        Assert::true(
340
            $currentPage->checkValidationMessageFor($element, sprintf('Please enter coupon %s.', $element)),
341
            sprintf('I should be notified that coupon %s should be required.', $element)
342
        );
343
    }
344
345
    /**
346
     * @Then I should be notified that generate amount is required
347
     */
348
    public function iShouldBeNotifiedThatGenerateAmountIsRequired()
349
    {
350
        Assert::true(
351
            $this->generatePage->checkAmountValidation('Please enter amount of coupons to generate.'),
352
            'Generate amount violation message should appear on page, but it does not.'
353
        );
354
    }
355
356
    /**
357
     * @Then /^there should still be only one coupon with code "([^"]+)" related to (this promotion)$/
358
     */
359
    public function thereShouldStillBeOnlyOneCouponWithCodeRelatedTo($code, PromotionInterface $promotion)
360
    {
361
        $this->indexPage->open(['promotionId' => $promotion->getId()]);
362
363
        Assert::true(
364
            $this->indexPage->isSingleResourceOnPage(['code' => $code]),
365
            sprintf('There is no coupon with code %s.', $code)
366
        );
367
    }
368
369
    /**
370
     * @Then I should be notified that coupon usage limit must be at least one
371
     */
372
    public function iShouldBeNotifiedThatCouponUsageLimitMustBeAtLeast()
373
    {
374
        $currentPage = $this->currentPageResolver->getCurrentPageWithForm([$this->createPage, $this->updatePage]);
375
376
        Assert::true(
377
            $currentPage->checkValidationMessageFor('usage_limit', 'Coupon usage limit must be at least 1.'),
378
            'Min usage limit violation message should appear on page, but it did not.'
379
        );
380
    }
381
382
    /**
383
     * @Then /^(this coupon) should no longer exist in the coupon registry$/
384
     */
385
    public function couponShouldNotExistInTheRegistry(CouponInterface $coupon)
386
    {
387
        Assert::false(
388
            $this->indexPage->isSingleResourceOnPage(['code' => $coupon->getCode()]),
389
            sprintf('Coupon with code %s should not exist.', $coupon->getCode())
390
        );
391
    }
392
393
    /**
394
     * @Then I should be notified that it has been successfully generated
395
     */
396
    public function iShouldBeNotifiedThatItHasBeenSuccessfullyGenerated()
397
    {
398
        $this->notificationChecker->checkNotification('Success Promotion coupons have been successfully generated.', NotificationType::success());
399
    }
400
401
    /**
402
     * @Then I should be notified that it is in use and cannot be deleted
403
     */
404
    public function iShouldBeNotifiedOfFailure()
405
    {
406
        $this->notificationChecker->checkNotification(
407
            "Error Cannot delete, the promotion coupon is in use.",
408
            NotificationType::failure()
409
        );
410
    }
411
412
    /**
413
     * @Then /^(this coupon) should still exist in the registry$/
414
     */
415
    public function couponShouldStillExistInTheRegistry(CouponInterface $coupon)
416
    {
417
        Assert::true(
418
            $this->indexPage->isSingleResourceOnPage(['code' => $coupon->getCode()]),
419
            sprintf('Coupon with code %s should exist.', $coupon->getCode())
420
        );
421
    }
422
}
423