Completed
Push — master ( 9a2e94...dbda34 )
by Vincent
05:01 queued 12s
created

LinkEqualsConstraint::check()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace VGirol\JsonApiAssert\Constraint;
6
7
use PHPUnit\Framework\Constraint\Constraint;
8
use VGirol\JsonApiAssert\Members;
9
10
/**
11
 * A constraint class to assert that a link object equals an expected value.
12
 */
13
class LinkEqualsConstraint extends Constraint
14
{
15
    /**
16
     * @var array|string|null
17
     */
18
    private $expected;
19
20
    /**
21
     * Class constructor.
22
     *
23
     * @param array|string|null $expected
24
     */
25 48
    public function __construct($expected)
26
    {
27 48
        $this->expected = $expected;
28 48
    }
29
30
    /**
31
     * Returns a string representation of the constraint.
32
     */
33 27
    public function toString(): string
34
    {
35 27
        return \sprintf(
36 27
            'equals %s',
37 27
            $this->exporter()->export($this->expected)
38
        );
39
    }
40
41
    /**
42
     * Evaluates the constraint for parameter $other. Returns true if the
43
     * constraint is met, false otherwise.
44
     *
45
     * @param array|string|null $other value or object to evaluate
46
     */
47 48
    protected function matches($other): bool
48
    {
49 48
        if ($this->expected === null) {
50 6
            return ($other === null);
51
        }
52
53 42
        if ($other === null) {
54 3
            return false;
55
        }
56
57
        /** @var string $href */
58 39
        $href = \is_array($other) && isset($other[Members::LINK_HREF]) ? $other[Members::LINK_HREF] : $other;
59
60
        /** @var string $expectedHref */
61 39
        $expectedHref = \is_array($this->expected) && isset($this->expected[Members::LINK_HREF]) ?
62 39
            $this->expected[Members::LINK_HREF] : $this->expected;
63
64 39
        $linkElms = explode('?', $href);
65 39
        $expectedElms = explode('?', $expectedHref);
66
67 39
        if (count($expectedElms) != count($linkElms)) {
68 6
            return false;
69
        }
70
71 33
        if ($expectedElms[0] != $linkElms[0]) {
72 12
            return false;
73
        }
74
75 21
        if (count($linkElms) == 1) {
76 12
            return true;
77
        }
78
79 9
        $expectedQuery = explode('&', $expectedElms[1]);
80 9
        $linkQuery = explode('&', $linkElms[1]);
81
82 9
        if (count($expectedQuery) != count($linkQuery)) {
83 3
            return false;
84
        }
85
86 6
        $diff = array_diff($expectedQuery, $linkQuery);
87
88 6
        return count($diff) === 0;
89
    }
90
91
    /**
92
     * Evaluates the constraint for parameter $other. Returns true if the
93
     * constraint is met, false otherwise.
94
     *
95
     * @param mixed $other value or object to evaluate
96
     * @return boolean
97
     */
98 6
    public function check($other): bool
99
    {
100 6
        return $this->matches($other);
101
    }
102
}
103