Completed
Pull Request — 1.0.x (#15)
by Otar
01:54
created

RedirectContext   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 1
Bugs 0 Features 1
Metric Value
wmc 4
c 1
b 0
f 1
lcom 1
cbo 4
dl 0
loc 53
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A disableFollowRedirects() 0 6 1
A resetFollowRedirect() 0 9 2
A thenIamRedirectedTo() 0 7 1
1
<?php
2
3
namespace NuvoleWeb\Drupal\DrupalExtension\Context;
4
5
use Behat\MinkExtension\Context\RawMinkContext;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, NuvoleWeb\Drupal\DrupalE...\Context\RawMinkContext.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
6
use Behat\Behat\Context\SnippetAcceptingContext;
7
use function bovigo\assert\assert;
8
use function bovigo\assert\predicate\hasKey;
9
use function bovigo\assert\predicate\equals;
10
11
/**
12
 * Class RedirectContext.
13
 *
14
 * Contains step definitions that helps testing redirection.
15
 *
16
 * @package NuvoleWeb\Drupal\DrupalExtension\Context
17
 */
18
class RedirectContext extends RawMinkContext implements SnippetAcceptingContext {
19
20
  /**
21
   * Store follow redirect configuration.
22
   *
23
   * @var null
24
   */
25
  private $followRedirect = NULL;
26
27
  /**
28
   * Do not follow redirects.
29
   *
30
   * @When /^I do not follow redirects$/
31
   */
32
  public function disableFollowRedirects() {
33
    /* @var \Behat\Mink\Driver\GoutteDriver $driver */
34
    $driver = $this->getSession()->getDriver();
35
    $this->followRedirect = $driver->getClient()->isFollowingRedirects();
36
    $driver->getClient()->followRedirects(FALSE);
37
  }
38
39
  /**
40
   * Reset follow redirect to its original value.
41
   *
42
   * @AfterScenario
43
   */
44
  public function resetFollowRedirect() {
45
    if ($this->followRedirect !== NULL) {
46
      /* @var \Behat\Mink\Driver\GoutteDriver $driver */
47
      $driver = $this->getSession()->getDriver();
48
      $driver->getClient()->followRedirects($this->followRedirect);
0 ignored issues
show
Documentation introduced by
$this->followRedirect is of type null, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
49
    }
50
51
    $this->followRedirect = NULL;
52
  }
53
54
  /**
55
   * Checks if I am redirected to $actualPath.
56
   *
57
   * @param string $actualPath
58
   *   Path to be redirected to.
59
   *
60
   * @Then /^I (?:am|should be) redirected to "([^"]*)"$/
61
   */
62
  public function thenIamRedirectedTo($actualPath) {
63
    $headers = $this->getSession()->getResponseHeaders();
64
    assert($headers['Location'], hasKey(0));
65
66
    $redirectComponents = parse_url($headers['Location'][0]);
67
    assert($redirectComponents['path'], equals($actualPath));
68
  }
69
70
}
71