Completed
Push — theme/path-package ( f6cab5 )
by Kamil
36:15 queued 13:21
created

FiltersCriteriaResolverSpec::getMatchers()   C

Complexity

Conditions 7
Paths 1

Size

Total Lines 26
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 26
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 13
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 spec\Sylius\Component\Grid\Filtering;
13
14
use PhpSpec\ObjectBehavior;
15
use Sylius\Component\Grid\Definition\Filter;
16
use Sylius\Component\Grid\Definition\Grid;
17
use Sylius\Component\Grid\Filtering\FiltersCriteriaResolver;
18
use Sylius\Component\Grid\Filtering\FiltersCriteriaResolverInterface;
19
use Sylius\Component\Grid\Parameters;
20
21
/**
22
 * @author Jan Góralski <[email protected]>
23
 */
24
final class FiltersCriteriaResolverSpec extends ObjectBehavior
25
{
26
    function it_is_initializable()
27
    {
28
        $this->shouldHaveType(FiltersCriteriaResolver::class);
29
    }
30
31
    function it_implements_filters_criteria_resolver_interface()
32
    {
33
        $this->shouldImplement(FiltersCriteriaResolverInterface::class);
34
    }
35
36
    function it_checks_whether_any_criteria_are_available(Grid $grid, Filter $filter)
37
    {
38
        $emptyParameters = new Parameters();
39
        $criteriaParameters = new Parameters(['criteria' => ['czapla']]);
40
41
        $grid->getFilters()->willReturn([]);
42
43
        $this->hasCriteria($grid, $emptyParameters)->shouldReturn(false);
44
45
        $grid->getFilters()->willReturn([]);
46
47
        $this->hasCriteria($grid, $criteriaParameters)->shouldReturn(true);
48
49
        $grid->getFilters()->willReturn([$filter]);
50
51
        $this->hasCriteria($grid, $emptyParameters)->shouldReturn(false);
52
53
        $grid->getFilters()->willReturn([$filter]);
54
55
        $this->hasCriteria($grid, $criteriaParameters)->shouldReturn(true);
56
57
        $grid->getFilters()->willReturn([$filter]);
58
        $filter->getCriteria()->willReturn('czapla');
59
60
        $this->hasCriteria($grid, $emptyParameters)->shouldReturn(true);
61
62
        $grid->getFilters()->willReturn([$filter]);
63
        $filter->getCriteria()->willReturn('czapla');
64
65
        $this->hasCriteria($grid, $criteriaParameters)->shouldReturn(true);
66
    }
67
68
    function it_gets_default_criteria_from_grid_filters(Grid $grid, Filter $firstFilter, Filter $secondFilter)
69
    {
70
        $startDate = new \DateTime();
71
        $endDate = new \DateTime();
72
73
        $firstFilter->getCriteria()->willReturn('Pug');
74
        $secondFilter->getCriteria()->willReturn(['start' => $startDate, 'end' => $endDate]);
75
76
        $grid->getFilters()->willReturn(['favourite' => $firstFilter, 'date' => $secondFilter]);
77
78
        $this->getCriteria($grid, new Parameters())->shouldBeSameAs([
79
            'favourite' => 'Pug',
80
            'date' => ['start' => $startDate, 'end' => $endDate],
81
        ]);
82
    }
83
84
    function it_gets_criteria_from_parameters(Grid $grid, Filter $firstFilter, Filter $secondFilter)
85
    {
86
        $startDate = new \DateTime();
87
        $endDate = new \DateTime();
88
89
        $firstFilter->getCriteria()->willReturn(null);
90
        $secondFilter->getCriteria()->willReturn(null);
91
92
        $grid->getFilters()->willReturn(['favourite' => $firstFilter, 'date' => $secondFilter]);
93
94
        $parameters = new Parameters([
95
            'criteria' => [
96
                'favourite' => 'Pug',
97
                'date' => ['start' => $startDate, 'end' => $endDate],
98
            ]
99
        ]);
100
101
        $this->getCriteria($grid, $parameters)->shouldBeSameAs([
102
            'favourite' => 'Pug',
103
            'date' => ['start' => $startDate, 'end' => $endDate],
104
        ]);
105
    }
106
107
    function it_prioritizes_parameters_criteria_over_filters_default(
108
        Grid $grid,
109
        Filter $firstFilter,
110
        Filter $secondFilter
111
    ) {
112
        $parametersDate = new \DateTime();
113
114
        $firstFilter->getCriteria()->willReturn('Rum');
115
        $secondFilter->getCriteria()->willReturn(null);
116
117
        $grid->getFilters()->willReturn(['favourite' => $firstFilter, 'date' => $secondFilter]);
118
119
        $parameters = new Parameters([
120
            'criteria' => [
121
                'favourite' => 'Pug',
122
                'date' => ['now' => $parametersDate],
123
            ]
124
        ]);
125
126
        $this->getCriteria($grid, $parameters)->shouldBeSameAs([
127
            'favourite' => 'Pug',
128
            'date' => ['now' => $parametersDate],
129
        ]);
130
    }
131
132
    /**
133
     * {@inheritdoc}
134
     */
135
    public function getMatchers()
136
    {
137
        return [
138
            'beSameAs' => function ($subject, $key) {
139
                if (!is_array($subject) || !is_array($key)) {
140
                    return false;
141
                }
142
143
                if (count($subject) !== count($key)) {
144
                    return false;
145
                }
146
147
                if (0 !== count(array_diff_key($key, $subject))) {
148
                    return false;
149
                }
150
151
                foreach (array_keys($key) as $arrayKey) {
152
                    if ($key[$arrayKey] !== $subject[$arrayKey]) {
153
                        return false;
154
                    }
155
                }
156
157
                return true;
158
            },
159
        ];
160
    }
161
}
162