Skip to content

Commit a7cfa85

Browse files
committed
Add some test coverage for filter builder
1 parent 8267d7b commit a7cfa85

File tree

2 files changed

+206
-1
lines changed

2 files changed

+206
-1
lines changed

src/Scopes/FilterBuilder.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ public function apply($query, $values)
2424
$variables = $filter['values']['variables'];
2525

2626
$field = $fields[$handle];
27-
$json = in_array($field->type(), ['entries', 'terms', 'users']) && $field->get('max_items', 0) !== 1;
27+
28+
$json = $field->isRelationship() && $field->get('max_items', 0) !== 1;
2829

2930
$cascade = Cascade::toArray();
3031
foreach ($variables as $variable) {
3132
if (! $parsed = VariableParser::parse($variable, $cascade)) {
3233
continue;
3334
}
35+
3436
$values = array_merge($values, $parsed);
3537
}
3638

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
<?php
2+
3+
use Statamic\Facades;
4+
5+
uses(Tests\TestCase::class);
6+
7+
beforeEach(function () {
8+
app('statamic.scopes')->put('filter_builder', 'Tv2regionerne\\StatamicFilterBuilder\\Scopes\\FilterBuilder');
9+
10+
$collection = tap(Facades\Collection::make()
11+
->handle('pages'))
12+
->save();
13+
14+
$collection->entryBlueprints()->first()->setContents([
15+
'fields' => [
16+
[
17+
'handle' => 'title',
18+
'field' => [
19+
'type' => 'text',
20+
],
21+
],
22+
[
23+
'handle' => 'entries',
24+
'field' => [
25+
'type' => 'entries',
26+
'max_items' => 5,
27+
],
28+
],
29+
],
30+
])->save();
31+
32+
Facades\Entry::make()
33+
->id('one')
34+
->collection('pages')
35+
->merge([
36+
'title' => 'One',
37+
'entries' => ['One'],
38+
])
39+
->save();
40+
41+
Facades\Entry::make()
42+
->id('two')
43+
->collection('pages')
44+
->merge([
45+
'title' => 'Two',
46+
'entries' => ['One', 'Two'],
47+
])
48+
->save();
49+
50+
Facades\Entry::make()
51+
->id('three')
52+
->collection('pages')
53+
->merge([
54+
'title' => 'Three',
55+
'entries' => ['One', 'Two', 'Three'],
56+
])
57+
->save();
58+
});
59+
60+
it('filters text fields', function () {
61+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
62+
'params' => [
63+
[
64+
'handle' => 'title',
65+
'values' => [
66+
'operator' => '=',
67+
'values' => ['one'],
68+
'variables' => [],
69+
],
70+
],
71+
],
72+
]);
73+
74+
$this->assertSame('One', $result);
75+
76+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
77+
'params' => [
78+
[
79+
'handle' => 'title',
80+
'values' => [
81+
'operator' => '<>',
82+
'values' => ['one'],
83+
'variables' => [],
84+
],
85+
],
86+
],
87+
]);
88+
89+
$this->assertSame('ThreeTwo', $result);
90+
91+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
92+
'params' => [
93+
[
94+
'handle' => 'title',
95+
'values' => [
96+
'operator' => '=',
97+
'values' => ['one', 'two'],
98+
'variables' => [],
99+
],
100+
],
101+
],
102+
]);
103+
104+
$this->assertSame('OneTwo', $result);
105+
106+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
107+
'params' => [
108+
[
109+
'handle' => 'title',
110+
'values' => [
111+
'operator' => '=',
112+
'values' => ['four'],
113+
'variables' => [],
114+
],
115+
],
116+
],
117+
]);
118+
119+
$this->assertSame('', $result);
120+
});
121+
122+
it('filters fields with values from the cascade', function () {
123+
Facades\Cascade::set('cascade_variable', 'one');
124+
125+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
126+
'params' => [
127+
[
128+
'handle' => 'title',
129+
'values' => [
130+
'operator' => '=',
131+
'values' => [],
132+
'variables' => ['{{ cascade_variable }}'],
133+
],
134+
],
135+
],
136+
]);
137+
138+
$this->assertSame('One', $result);
139+
});
140+
141+
it('filters relationship fields', function () {
142+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
143+
'params' => [
144+
[
145+
'handle' => 'entries',
146+
'values' => [
147+
'operator' => '=',
148+
'values' => ['Three'],
149+
'variables' => [],
150+
],
151+
],
152+
],
153+
]);
154+
155+
//dd(Facades\Entry::query()->whereJsonContains('entries', ['One'])->get());
156+
157+
$this->assertSame('Three', $result);
158+
159+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
160+
'params' => [
161+
[
162+
'handle' => 'entries',
163+
'values' => [
164+
'operator' => '<>',
165+
'values' => ['Three'],
166+
'variables' => [],
167+
],
168+
],
169+
],
170+
]);
171+
172+
$this->assertSame('OneTwo', $result);
173+
174+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
175+
'params' => [
176+
[
177+
'handle' => 'entries',
178+
'values' => [
179+
'operator' => '=',
180+
'values' => ['Three', 'Two'],
181+
'variables' => [],
182+
],
183+
],
184+
],
185+
]);
186+
187+
$this->assertSame('ThreeTwo', $result);
188+
189+
$result = (string) Facades\Antlers::parse('{{ collection:pages :filter_builder="params" }}{{ title }}{{ /collection:pages }}', [
190+
'params' => [
191+
[
192+
'handle' => 'title',
193+
'values' => [
194+
'operator' => '=',
195+
'values' => ['Four'],
196+
'variables' => [],
197+
],
198+
],
199+
],
200+
]);
201+
202+
$this->assertSame('', $result);
203+
});

0 commit comments

Comments
 (0)