Completed
Push — master ( 59db0f...abafe8 )
by Kamil
18:55
created

WebContext   C

Complexity

Total Complexity 75

Size/Duplication

Total Lines 725
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 75
c 2
b 0
f 0
lcom 1
cbo 9
dl 0
loc 725
rs 5

53 Methods

Rating   Name   Duplication   Size   Complexity  
A iAmOnThePage() 0 4 1
A iShouldBeOnThePage() 0 9 2
A iAmOnTheResourcePage() 0 13 1
A iAmOnTheResourcePageByName() 0 19 2
A iShouldBeOnTheResourcePage() 0 19 1
B iShouldBeOnTheResourcePageByName() 0 25 2
A iAmDoingSomethingWithResource() 0 11 1
A iAmDoingSomethingWithResourceByName() 0 23 3
A iShouldBeDoingSomethingWithResource() 0 12 1
A iShouldBeDoingSomethingWithResourceByName() 0 18 2
A textShouldAppearOnThePage() 0 4 1
A textShouldNotAppearOnThePage() 0 4 1
A iClick() 0 4 1
A iShouldSeeAElementNear() 0 5 1
A iClickNear() 0 12 2
A iShouldSeeFieldError() 0 6 1
A iShouldSeeFieldsOnError() 0 4 1
A iLeaveFieldEmpty() 0 4 1
A iShouldSeeInField() 0 4 1
A iShouldSeeResourceWithValueInThatList() 0 9 1
A iShouldNotSeeResourceWithValueInThatList() 0 9 1
A iShouldSeeResourceWithValueContainingInThatList() 0 9 1
A iShouldNotSeeResourceWithValueContainingInThatList() 0 9 1
A iShouldSeeThatMuchResourcesInTheList() 0 12 2
A iShouldBeLoggedIn() 0 6 2
A iShouldNotBeLoggedIn() 0 6 2
A iClickOnConfirmationModal() 0 15 1
A iAddFollowingAttributes() 0 9 2
A iAddAttribute() 0 4 1
A addAttributes() 0 21 2
A iChooseAttributeType() 0 11 1
A iWait() 0 4 1
A iShouldHaveMyAccessDenied() 0 4 1
A iShouldSeeResourceInTheListAsEnabled() 0 9 1
A iShouldSeeResourceInTheListAsDisabled() 0 9 1
A iShouldSeeTheFollowingRow() 0 10 3
A iShouldNotSeeTheFollowingRow() 0 10 3
A iShouldSeeSelectWithOption() 0 12 2
A iShouldNotSeeSelectWithOption() 0 12 2
A iShouldBeOnThePageWithGivenParent() 0 10 2
A iAmDoingSomethingWithResourceByNameFromGivenCategory() 0 12 1
A iAmOnTheZoneCreationPageForType() 0 5 1
A iShouldBeOnTheZoneCreationPageForType() 0 9 2
A iShouldSeeSelectWithOptionSelected() 0 5 1
A assertStatusCodeEquals() 0 8 2
A iAmOnTheCountryPageByName() 0 6 1
A iShouldBeDoingSomethingWithCountryByName() 0 6 1
A iAmDoingSomethingWithCountryByName() 0 6 1
A iShouldBeOnTheCountryPageByName() 0 6 1
A waitForModalToAppear() 0 6 1
A waitForModalToDisappear() 0 6 1
A iAmOnTheProductAttributeCreationPageWithType() 0 5 1
A iShouldNotBeAbleToEditSelect() 0 7 2

How to fix   Complexity   

Complex Class

Complex classes like WebContext often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use WebContext, and based on these observations, apply Extract Interface, too.

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\Bundle\ResourceBundle\Behat;
13
14
use Behat\Gherkin\Node\TableNode;
15
use Behat\Mink\Driver\Selenium2Driver;
16
use Behat\Mink\Element\NodeElement;
17
use Behat\Mink\Exception\UnsupportedDriverActionException;
18
use Symfony\Component\Security\Core\Exception\AuthenticationException;
19
20
class WebContext extends DefaultContext
21
{
22
    /**
23
     * @Given /^I am on the (.+) (page|step)?$/
24
     * @When /^I go to the (.+) (page|step)?$/
25
     */
26
    public function iAmOnThePage($page)
27
    {
28
        $this->getSession()->visit($this->generatePageUrl($page));
29
    }
30
31
    /**
32
     * @Then /^I should be on the (.+) (page|step)$/
33
     * @Then /^I should be redirected to the (.+) (page|step)$/
34
     * @Then /^I should still be on the (.+) (page|step)$/
35
     */
36
    public function iShouldBeOnThePage($page)
37
    {
38
        $this->assertSession()->addressEquals($this->generatePageUrl($page));
39
40
        try {
41
            $this->assertStatusCodeEquals(200);
42
        } catch (UnsupportedDriverActionException $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
43
        }
44
    }
45
46
    /**
47
     * @Given /^I am on the page of ([^""]*) with ([^""]*) "([^""]*)"$/
48
     * @Given /^I go to the page of ([^""]*) with ([^""]*) "([^""]*)"$/
49
     */
50
    public function iAmOnTheResourcePage($type, $property, $value)
51
    {
52
        $type = str_replace(' ', '_', $type);
53
54
        $entityManager = $this->getEntityManager();
55
        $entityManager->getFilters()->disable('softdeleteable');
56
        $resource = $this->findOneBy($type, [$property => $value]);
57
        $entityManager->getFilters()->enable('softdeleteable');
58
59
        $this->getSession()->visit($this->generatePageUrl(
60
            sprintf('%s_show', $type), ['id' => $resource->getId()]
61
        ));
62
    }
63
64
    /**
65
     * @Given /^I am on the page of ([^""(w)]*) "([^""]*)"$/
66
     * @Given /^I go to the page of ([^""(w)]*) "([^""]*)"$/
67
     */
68
    public function iAmOnTheResourcePageByName($type, $name)
69
    {
70
        if ('country' === $type) {
71
            $this->iAmOnTheCountryPageByName($name);
72
73
            return;
74
        }
75
76
        $type = str_replace(' ', '_', $type);
77
78
        $entityManager = $this->getEntityManager();
79
        $entityManager->getFilters()->disable('softdeleteable');
80
        $resource = $this->findOneByName($type, $name);
81
        $entityManager->getFilters()->enable('softdeleteable');
82
83
        $this->getSession()->visit($this->generatePageUrl(
84
            sprintf('%s_show', $type), ['id' => $resource->getId()]
85
        ));
86
    }
87
88
    /**
89
     * @Then /^I should be on the page of ([^""]*) with ([^""]*) "([^""]*)"$/
90
     * @Then /^I should still be on the page of ([^""]*) with ([^""]*) "([^""]*)"$/
91
     */
92
    public function iShouldBeOnTheResourcePage($type, $property, $value)
93
    {
94
        $type = str_replace(' ', '_', $type);
95
96
        $entityManager = $this->getEntityManager();
97
        $entityManager->getFilters()->disable('softdeleteable');
98
99
        $resource = $this->waitFor(function () use ($type, $property, $value) {
100
            return $this->getRepository($type)->findOneBy([$property => $value]);
101
        });
102
103
        $entityManager->getFilters()->enable('softdeleteable');
104
105
        $this->assertSession()->addressEquals($this->generatePageUrl(
106
            sprintf('%s_show', $type), ['id' => $resource->getId()]
107
        ));
108
109
        $this->assertStatusCodeEquals(200);
110
    }
111
112
    /**
113
     * @Then /^I should be on the page of ([^""(w)]*) "([^""]*)"$/
114
     * @Then /^I should still be on the page of ([^""(w)]*) "([^""]*)"$/
115
     */
116
    public function iShouldBeOnTheResourcePageByName($type, $name)
117
    {
118
        if ('country' === $type) {
119
            $this->iShouldBeOnTheCountryPageByName($name);
120
121
            return;
122
        }
123
124
        $type = str_replace(' ', '_', $type);
125
126
        $entityManager = $this->getEntityManager();
127
        $entityManager->getFilters()->disable('softdeleteable');
128
129
        $resource = $this->waitFor(function () use ($type, $name) {
130
            return $this->getRepository($type)->findOneByName($name);
131
        });
132
133
        $entityManager->getFilters()->enable('softdeleteable');
134
135
        $this->assertSession()->addressEquals($this->generatePageUrl(
136
            sprintf('%s_show', $type), ['id' => $resource->getId()]
137
        ));
138
139
        $this->assertStatusCodeEquals(200);
140
    }
141
142
    /**
143
     * @Given /^I am (building|viewing|editing) ([^""]*) with ([^""]*) "([^""]*)"$/
144
     */
145
    public function iAmDoingSomethingWithResource($action, $type, $property, $value)
146
    {
147
        $type = str_replace(' ', '_', $type);
148
149
        $action = str_replace(array_keys($this->actions), array_values($this->actions), $action);
150
        $resource = $this->findOneBy($type, [$property => $value]);
151
152
        $this->getSession()->visit($this->generatePageUrl(
153
            sprintf('%s_%s', $type, $action), ['id' => $resource->getId()]
154
        ));
155
    }
156
157
    /**
158
     * @Given /^I am (building|viewing|editing) ([^""(w)]*) "([^""]*)"$/
159
     */
160
    public function iAmDoingSomethingWithResourceByName($action, $type, $name)
161
    {
162
        if ('country' === $type) {
163
            $this->iAmDoingSomethingWithCountryByName($action, $name);
164
165
            return;
166
        }
167
168
        if('product option' === $type) {
169
            $this->iAmDoingSomethingWithResource($action, $type, 'code', $name);
170
171
            return;
172
        }
173
174
        $type = str_replace(' ', '_', $type);
175
176
        $action = str_replace(array_keys($this->actions), array_values($this->actions), $action);
177
        $resource = $this->findOneByName($type, $name);
178
179
        $this->getSession()->visit($this->generatePageUrl(
180
            sprintf('%s_%s', $type, $action), ['id' => $resource->getId()]
181
        ));
182
    }
183
184
    /**
185
     * @Then /^I should be (building|viewing|editing) ([^"]*) with ([^"]*) "([^""]*)"$/
186
     */
187
    public function iShouldBeDoingSomethingWithResource($action, $type, $property, $value)
188
    {
189
        $type = str_replace(' ', '_', $type);
190
191
        $action = str_replace(array_keys($this->actions), array_values($this->actions), $action);
192
        $resource = $this->findOneBy($type, [$property => $value]);
193
194
        $this->assertSession()->addressEquals($this->generatePageUrl(
195
            sprintf('%s_%s', $type, $action), ['id' => $resource->getId()]
196
        ));
197
        $this->assertStatusCodeEquals(200);
198
    }
199
200
    /**
201
     * @Then /^I should be (building|viewing|editing) ([^""(w)]*) "([^""]*)"$/
202
     */
203
    public function iShouldBeDoingSomethingWithResourceByName($action, $type, $name)
204
    {
205
        if ('country' === $type) {
206
            $this->iShouldBeDoingSomethingWithCountryByName($action, $name);
207
208
            return;
209
        }
210
211
        $type = str_replace(' ', '_', $type);
212
213
        $action = str_replace(array_keys($this->actions), array_values($this->actions), $action);
214
        $resource = $this->findOneByName($type, $name);
215
216
        $this->assertSession()->addressEquals($this->generatePageUrl(
217
            sprintf('%s_%s', $type, $action), ['id' => $resource->getId()]
218
        ));
219
        $this->assertStatusCodeEquals(200);
220
    }
221
222
    /**
223
     * @Then /^(?:.* )?"([^"]*)" should appear on the page$/
224
     */
225
    public function textShouldAppearOnThePage($text)
226
    {
227
        $this->assertSession()->pageTextContains($text);
228
    }
229
230
    /**
231
     * @Then /^(?:.* )?"([^"]*)" should not appear on the page$/
232
     */
233
    public function textShouldNotAppearOnThePage($text)
234
    {
235
        $this->assertSession()->pageTextNotContains($text);
236
    }
237
238
    /**
239
     * @When /^I click "([^"]+)"$/
240
     */
241
    public function iClick($link)
242
    {
243
        $this->clickLink($link);
244
    }
245
246
    /**
247
     * @Given /^I should see an? "(?P<element>[^"]*)" element near "([^"]*)"$/
248
     */
249
    public function iShouldSeeAElementNear($element, $value)
250
    {
251
        $tr = $this->assertSession()->elementExists('css', sprintf('table tbody tr:contains("%s")', $value));
252
        $this->assertSession()->elementExists('css', $element, $tr);
253
    }
254
255
    /**
256
     * @When /^I click "([^"]*)" near "([^"]*)"$/
257
     * @When /^I press "([^"]*)" near "([^"]*)"$/
258
     */
259
    public function iClickNear($button, $value)
260
    {
261
        $tr = $this->assertSession()->elementExists('css', sprintf('table tbody tr:contains("%s")', $value));
262
263
        $locator = sprintf('button:contains("%s")', $button);
264
265
        if ($tr->has('css', $locator)) {
266
            $tr->find('css', $locator)->press();
267
        } else {
268
            $tr->clickLink($button);
269
        }
270
    }
271
272
    /**
273
     * @Then /^I should see "([^"]*)" field error$/
274
     */
275
    public function iShouldSeeFieldError($field)
276
    {
277
        $this->assertSession()->elementExists('xpath', sprintf(
278
            "//div[contains(@class, 'error')]//label[text()[contains(., '%s')]]", ucfirst($field)
279
        ));
280
    }
281
282
    /**
283
     * @Given /^I should see (\d+) validation errors$/
284
     */
285
    public function iShouldSeeFieldsOnError($amount)
286
    {
287
        $this->assertSession()->elementsCount('css', '.form-error', $amount);
288
    }
289
290
    /**
291
     * @Given /^I leave "([^"]*)" empty$/
292
     * @Given /^I leave "([^"]*)" field blank/
293
     */
294
    public function iLeaveFieldEmpty($field)
295
    {
296
        $this->fillField($field, '');
297
    }
298
299
    /**
300
     * @Then /^I should see "([^"]*)" in "([^"]*)" field$/
301
     */
302
    public function iShouldSeeInField($value, $field)
303
    {
304
        $this->assertSession()->fieldValueEquals($field, $value);
305
    }
306
307
    /**
308
     * For example: I should see product with name "Wine X" in that list.
309
     *
310
     * @Then /^I should see (?:(?!enabled|disabled)[\w\s]+) with ((?:(?![\w\s]+ containing))[\w\s]+) "([^""]*)" in (?:that|the) list$/
311
     */
312
    public function iShouldSeeResourceWithValueInThatList($columnName, $value)
313
    {
314
        $tableNode = new TableNode([
315
            [trim($columnName)],
316
            [trim($value)],
317
        ]);
318
319
        $this->iShouldSeeTheFollowingRow($tableNode);
320
    }
321
322
    /**
323
     * For example: I should not see product with name "Wine X" in that list.
324
     *
325
     * @Then /^I should not see [\w\s]+ with ((?:(?![\w\s]+ containing))[\w\s]+) "([^""]*)" in (?:that|the) list$/
326
     */
327
    public function iShouldNotSeeResourceWithValueInThatList($columnName, $value)
328
    {
329
        $tableNode = new TableNode([
330
            [trim($columnName)],
331
            [trim($value)],
332
        ]);
333
334
        $this->iShouldNotSeeTheFollowingRow($tableNode);
335
    }
336
337
    /**
338
     * For example: I should see product with name containing "Wine X" in that list.
339
     *
340
     * @Then /^I should see (?:(?!enabled|disabled)[\w\s]+) with ([\w\s]+) containing "([^""]*)" in (?:that|the) list$/
341
     */
342
    public function iShouldSeeResourceWithValueContainingInThatList($columnName, $value)
343
    {
344
        $tableNode = new TableNode([
345
            [trim($columnName)],
346
            [trim('%'.$value.'%')],
347
        ]);
348
349
        $this->iShouldSeeTheFollowingRow($tableNode);
350
    }
351
352
    /**
353
     * For example: I should not see product with name containing "Wine X" in that list.
354
     *
355
     * @Then /^I should not see [\w\s]+ with ([\w\s]+) containing "([^""]*)" in (?:that|the) list$/
356
     */
357
    public function iShouldNotSeeResourceWithValueContainingInThatList($columnName, $value)
358
    {
359
        $tableNode = new TableNode([
360
            [trim($columnName)],
361
            [trim('%'.$value.'%')],
362
        ]);
363
364
        $this->iShouldNotSeeTheFollowingRow($tableNode);
365
    }
366
367
    /**
368
     * For example: I should see 10 products in that list.
369
     *
370
     * @Then /^I should see (\d+) ([^""]*) in (?:that|the) list$/
371
     */
372
    public function iShouldSeeThatMuchResourcesInTheList($amount, $type)
373
    {
374
        if (1 === count($this->getSession()->getPage()->findAll('css', 'table'))) {
375
            $this->assertSession()->elementsCount('css', 'table tbody > tr', $amount);
376
        } else {
377
            $this->assertSession()->elementsCount(
378
                'css',
379
                sprintf('table#%s tbody > tr', str_replace(' ', '-', $type)),
380
                $amount
381
            );
382
        }
383
    }
384
385
    /**
386
     * @Then /^I should be logged in$/
387
     */
388
    public function iShouldBeLoggedIn()
389
    {
390
        if (!$this->getAuthorizationChecker()->isGranted('ROLE_USER')) {
391
            throw new AuthenticationException('User is not authenticated.');
392
        }
393
    }
394
395
    /**
396
     * @Then /^I should not be logged in$/
397
     */
398
    public function iShouldNotBeLoggedIn()
399
    {
400
        if ($this->getAuthorizationChecker()->isGranted('ROLE_USER')) {
401
            throw new AuthenticationException('User was not expected to be logged in, but he is.');
402
        }
403
    }
404
405
    /**
406
     * @Given /^I click "([^"]*)" from the confirmation modal$/
407
     */
408
    public function iClickOnConfirmationModal($button)
409
    {
410
        $this->assertSession()->elementExists('css', '#confirmation-modal');
411
412
        $modalContainer = $this->getSession()->getPage()->find('css', '#confirmation-modal');
413
        $primaryButton = $modalContainer->find('css', sprintf('a:contains("%s")', $button));
414
415
        $this->waitForModalToAppear($modalContainer);
416
417
        $primaryButton->press();
418
419
        $this->waitForModalToDisappear($modalContainer);
420
421
        $this->getSession()->wait(100);
422
    }
423
424
    /**
425
     * @Given /^I add following attributes:$/
426
     */
427
    public function iAddFollowingAttributes(TableNode $attributes)
428
    {
429
        $pickedAttributes = [];
430
        foreach ($attributes->getRows() as $attribute) {
431
            $pickedAttributes[] = $attribute[0];
432
        }
433
434
        $this->addAttributes($pickedAttributes);
435
    }
436
437
    /**
438
     * @Given /^I add "([^"]*)" attribute$/
439
     */
440
    public function iAddAttribute($attribute)
441
    {
442
        $this->addAttributes([$attribute]);
443
    }
444
445
    /**
446
     * @param array $attributes
447
     */
448
    private function addAttributes(array $attributes)
449
    {
450
        $this->clickLink('Add');
451
452
        $attributesModalContainer = $this->getSession()->getPage()->find('css', '#attributes-modal');
453
        $addAttributesButton = $attributesModalContainer->find('css', sprintf('button:contains("%s")', 'Add attributes'));
454
455
        $this->getSession()->wait(200);
456
457
        $this->waitForModalToAppear($attributesModalContainer);
458
459
        foreach ($attributes as $attribute) {
460
            $this->getSession()->getPage()->checkField($attribute.' attribute');
461
        }
462
463
        $addAttributesButton->press();
464
465
        $this->waitForModalToDisappear($attributesModalContainer);
466
467
        $this->getSession()->wait(200);
468
    }
469
470
    /**
471
     * @Given /^I choose "([^"]*)" attribute type$/
472
     */
473
    public function iChooseAttributeType($type)
474
    {
475
        $this->assertSession()->elementExists('css', '#attribute-types-modal');
476
477
        $attributeTypesModalContainer = $this->getSession()->getPage()->find('css', '#attribute-types-modal');
478
        $typeButton = $attributeTypesModalContainer->find('css', 'a#'.$type);
479
480
        $this->waitForModalToAppear($attributeTypesModalContainer);
481
482
        $typeButton->press();
483
    }
484
485
    /**
486
     * @Given /^I wait (\d+) (seconds|second)$/
487
     */
488
    public function iWait($time)
489
    {
490
        $this->getSession()->wait($time * 1000);
491
    }
492
493
    /**
494
     * @Then I should have my access denied
495
     */
496
    public function iShouldHaveMyAccessDenied()
497
    {
498
        $this->assertStatusCodeEquals(403);
499
    }
500
501
    /**
502
     * @Then /^I should see enabled [\w\s]+ with ([\w\s]+) "([^""]*)" in (?:that|the) list$/
503
     */
504
    public function iShouldSeeResourceInTheListAsEnabled($columnName, $value)
505
    {
506
        $tableNode = new TableNode([
507
            [trim($columnName), 'Enabled'],
508
            [trim($value), 'YES'],
509
        ]);
510
511
        $this->iShouldSeeTheFollowingRow($tableNode);
512
    }
513
514
    /**
515
     * @Then /^I should see disabled [\w\s]+ with ([\w\s]+) "([^""]*)" in (?:that|the) list$/
516
     */
517
    public function iShouldSeeResourceInTheListAsDisabled($columnName, $value)
518
    {
519
        $tableNode = new TableNode([
520
            [trim($columnName), 'Enabled'],
521
            [trim($value), 'NO'],
522
        ]);
523
524
        $this->iShouldSeeTheFollowingRow($tableNode);
525
    }
526
527
    /**
528
     * @Then /^I should see the following (?:row|rows):$/
529
     */
530
    public function iShouldSeeTheFollowingRow(TableNode $tableNode)
531
    {
532
        $table = $this->assertSession()->elementExists('css', 'table');
533
534
        foreach ($tableNode->getHash() as $fields) {
535
            if (null === $this->getRowWithFields($table, $fields)) {
536
                throw new \Exception('Table with given fields was not found!');
537
            }
538
        }
539
    }
540
541
    /**
542
     * @Then /^I should not see the following (?:row|rows):$/
543
     */
544
    public function iShouldNotSeeTheFollowingRow(TableNode $tableNode)
545
    {
546
        $table = $this->assertSession()->elementExists('css', 'table');
547
548
        foreach ($tableNode->getHash() as $fields) {
549
            if (null !== $this->getRowWithFields($table, $fields)) {
550
                throw new \Exception('Table with given fields was found!');
551
            }
552
        }
553
    }
554
555
    /**
556
     * @Then /^I should see ([\w\s]+) "([^""]*)" as available choice$/
557
     */
558
    public function iShouldSeeSelectWithOption($fieldName, $fieldOption)
559
    {
560
        /** @var NodeElement $select */
561
        $select = $this->assertSession()->fieldExists($fieldName);
562
563
        $selector = sprintf('option:contains("%s")', $fieldOption);
564
        $option = $select->find('css', $selector);
565
566
        if (null === $option) {
567
            throw new \Exception(sprintf('Option "%s" was not found!', $fieldOption));
568
        }
569
    }
570
571
    /**
572
     * @Then /^I should not see ([\w\s]+) "([^""]*)" as available choice$/
573
     */
574
    public function iShouldNotSeeSelectWithOption($fieldName, $fieldOption)
575
    {
576
        /** @var NodeElement $select */
577
        $select = $this->assertSession()->fieldExists(ucfirst($fieldName));
578
579
        $selector = sprintf('option:contains("%s")', $fieldOption);
580
        $option = $select->find('css', $selector);
581
582
        if (null !== $option) {
583
            throw new \Exception(sprintf('Option "%s" was found!', $fieldOption));
584
        }
585
    }
586
587
    /**
588
     * @Then /^I should still be on the (.+) page from ([^""]*) "([^""]*)"/
589
     */
590
    public function iShouldBeOnThePageWithGivenParent($page, $parentType, $parentName)
591
    {
592
        $parent = $this->findOneByName($parentType, $parentName);
593
        $this->assertSession()->addressEquals($this->generatePageUrl($page, [sprintf('%sId', $parentType) => $parent->getId()]));
594
595
        try {
596
            $this->assertStatusCodeEquals(200);
597
        } catch (UnsupportedDriverActionException $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
598
        }
599
    }
600
601
    /**
602
     * @Given /^I am (building|viewing|editing) ([^""]*) "([^""]*)" from ([^""]*) "([^""]*)"$/
603
     */
604
    public function iAmDoingSomethingWithResourceByNameFromGivenCategory($action, $type, $name, $categoryType, $categoryName)
605
    {
606
        $type = str_replace(' ', '_', $type);
607
        $action = str_replace(array_keys($this->actions), array_values($this->actions), $action);
608
609
        $root = $this->findOneByName($categoryType, $categoryName);
610
        $resource = $this->findOneByName($type, $name);
611
612
        $this->getSession()->visit($this->generatePageUrl(
613
            sprintf('%s_%s', $type, $action), ['id' => $resource->getId(), sprintf('%sId', $categoryType) => $root->getId()]
614
        ));
615
    }
616
617
    /**
618
     * @Given /^I am on the zone creation page for type "([^"]*)"$/
619
     */
620
    public function iAmOnTheZoneCreationPageForType($type)
621
    {
622
        $this->getSession()->visit($this->generatePageUrl('zone creation', ['type' => $type]));
623
        $this->iShouldSeeSelectWithOption('Type', ucfirst($type));
624
    }
625
626
    /**
627
     * @Then /^I should be on the zone creation page for type "([^"]*)"$/
628
     * @Then /^I should still be on the zone creation page for type "([^"]*)"$/
629
     */
630
    public function iShouldBeOnTheZoneCreationPageForType($type)
631
    {
632
        $this->assertSession()->addressEquals($this->generatePageUrl('zone creation', ['type' => $type]));
633
634
        try {
635
            $this->assertStatusCodeEquals(200);
636
        } catch (UnsupportedDriverActionException $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
637
        }
638
    }
639
640
    /**
641
     * @Then /^I should see select "([^"]*)" with "([^"]*)" option selected$/
642
     */
643
    public function iShouldSeeSelectWithOptionSelected($fieldName, $fieldOption)
644
    {
645
        $this->assertSession()->fieldExists(ucfirst($fieldName));
646
        $this->assertSession()->fieldValueEquals($fieldName, $fieldOption);
647
    }
648
649
    /**
650
     * Assert that given code equals the current one.
651
     *
652
     * @param int $code
653
     */
654
    protected function assertStatusCodeEquals($code)
655
    {
656
        if ($this->getSession()->getDriver() instanceof Selenium2Driver) {
657
            return;
658
        }
659
660
        $this->assertSession()->statusCodeEquals($code);
661
    }
662
663
    /**
664
     * @param string $name
665
     */
666
    private function iAmOnTheCountryPageByName($name)
667
    {
668
        $countrycode = $this->getCountryCodeByEnglishCountryName($name);
669
670
        $this->iAmOnTheResourcePage('country', 'code', $countrycode);
671
    }
672
673
    /**
674
     * @param string $action
675
     * @param string $name
676
     */
677
    private function iShouldBeDoingSomethingWithCountryByName($action, $name)
678
    {
679
        $countryCode = $this->getCountryCodeByEnglishCountryName($name);
680
681
        $this->iShouldBeDoingSomethingWithResource($action, 'country', 'code', $countryCode);
682
    }
683
684
    /**
685
     * @param string $action
686
     * @param string $name
687
     */
688
    private function iAmDoingSomethingWithCountryByName($action, $name)
689
    {
690
        $countryCode = $this->getCountryCodeByEnglishCountryName($name);
691
692
        $this->iAmDoingSomethingWithResource($action, 'country', 'code', $countryCode);
693
    }
694
695
    /**
696
     * @param string $name
697
     */
698
    private function iShouldBeOnTheCountryPageByName($name)
699
    {
700
        $countryCode = $this->getCountryCodeByEnglishCountryName($name);
701
702
        $this->iShouldBeOnTheResourcePage('country', 'code', $countryCode);
703
    }
704
705
    /**
706
     * @param NodeElement $modalContainer
707
     */
708
    protected function waitForModalToAppear($modalContainer)
709
    {
710
        $this->waitFor(function () use ($modalContainer) {
711
            return false !== strpos($modalContainer->getAttribute('class'), 'in');
712
        });
713
    }
714
715
    /**
716
     * @param NodeElement $modalContainer
717
     */
718
    protected function waitForModalToDisappear($modalContainer)
719
    {
720
        $this->waitFor(function () use ($modalContainer) {
721
            return false === strpos($modalContainer->getAttribute('class'), 'in');
722
        });
723
    }
724
725
    /**
726
     * @Given /^I am on the product attribute creation page with type "([^"]*)"$/
727
     */
728
    public function iAmOnTheProductAttributeCreationPageWithType($type)
729
    {
730
        $this->getSession()->visit($this->generatePageUrl('product attribute creation', ['type' => $type]));
731
        $this->iShouldSeeSelectWithOptionSelected('Type', ucfirst($type));
732
    }
733
734
    /**
735
     * @Given /^I should not be able to edit "([^"]*)" (field|select)$/
736
     */
737
    public function iShouldNotBeAbleToEditSelect($name, $fieldType)
738
    {
739
        $select = $this->assertSession()->fieldExists($name);
740
        if (null === $select->getAttribute('disabled')) {
741
            throw new \Exception(sprintf('"%s" %s should be disabled', $name, $fieldType));
742
        }
743
    }
744
}
745