Skip to content

Commit 21d3e1a

Browse files
committed
fixed / resorted tests
1 parent eb5d16f commit 21d3e1a

File tree

4 files changed

+170
-187
lines changed

4 files changed

+170
-187
lines changed

src/Query/Filters/FilterBag.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ private function isValidOperator($operator)
108108

109109
throw_if(
110110
! in_array($operator, $validOperators),
111-
new HandlingException('Invalid operator for FilterBag: '.$operator)
111+
new HandlingException('Invalid operator for FilterBag: '.$operator)
112112
);
113113
}
114114
}

tests/EndpointDatabaseTest.php

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,15 @@
5252
Sorting::propertySort('Birth year', 'descending')
5353
);
5454

55-
$filters
56-
->add(
57-
Filter::rawFilter(
58-
'Known for',
59-
[
60-
'multi_select' => ['contains' => 'UNIVAC'],
61-
]
62-
)
63-
);
55+
$filter = Filter::rawFilter(
56+
'Known for',
57+
[
58+
'multi_select' => ['contains' => 'UNIVAC'],
59+
]
60+
);
6461

6562
$result = Notion::database('8284f3ff77e24d4a939d19459e4d6bdc')
66-
->filterBy($filters)
63+
->filterBy($filter)
6764
->sortBy($sortings)
6865
->limit($limit)
6966
->query();
@@ -98,18 +95,15 @@
9895
// Let's search for something that doesn't exists
9996
$filters = new Collection();
10097

101-
$filters
102-
->add(
103-
Filter::rawFilter(
104-
'Known for',
105-
[
106-
'multi_select' => ['contains' => "something that doesn't exists"],
107-
]
108-
)
109-
);
98+
$filter = Filter::rawFilter(
99+
'Known for',
100+
[
101+
'multi_select' => ['contains' => "something that doesn't exists"],
102+
]
103+
);
110104

111105
$result = Notion::database('8284f3ff77e24d4a939d19459e4d6bdc')
112-
->filterBy($filters)
106+
->filterBy($filter)
113107
->query();
114108

115109
$this->assertInstanceOf(PageCollection::class, $result);

tests/FilterBagTest.php

Lines changed: 154 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,162 @@
5555
$filterBag->addFilterBag($nameFilterBag);
5656
});
5757

58-
it('allows the nesting of multiple FilterBags inside one FilterBag', function () {
59-
// TODO
58+
59+
it('creates a filter bag with the AND operator and two conditions', function () {
60+
$filterBag = new FilterBag(Operators::AND);
61+
62+
# Filter for all entries that are
63+
# (Known for == UNIVAC && Known for == ENIAC)
64+
65+
$filterBag->addFilter(
66+
Filter::rawFilter("Known for", [
67+
"multi_select" => ["contains" => "UNIVAC"],
68+
])
69+
);
70+
71+
$filterBag->addFilter(
72+
Filter::rawFilter("Known for", [
73+
"multi_select" => ["contains" => "ENIAC"],
74+
])
75+
);
76+
77+
$filterBagQuery = $filterBag->toQuery();
78+
$this->assertArrayHasKey(Operators::AND, $filterBagQuery);
79+
$this->assertCount(2, $filterBagQuery[Operators::AND]);
80+
81+
// check structure of first filter compound
82+
$filterQuery = $filterBagQuery[Operators::AND][0];
83+
$this->assertArrayHasKey('property', $filterQuery);
84+
$this->assertEquals('Known for', $filterQuery['property']);
85+
$this->assertArrayHasKey('multi_select', $filterQuery);
86+
$this->assertArrayHasKey('contains', $filterQuery['multi_select']);
87+
$this->assertEquals('UNIVAC', $filterQuery['multi_select']['contains']);
88+
89+
// check structure of second filter compound
90+
$filterQuery = $filterBagQuery[Operators::AND][1];
91+
$this->assertArrayHasKey('property', $filterQuery);
92+
$this->assertEquals('Known for', $filterQuery['property']);
93+
$this->assertArrayHasKey('multi_select', $filterQuery);
94+
$this->assertArrayHasKey('contains', $filterQuery['multi_select']);
95+
$this->assertEquals('ENIAC', $filterQuery['multi_select']['contains']);
6096
});
6197

62-
it('creates the correct query structure for a nested FilterBag', function () {
63-
// TODO
98+
it('creates a filter bag with the OR operator and three conditions', function () {
99+
$filterBag = new FilterBag(Operators::OR);
100+
101+
102+
# Filter for all entries that have
103+
# (Name == Grace || Name == Jean || Name == Ada)
104+
105+
$filterBag
106+
->addFilter(Filter::textFilter("Name", Operators::CONTAINS, "Grace"))
107+
->addFilter(Filter::textFilter("Name", Operators::CONTAINS, "Jean"))
108+
->addFilter(Filter::textFilter("Name", Operators::CONTAINS, "Ada"));
109+
110+
111+
$filterBagQuery = $filterBag->toQuery();
112+
113+
$this->assertArrayHasKey(Operators::OR, $filterBagQuery);
114+
$this->assertCount(3, $filterBagQuery[Operators::OR]);
115+
116+
// check structure of first filter compound
117+
$filterQuery = $filterBagQuery[Operators::OR][0];
118+
$this->assertArrayHasKey('property', $filterQuery);
119+
$this->assertEquals('Name', $filterQuery['property']);
120+
$this->assertArrayHasKey('text', $filterQuery);
121+
$this->assertArrayHasKey('contains', $filterQuery['text']);
122+
$this->assertEquals('Grace', $filterQuery['text']['contains']);
123+
124+
125+
// check value of second filter compound
126+
$filterQuery = $filterBagQuery[Operators::OR][1];
127+
$this->assertEquals('Jean', $filterQuery['text']['contains']);
128+
129+
// check value of third filter compound
130+
$filterQuery = $filterBagQuery[Operators::OR][2];
131+
$this->assertEquals('Ada', $filterQuery['text']['contains']);
132+
64133
});
65134

66-
it('creates the correct query structure for a FilterBag with one level', function () {
67-
// TODO
135+
it('creates a filter bag with with the AND operator and a nested OR condition', function() {
136+
137+
# Filter for all entries that are
138+
# (KnownFor == Univac && (Name == Grace || Name == Jean))
139+
140+
$filterBag = new FilterBag(Operators::AND);
141+
142+
$filterBag->addFilter(
143+
Filter::rawFilter("Known for", [
144+
"multi_select" => ["contains" => "UNIVAC"],
145+
])
146+
);
147+
148+
$nameFilterBag = new FilterBag(Operators::OR);
149+
$nameFilterBag
150+
->addFilter(Filter::textFilter("Name", Operators::CONTAINS, "Grace"))
151+
->addFilter(Filter::textFilter("Name", Operators::CONTAINS, "Jean"));
152+
153+
$filterBag->addFilterBag($nameFilterBag);
154+
155+
$this->assertInstanceOf(FilterBag::class, $filterBag);
156+
$this->assertInstanceOf(FilterBag::class, $nameFilterBag);
157+
158+
$filterBagQuery = $filterBag->toQuery();
159+
160+
$this->assertArrayHasKey(Operators::AND, $filterBagQuery);
161+
162+
// check structure of first AND filter component
163+
$multiSelectFilterQuery = $filterBagQuery[Operators::AND][0];
164+
$this->assertArrayHasKey('property', $multiSelectFilterQuery);
165+
$this->assertEquals('Known for', $multiSelectFilterQuery['property']);
166+
$this->assertArrayHasKey('multi_select', $multiSelectFilterQuery);
167+
$this->assertArrayHasKey('contains', $multiSelectFilterQuery['multi_select']);
168+
$this->assertEquals('UNIVAC', $multiSelectFilterQuery['multi_select']['contains']);
169+
170+
// check structure of second AND filter component, which is another filter bag
171+
// with an OR operator
172+
$nameFilterBagQuery = $filterBagQuery[Operators::AND][1];
173+
$this->assertArrayHasKey(Operators::OR, $nameFilterBagQuery);
174+
$this->assertCount(2, $nameFilterBagQuery[Operators::OR]);
175+
176+
// check structure of the first filter inside the OR filter bag
177+
$filterQuery = $nameFilterBagQuery[Operators::OR][0];
178+
$this->assertArrayHasKey('property', $filterQuery);
179+
$this->assertEquals('Name', $filterQuery['property']);
180+
$this->assertArrayHasKey('text', $filterQuery);
181+
$this->assertArrayHasKey('contains', $filterQuery['text']);
182+
$this->assertEquals('Grace', $filterQuery['text']['contains']);
183+
184+
// check structure of the second filter inside the OR filter bag
185+
$filterQuery = $nameFilterBagQuery[Operators::OR][1];
186+
$this->assertArrayHasKey('property', $filterQuery);
187+
$this->assertEquals('Name', $filterQuery['property']);
188+
$this->assertArrayHasKey('text', $filterQuery);
189+
$this->assertArrayHasKey('contains', $filterQuery['text']);
190+
$this->assertEquals('Jean', $filterQuery['text']['contains']);
191+
});
192+
193+
it('throws an exception for nesting too many filter bags', function() {
194+
195+
$this->expectException(HandlingException::class);
196+
$this->expectExceptionMessage('The maximum nesting level of compound filters must not exceed 2.');
197+
198+
$filterBag = new FilterBag(Operators::AND);
199+
200+
$filterBag->addFilter(
201+
Filter::rawFilter("Known for", [
202+
"multi_select" => ["contains" => "UNIVAC"],
203+
])
204+
);
205+
206+
$nameFilterBag = new FilterBag(Operators::OR);
207+
$nameFilterBag
208+
->addFilter(Filter::textFilter("Name", Operators::CONTAINS, "Grace"))
209+
->addFilter(Filter::textFilter("Name", Operators::CONTAINS, "Jean"));
210+
211+
$anotherBag = new FilterBag();
212+
$nameFilterBag->addFilterBag($anotherBag);
213+
214+
// that's one nested bag too much
215+
$filterBag->addFilterBag($nameFilterBag);
68216
});

0 commit comments

Comments
 (0)