Completed
Branch master (b23e60)
by Kamil
35:19
created

CheckoutContext::iProvideAdditionalNotesLike()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
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;
13
14
use Behat\Behat\Context\Context;
15
use Sylius\Behat\Page\Shop\Checkout\AddressingPageInterface;
16
use Sylius\Behat\Page\Shop\Checkout\PaymentPageInterface;
17
use Sylius\Behat\Page\Shop\Checkout\ShippingPageInterface;
18
use Sylius\Behat\Page\Shop\Checkout\SummaryPageInterface;
19
use Sylius\Behat\Page\Shop\Order\OrderPaymentsPageInterface;
20
use Sylius\Behat\Page\Shop\Checkout\AddressingStepInterface;
21
use Sylius\Behat\Page\Shop\Checkout\FinalizeStepInterface;
22
use Sylius\Behat\Page\Shop\Checkout\PaymentStepInterface;
23
use Sylius\Behat\Page\Shop\Checkout\SecurityStepInterface;
24
use Sylius\Behat\Page\Shop\Checkout\ShippingStepInterface;
25
use Sylius\Behat\Page\Shop\Checkout\ThankYouPageInterface;
26
use Sylius\Component\Core\Formatter\StringInflector;
27
use Sylius\Behat\Service\SecurityServiceInterface;
28
use Sylius\Component\Core\Model\AddressInterface;
29
use Sylius\Component\Core\Model\OrderInterface;
30
use Sylius\Component\Core\Model\ProductInterface;
31
use Sylius\Component\Core\Model\ShippingMethodInterface;
32
use Sylius\Component\Core\Model\UserInterface;
33
use Sylius\Component\Core\Test\Services\SharedStorageInterface;
34
use Sylius\Component\Order\Repository\OrderRepositoryInterface;
35
use Sylius\Component\Payment\Model\PaymentInterface;
36
use Sylius\Component\Payment\Model\PaymentMethodInterface;
37
use Webmozart\Assert\Assert;
38
39
/**
40
 * @author Arkadiusz Krakowiak <[email protected]>
41
 */
42
final class CheckoutContext implements Context
43
{
44
    /**
45
     * @var SharedStorageInterface
46
     */
47
    private $sharedStorage;
48
49
    /**
50
     * @var SecurityStepInterface
51
     */
52
    private $checkoutSecurityStep;
53
54
    /**
55
     * @var AddressingStepInterface
56
     */
57
    private $checkoutAddressingStep;
58
59
    /**
60
     * @var AddressingPageInterface
61
     */
62
    private $addressingPage;
63
64
    /**
65
     * @var ShippingStepInterface
66
     */
67
    private $checkoutShippingStep;
68
69
    /**
70
     * @var PaymentStepInterface
71
     */
72
    private $checkoutPaymentStep;
73
74
    /**
75
     * @var PaymentPageInterface
76
     */
77
    private $paymentPage;
78
79
    /**
80
     * @var FinalizeStepInterface
81
     */
82
    private $checkoutFinalizeStep;
83
84
    /**
85
     * @var ThankYouPageInterface
86
     */
87
    private $checkoutThankYouPage;
88
89
    /**
90
     * @var OrderPaymentsPageInterface
91
     */
92
    private $orderPaymentsPage;
93
94
    /**
95
     * @var ShippingPageInterface
96
     */
97
    private $shippingPage;
98
99
    /**
100
     * @var SummaryPageInterface
101
     */
102
    private $summaryPage;
103
104
    /**
105
     * @var OrderRepositoryInterface
106
     */
107
    private $orderRepository;
108
109
    /**
110
     * @var SecurityServiceInterface
111
     */
112
    private $securityService;
113
114
    /**
115
     * @param SharedStorageInterface $sharedStorage
116
     * @param SecurityStepInterface $checkoutSecurityStep
117
     * @param AddressingStepInterface $checkoutAddressingStep
118
     * @param AddressingPageInterface $addressingPage
119
     * @param ShippingStepInterface $checkoutShippingStep
120
     * @param ShippingPageInterface $shippingPage
121
     * @param PaymentStepInterface $checkoutPaymentStep
122
     * @param PaymentPageInterface $paymentPage
123
     * @param SummaryPageInterface $summaryPage
124
     * @param FinalizeStepInterface $checkoutFinalizeStep
125
     * @param ThankYouPageInterface $checkoutThankYouPage
126
     * @param OrderPaymentsPageInterface $orderPaymentsPage
127
     * @param OrderRepositoryInterface $orderRepository
128
     * @param SecurityServiceInterface $securityService
129
     */
130
    public function __construct(
131
        SharedStorageInterface $sharedStorage,
132
        SecurityStepInterface $checkoutSecurityStep,
133
        AddressingStepInterface $checkoutAddressingStep,
0 ignored issues
show
Comprehensibility Naming introduced by
The variable name $checkoutAddressingStep exceeds the maximum configured length of 20.

Very long variable names usually make code harder to read. It is therefore recommended not to make variable names too verbose.

Loading history...
134
        AddressingPageInterface $addressingPage,
135
        ShippingStepInterface $checkoutShippingStep,
136
        ShippingPageInterface $shippingPage,
137
        PaymentStepInterface $checkoutPaymentStep,
138
        PaymentPageInterface $paymentPage,
139
        SummaryPageInterface $summaryPage,
140
        FinalizeStepInterface $checkoutFinalizeStep,
141
        ThankYouPageInterface $checkoutThankYouPage,
142
        OrderPaymentsPageInterface $orderPaymentsPage,
143
        OrderRepositoryInterface $orderRepository,
144
        SecurityServiceInterface $securityService
145
    ) {
146
        $this->sharedStorage = $sharedStorage;
147
        $this->checkoutSecurityStep = $checkoutSecurityStep;
148
        $this->checkoutAddressingStep = $checkoutAddressingStep;
149
        $this->addressingPage = $addressingPage;
150
        $this->checkoutShippingStep = $checkoutShippingStep;
151
        $this->shippingPage = $shippingPage;
152
        $this->checkoutPaymentStep = $checkoutPaymentStep;
153
        $this->paymentPage = $paymentPage;
154
        $this->summaryPage = $summaryPage;
155
        $this->checkoutFinalizeStep = $checkoutFinalizeStep;
156
        $this->checkoutThankYouPage = $checkoutThankYouPage;
157
        $this->orderPaymentsPage = $orderPaymentsPage;
158
        $this->orderRepository = $orderRepository;
159
        $this->securityService = $securityService;
160
    }
161
162
    /**
163
     * @Given /^I proceed without selecting shipping address$/
164
     */
165
    public function iProceedWithoutSelectingShippingAddress()
166
    {
167
        $this->checkoutAddressingStep->open();
168
        $this->checkoutAddressingStep->continueCheckout();
169
    }
170
171
    /**
172
     * @Given I am at the checkout addressing step
173
     */
174
    public function iAmAtTheCheckoutAddressingStep()
175
    {
176
        $this->addressingPage->open();
177
    }
178
179
    /**
180
     * @Given /^(this user) bought this product$/
181
     */
182
    public function thisUserBought(UserInterface $user)
183
    {
184
        $this->securityService->performActionAs($user, function () {
185
            $this->iProceedSelectingOfflinePaymentMethod();
186
            $this->iConfirmMyOrder();
187
        });
188
    }
189
190
    /**
191
     * @When /^I specify the shipping (address as "([^"]+)", "([^"]+)", "([^"]+)", "([^"]+)" for "([^"]+)")$/
192
     * @When /^I (do not specify any shipping address) information$/
193
     */
194 View Code Duplication
    public function iSpecifyTheShippingAddressAs(AddressInterface $address)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
195
    {
196
        $key = sprintf(
197
            'shipping_address_%s_%s',
198
            strtolower($address->getFirstName()),
199
            strtolower($address->getLastName())
200
        );
201
        $this->sharedStorage->set($key, $address);
202
203
        $this->addressingPage->specifyShippingAddress($address);
204
    }
205
206
    /**
207
     * @When /^I specify the billing (address as "([^"]+)", "([^"]+)", "([^"]+)", "([^"]+)" for "([^"]+)")$/
208
     * @When /^I (do not specify any billing address) information$/
209
     */
210 View Code Duplication
    public function iSpecifyTheBillingAddressAs(AddressInterface $address)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
211
    {
212
        $this->iChooseTheDifferentBillingAddress();
213
        $key = sprintf(
214
            'billing_address_%s_%s',
215
            strtolower($address->getFirstName()),
216
            strtolower($address->getLastName())
217
        );
218
        $this->sharedStorage->set($key, $address);
219
220
        $this->addressingPage->specifyBillingAddress($address);
221
    }
222
223
    /**
224
     * @When /^I specified the shipping (address as "([^"]+)", "([^"]+)", "([^"]+)", "([^"]+)" for "([^"]+)")$/
225
     */
226 View Code Duplication
    public function iSpecifiedTheShippingAddress(AddressInterface $address)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
227
    {
228
        $this->addressingPage->open();
229
        $this->iSpecifyTheShippingAddressAs($address);
230
231
        $key = sprintf('billing_address_%s_%s', strtolower($address->getFirstName()), strtolower($address->getLastName()));
232
        $this->sharedStorage->set($key, $address);
233
234
        $this->iCompleteTheAddressingStep();
235
    }
236
237
    /**
238
     * @When I choose the different billing address
239
     */
240
    public function iChooseTheDifferentBillingAddress()
241
    {
242
        $this->addressingPage->chooseDifferentBillingAddress();
243
    }
244
245
    /**
246
     * @When I specify the email as :email
247
     * @When I do not specify the email
248
     */
249
    public function iSpecifyTheEmail($email = null)
250
    {
251
        $this->addressingPage->specifyEmail($email);
252
    }
253
254
    /**
255
     * @When I select :shippingMethod shipping method
256
     */
257
    public function iSelectShippingMethod($shippingMethod)
258
    {
259
        $this->shippingPage->selectShippingMethod($shippingMethod);
260
    }
261
262
    /**
263
     * @Then I should not be able to select :shippingMethod shipping method
264
     */
265
    public function iShouldNotBeAbleToSelectShippingMethod($shippingMethod)
266
    {
267
        Assert::false(
268
            $this->shippingPage->hasShippingMethod($shippingMethod),
269
            sprintf('Shipping method "%s" should not be available but it does.', $shippingMethod)
270
        );
271
    }
272
273
    /**
274
     * @When I complete the addressing step
275
     * @When I try to complete the addressing step
276
     */
277
    public function iCompleteTheAddressingStep()
278
    {
279
        $this->addressingPage->nextStep();
280
    }
281
282
    /**
283
     * @When I complete the shipping step
284
     */
285
    public function iCompleteTheShippingStep()
286
    {
287
        $this->shippingPage->nextStep();
288
    }
289
290
    /**
291
     * @When /^I proceed selecting "([^"]*)" as shipping country$/
292
     */
293
    public function iProceedSelectingShippingCountry($shippingCountry)
294
    {
295
        $this->checkoutAddressingStep->open();
296
        $this->checkoutAddressingStep->fillAddressingDetails([
297
            'firstName' => 'John',
298
            'lastName' => 'Doe',
299
            'country' => $shippingCountry ?: 'France',
300
            'street' => '0635 Myron Hollow Apt. 711',
301
            'city' => 'North Bridget',
302
            'postcode' => '93-554',
303
            'phoneNumber' => '321123456',
304
        ]);
305
        $this->checkoutAddressingStep->continueCheckout();
306
    }
307
308
    /**
309
     * @When /^I proceed selecting "([^"]*)" as shipping country with "([^"]*)" method$/
310
     */
311
    public function iProceedSelectingShippingCountryAndShippingMethod($shippingCountry, $shippingMethodName)
312
    {
313
        $this->iProceedSelectingShippingCountry($shippingCountry);
314
315
        $this->checkoutShippingStep->selectShippingMethod($shippingMethodName ?: 'Free');
316
        $this->checkoutShippingStep->continueCheckout();
317
    }
318
319
    /**
320
     * @When /^I proceed selecting "([^"]+)" shipping method$/
321
     * @Given /^I chose "([^"]*)" shipping method$/
322
     */
323
    public function iProceedSelectingShippingMethod($shippingMethodName)
324
    {
325
        $this->iProceedSelectingShippingCountryAndShippingMethod(null, $shippingMethodName);
326
    }
327
328
    /**
329
     * @When /^I choose "([^"]*)" payment method$/
330
     */
331
    public function iChoosePaymentMethod($paymentMethodName)
332
    {
333
        $this->checkoutPaymentStep->verify([]);
334
        $this->checkoutPaymentStep->selectPaymentMethod($paymentMethodName ?: 'Offline');
335
        $this->checkoutPaymentStep->continueCheckout();
336
    }
337
338
    /**
339
     * @When /^I proceed selecting "([^"]*)" as shipping country with "([^"]*)" payment method$/
340
     */
341
    public function iProceedSelectingShippingCountryAndPaymentMethod($shippingCountry, $paymentMethodName)
342
    {
343
        $this->iProceedSelectingShippingCountryAndShippingMethod($shippingCountry, null);
344
345
        $this->iChoosePaymentMethod($paymentMethodName);
346
    }
347
348
    /**
349
     * @When I proceed selecting :paymentMethodName payment method
350
     */
351
    public function iProceedSelectingOfflinePaymentMethod($paymentMethodName = 'Offline')
352
    {
353
        $this->iProceedSelectingShippingCountryAndPaymentMethod(null, $paymentMethodName);
354
    }
355
356
    /**
357
     * @When /^I change shipping method to "([^"]*)"$/
358
     */
359
    public function iChangeShippingMethod($shippingMethodName)
360
    {
361
        $this->checkoutShippingStep->open();
362
        $this->checkoutShippingStep->selectShippingMethod($shippingMethodName);
363
        $this->checkoutShippingStep->continueCheckout();
364
    }
365
366
    /**
367
     * @When /^I provide additional note like "([^"]+)"$/
368
     */
369
    public function iProvideAdditionalNotesLike($notes)
370
    {
371
        $this->sharedStorage->set('additional_note', $notes);
372
        $this->summaryPage->addNotes($notes);
373
    }
374
375
    /**
376
     * @Given /^I proceed logging as "([^"]*)" with "([^"]*)" password$/
377
     */
378
    public function iProceedLoggingAs($login, $password)
379
    {
380
        $this->checkoutSecurityStep->open();
381
        $this->checkoutSecurityStep->logInAsExistingUser($login, $password);
382
383
        $this->checkoutAddressingStep->continueCheckout();
384
    }
385
386
    /**
387
     * @When /^I proceed as guest "([^"]*)" with "([^"]*)" as shipping country$/
388
     */
389
    public function iProceedLoggingAsGuestWithAsShippingCountry($email, $shippingCountry)
390
    {
391
        $this->checkoutSecurityStep->open();
392
        $this->checkoutSecurityStep->proceedAsGuest($email);
393
394
        $this->iProceedSelectingShippingCountry($shippingCountry);
395
    }
396
397
    /**
398
     * @When I confirm my order
399
     */
400
    public function iConfirmMyOrder()
401
    {
402
        $this->checkoutFinalizeStep->confirmOrder();
403
    }
404
405
    /**
406
     * @When I specify the password as :password
407
     */
408
    public function iSpecifyThePasswordAs($password)
409
    {
410
        $this->addressingPage->specifyPassword($password);
411
    }
412
413
    /**
414
     * @When I sign in
415
     */
416
    public function iSignIn()
417
    {
418
        $this->addressingPage->signIn();
419
    }
420
421
    /**
422
     * @Then I should see the thank you page
423
     */
424
    public function iShouldSeeTheThankYouPage()
425
    {
426
        /** @var UserInterface $user */
427
        $user = $this->sharedStorage->get('user');
428
        $customer = $user->getCustomer();
429
430
        expect($this->checkoutThankYouPage->hasThankYouMessageFor($customer->getFullName()))->toBe(true);
431
    }
432
433
    /**
434
     * @Then I should be redirected back to the thank you page
435
     */
436
    public function iShouldBeRedirectedBackToTheThankYouPage()
437
    {
438
        $this->checkoutThankYouPage->waitForResponse(5);
439
440
        expect($this->checkoutThankYouPage->isOpen())->toBe(true);
441
    }
442
443
    /**
444
     * @Then I should be redirected back to the order payment page
445
     */
446
    public function iShouldBeRedirectedBackToTheOrderPaymentPage()
447
    {
448
        $this->orderPaymentsPage->waitForResponse(5, ['number' => $this->getLastOrder()->getNumber()]);
449
450
        expect($this->orderPaymentsPage->isOpen(['number' => $this->getLastOrder()->getNumber()]))->toBe(true);
451
    }
452
453
    /**
454
     * @Then I should be on the checkout shipping step
455
     */
456
    public function iShouldBeOnTheCheckoutShippingStep()
457
    {
458
        Assert::true(
459
            $this->shippingPage->isOpen(),
460
            'Checkout shipping page should be opened, but it is not.'
461
        );
462
    }
463
464
    /**
465
     * @Then I should be on the checkout summary step
466
     */
467
    public function iShouldBeOnTheCheckoutSummaryStep()
468
    {
469
        Assert::true(
470
            $this->summaryPage->isOpen(),
471
            'Checkout summary page should be opened, but it is not.'
472
        );
473
    }
474
475
    /**
476
     * @Then I should see two cancelled payments and new one ready to be paid
477
     */
478
    public function iShouldSeeTwoCancelledPaymentsAndNewOneReadyToBePaid()
479
    {
480
        expect($this->orderPaymentsPage->countPaymentWithSpecificState(PaymentInterface::STATE_CANCELLED))->toBe(2);
481
        expect($this->orderPaymentsPage->countPaymentWithSpecificState(PaymentInterface::STATE_NEW))->toBe(1);
482
    }
483
484
    /**
485
     * @Then /^I should(?:| also) be notified that the "([^"]+)" and the "([^"]+)" in (shipping|billing) details are required$/
486
     */
487
    public function iShouldBeNotifiedThatTheAndTheInShippingDetailsAreRequired($firstElement, $secondElement, $type)
488
    {
489
        $this->assertElementValidationMessage($type, $firstElement, sprintf('Please enter %s.', $firstElement));
490
        $this->assertElementValidationMessage($type, $secondElement, sprintf('Please enter %s.', $secondElement));
491
    }
492
493
    /**
494
     * @Then I should be informed that my order cannot be shipped to this address
495
     */
496
    public function iShouldBeInformedThatMyOrderCannotBeShippedToThisAddress()
497
    {
498
        Assert::true(
499
            $this->shippingPage->hasNoShippingMethodsMessage(),
500
            'Shipping page should have no shipping methods message but it does not.'
501
        );
502
    }
503
504
    /**
505
     * @Then I should be able to log in
506
     */
507
    public function iShouldBeAbleToLogIn()
508
    {
509
        Assert::true(
510
            $this->addressingPage->canSignIn(),
511
            'I should be able to login, but I am not.'
512
        );
513
    }
514
515
    /**
516
     * @Then the login form should no longer be accessible
517
     */
518
    public function theLoginFormShouldNoLongerBeAccessible()
519
    {
520
        Assert::false(
521
            $this->addressingPage->canSignIn(),
522
            'I should not be able to login, but I am.'
523
        );
524
    }
525
526
    /**
527
     * @Then I should be notified about bad credentials
528
     */
529
    public function iShouldBeNotifiedAboutBadCredentials()
530
    {
531
        Assert::true(
532
            $this->addressingPage->checkInvalidCredentialsValidation(),
533
            'I should see validation error, but I do not.'
534
        );
535
    }
536
537
    /**
538
     * @Then my order's shipping address should be to :fullName
539
     */
540 View Code Duplication
    public function iShouldSeeThisShippingAddressAsShippingAddress($fullName)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
541
    {
542
        $address = $this->sharedStorage->get('shipping_address_'.StringInflector::nameToLowercaseCode($fullName));
543
        Assert::true(
544
            $this->summaryPage->hasShippingAddress($address),
545
            'Shipping address is improper.'
546
        );
547
    }
548
549
    /**
550
     * @Then my order's billing address should be to :fullName
551
     */
552 View Code Duplication
    public function iShouldSeeThisBillingAddressAsBillingAddress($fullName)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
553
    {
554
        $address = $this->sharedStorage->get('billing_address_'.StringInflector::nameToLowercaseCode($fullName));
555
        Assert::true(
556
            $this->summaryPage->hasBillingAddress($address),
557
            'Billing address is improper.'
558
        );
559
    }
560
561
    /**
562
     * @Then address to :fullName should be used for both shipping and billing of my order`
563
     */
564
    public function iShouldSeeThisShippingAddressAsShippingAndBillingAddress($fullName)
565
    {
566
        $this->iShouldSeeThisShippingAddressAsShippingAddress($fullName);
567
        $this->iShouldSeeThisBillingAddressAsBillingAddress($fullName);
568
    }
569
570
    /**
571
     * @Given I am at the checkout payment step
572
     */
573
    public function iAmAtTheCheckoutPaymentStep()
574
    {
575
        $this->paymentPage->open();
576
    }
577
578
    /**
579
     * @When I complete the payment step
580
     */
581
    public function iCompleteThePaymentStep()
582
    {
583
        $this->paymentPage->nextStep();
584
    }
585
586
    /**
587
     * @When I select :paymentMethodName payment method
588
     */
589
    public function iSelectPaymentMethod($paymentMethodName)
590
    {
591
        $this->paymentPage->selectPaymentMethod($paymentMethodName);
592
    }
593
594
    /**
595
     * @Then I should not be able to select :paymentMethodName payment method
596
     */
597
    public function iShouldNotBeAbleToSelectPaymentMethod($paymentMethodName)
598
    {
599
        Assert::false(
600
            $this->paymentPage->hasPaymentMethod($paymentMethodName),
601
            sprintf('Payment method "%s" should not be available but it does.', $paymentMethodName)
602
        );
603
    }
604
605
    /**
606
     * @When I proceed order with :shippingMethod shipping method and :paymentMethod payment
607
     */
608
    public function iProceedOrderWithShippingMethodAndPayment($shippingMethod, $paymentMethod)
609
    {
610
        $this->iSelectShippingMethod($shippingMethod);
611
        $this->iCompleteTheShippingStep();
612
        $this->iSelectPaymentMethod($paymentMethod);
613
        $this->iCompleteThePaymentStep();
614
    }
615
616
    /**
617
     * @Given I should have :quantity :productName products in the cart
618
     */
619
    public function iShouldHaveProductsInTheCart($quantity, $productName)
620
    {
621
        Assert::true(
622
            $this->summaryPage->hasItemWithProductAndQuantity($productName, $quantity),
623
            sprintf('There is no "%s" with quantity %s on order summary page, but it should.', $productName, $quantity)
624
        );
625
    }
626
627
    /**
628
     * @Given I should see the shipping total with price :price
629
     */
630
    public function iShouldSeeTheShippingTotalWithPrice($price)
631
    {
632
        Assert::true(
633
            $this->summaryPage->hasShippingTotal($price),
634
            sprintf('The shipping total should be %s, but it is not.',$price)
635
        );
636
    }
637
638
    /**
639
     * @Then /^the ("[^"]+" product) should have unit price discounted by ("\$\d+")$/
640
     */
641
    public function theShouldHaveUnitPriceDiscountedFor(ProductInterface $product, $amount)
642
    {
643
        Assert::true(
644
            $this->summaryPage->hasProductDiscountedUnitPriceBy($product, $amount),
645
            sprintf('Product %s should have discounted price by %s, but it does not have.', $product->getName(), $amount)
646
        );
647
    }
648
649
    /**
650
     * @Then /^my order total should be ("\$\d+")$/
651
     */
652
    public function myOrderTotalShouldBe($total)
653
    {
654
        Assert::true(
655
            $this->summaryPage->hasOrderTotal($total),
656
            sprintf('Order total should have %s total, but it does not have.', $total)
657
        );
658
    }
659
660
    /**
661
     * @Given I should see promotion total :promotionTotal
662
     */
663
    public function iShouldSeeDiscountTotal($promotionTotal)
664
    {
665
        Assert::true(
666
            $this->summaryPage->hasPromotionTotal($promotionTotal),
667
            sprintf('The total discount should be %s, but it does not.', $promotionTotal)
668
        );
669
    }
670
671
    /**
672
     * @Given I should see promotion :promotionName
673
     */
674
    public function iShouldSeePromotion($promotionName)
675
    {
676
        Assert::true(
677
            $this->summaryPage->hasPromotion($promotionName),
678
            sprintf('The promotion %s should appear on the page, but it does not.', $promotionName)
679
        );
680
    }
681
682
    /**
683
     * @Given my tax total should be :taxTotal
684
     */
685
    public function myTaxTotalShouldBe($taxTotal)
686
    {
687
        Assert::true(
688
            $this->summaryPage->hasTaxTotal($taxTotal),
689
            sprintf('The tax total should be %s, but it does not.', $taxTotal)
690
        );
691
    }
692
693
    /**
694
     * @Then I should see :shippingMethod shipping method
695
     */
696
    public function iShouldSeeThisShippingMethod(ShippingMethodInterface $shippingMethod)
697
    {
698
        Assert::true(
699
            $this->summaryPage->hasShippingMethod($shippingMethod),
700
            sprintf('I should see %s shipping method, but I do not.', $shippingMethod->getName())
701
        );
702
    }
703
704
    /**
705
     * @Then I should see :paymentMethod payment method
706
     */
707
    public function iShouldSeeThisPaymentMethod(PaymentMethodInterface $paymentMethod)
708
    {
709
        Assert::true(
710
            $this->summaryPage->hasPaymentMethod($paymentMethod),
711
            sprintf('I should see %s payment method, but i do not.', $paymentMethod->getName())
712
        );
713
    }
714
715
    /**
716
     * @param string $type
717
     * @param string $element
718
     * @param string $expectedMessage
719
     *
720
     * @throws \InvalidArgumentException
721
     */
722
    private function assertElementValidationMessage($type, $element, $expectedMessage)
723
    {
724
        $element = sprintf('%s_%s', $type, implode('_', explode(' ', $element)));
725
        Assert::true(
726
            $this->addressingPage->checkValidationMessageFor($element, $expectedMessage),
727
            sprintf('The %s should be required.', $element)
728
        );
729
    }
730
731
    /**
732
     * @return OrderInterface
733
     *
734
     * @throws \RuntimeException
735
     */
736 View Code Duplication
    private function getLastOrder()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
737
    {
738
        $customer = $this->sharedStorage->get('user')->getCustomer();
739
        $orders = $this->orderRepository->findByCustomer($customer);
0 ignored issues
show
Bug introduced by
The method findByCustomer() does not exist on Sylius\Component\Order\R...rderRepositoryInterface. Did you maybe mean findBy()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
740
        $lastOrder = end($orders);
741
742
        if (false === $lastOrder) {
743
            throw new \RuntimeException(sprintf('There is no last order for %s', $customer->getFullName()));
744
        }
745
746
        return $lastOrder;
747
    }
748
}
749