Merge "Clarify -{ => {{ transition"
[lhc/web/wiklou.git] / tests / phpunit / includes / changes / ChangesListStringOptionsFilterGroupTest.php
1 <?php
2
3 use Wikimedia\TestingAccessWrapper;
4
5 /**
6 * @covers ChangesListStringOptionsFilterGroup
7 */
8 class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
9 /**
10 * @expectedException MWException
11 */
12 public function testIsFullCoverage() {
13 $falseGroup = TestingAccessWrapper::newFromObject(
14 new ChangesListStringOptionsFilterGroup( [
15 'name' => 'group',
16 'filters' => [],
17 'isFullCoverage' => false,
18 'queryCallable' => function () {
19 }
20 ] )
21 );
22
23 $this->assertSame(
24 false,
25 $falseGroup->isFullCoverage
26 );
27
28 // Should throw due to missing isFullCoverage
29 $undefinedFullCoverageGroup = new ChangesListStringOptionsFilterGroup( [
30 'name' => 'othergroup',
31 'filters' => [],
32 ] );
33 }
34
35 /**
36 * @param array $filterDefinitions Array of filter definitions
37 * @param array $expectedValues Array of values callback should receive
38 * @param string $input Value in URL
39 *
40 * @dataProvider provideModifyQuery
41 */
42 public function testModifyQuery( $filterDefinitions, $expectedValues, $input ) {
43 $queryCallable = function (
44 $className,
45 $ctx,
46 $dbr,
47 &$tables,
48 &$fields,
49 &$conds,
50 &$query_options,
51 &$join_conds,
52 $actualSelectedValues
53 ) use ( $expectedValues ) {
54 $this->assertSame(
55 $expectedValues,
56 $actualSelectedValues
57 );
58 };
59
60 $groupDefinition = [
61 'name' => 'group',
62 'default' => '',
63 'isFullCoverage' => true,
64 'filters' => $filterDefinitions,
65 'queryCallable' => $queryCallable,
66 ];
67
68 $this->modifyQueryHelper( $groupDefinition, $input );
69 }
70
71 public function provideModifyQuery() {
72 $mixedFilters = [
73 [
74 'name' => 'foo',
75 ],
76 [
77 'name' => 'baz',
78 ],
79 [
80 'name' => 'goo'
81 ],
82 ];
83
84 return [
85 [
86 $mixedFilters,
87 [ 'baz', 'foo', ],
88 'foo;bar;BaZ;invalid',
89 ],
90
91 [
92 $mixedFilters,
93 [ 'baz', 'foo', 'goo' ],
94 'all',
95 ],
96 ];
97 }
98
99 /**
100 * @param array $filterDefinitions Array of filter definitions
101 * @param string $input Value in URL
102 * @param string $message Message thrown by exception
103 *
104 * @dataProvider provideNoOpModifyQuery
105 */
106 public function testNoOpModifyQuery( $filterDefinitions, $input, $message ) {
107 $noFiltersAllowedCallable = function (
108 $className,
109 $ctx,
110 $dbr,
111 &$tables,
112 &$fields,
113 &$conds,
114 &$query_options,
115 &$join_conds,
116 $actualSelectedValues
117 ) use ( $message ) {
118 throw new MWException( $message );
119 };
120
121 $groupDefinition = [
122 'name' => 'group',
123 'default' => '',
124 'isFullCoverage' => true,
125 'filters' => $filterDefinitions,
126 'queryCallable' => $noFiltersAllowedCallable,
127 ];
128
129 $this->modifyQueryHelper( $groupDefinition, $input );
130
131 $this->assertTrue(
132 true,
133 'Test successfully completed without calling queryCallable'
134 );
135 }
136
137 public function provideNoOpModifyQuery() {
138 $noFilters = [];
139
140 $normalFilters = [
141 [
142 'name' => 'foo',
143 ],
144 [
145 'name' => 'bar',
146 ]
147 ];
148
149 return [
150 [
151 $noFilters,
152 'disallowed1;disallowed3',
153 'The queryCallable should not be called if there are no filters',
154 ],
155
156 [
157 $normalFilters,
158 '',
159 'The queryCallable should not be called if no filters are selected',
160 ],
161
162 [
163 $normalFilters,
164 'invalid1',
165 'The queryCallable should not be called if no valid filters are selected',
166 ],
167 ];
168 }
169
170 protected function getSpecialPage() {
171 return $this->getMockBuilder( ChangesListSpecialPage::class )
172 ->setConstructorArgs( [
173 'ChangesListSpecialPage',
174 '',
175 ] )
176 ->getMockForAbstractClass();
177 }
178
179 /**
180 * @param array $groupDefinition Group definition
181 * @param string $input Value in URL
182 */
183 protected function modifyQueryHelper( $groupDefinition, $input ) {
184 $ctx = $this->createMock( IContextSource::class );
185 $dbr = $this->createMock( Wikimedia\Rdbms\IDatabase::class );
186 $tables = $fields = $conds = $query_options = $join_conds = [];
187
188 $group = new ChangesListStringOptionsFilterGroup( $groupDefinition );
189
190 $specialPage = $this->getSpecialPage();
191 $opts = new FormOptions();
192 $opts->add( $groupDefinition[ 'name' ], $input );
193
194 $group->modifyQuery(
195 $dbr,
196 $specialPage,
197 $tables,
198 $fields,
199 $conds,
200 $query_options,
201 $join_conds,
202 $opts,
203 true
204 );
205 }
206
207 public function testGetJsData() {
208 $definition = [
209 'name' => 'some-group',
210 'title' => 'some-group-title',
211 'default' => 'foo',
212 'priority' => 1,
213 'isFullCoverage' => false,
214 'queryCallable' => function () {
215 },
216 'filters' => [
217 [
218 'name' => 'foo',
219 'label' => 'foo-label',
220 'description' => 'foo-description',
221 'priority' => 2,
222 ],
223 [
224 'name' => 'bar',
225 'label' => 'bar-label',
226 'description' => 'bar-description',
227 'priority' => 4,
228 ]
229 ],
230 ];
231
232 $group = new ChangesListStringOptionsFilterGroup( $definition );
233
234 $this->assertArrayEquals(
235 [
236 'name' => 'some-group',
237 'title' => 'some-group-title',
238 'type' => ChangesListStringOptionsFilterGroup::TYPE,
239 'default' => 'foo',
240 'priority' => 1,
241 'fullCoverage' => false,
242 'filters' => [
243 [
244 'name' => 'bar',
245 'label' => 'bar-label',
246 'description' => 'bar-description',
247 'priority' => 4,
248 'cssClass' => null,
249 'conflicts' => [],
250 'subset' => [],
251 'defaultHighlightColor' => null,
252 ],
253 [
254 'name' => 'foo',
255 'label' => 'foo-label',
256 'description' => 'foo-description',
257 'priority' => 2,
258 'cssClass' => null,
259 'conflicts' => [],
260 'subset' => [],
261 'defaultHighlightColor' => null,
262 ],
263 ],
264 'conflicts' => [],
265 'separator' => ';',
266 'messageKeys' => [
267 'some-group-title',
268 'bar-label',
269 'bar-description',
270 'foo-label',
271 'foo-description',
272 ],
273 ],
274 $group->getJsData(),
275 /** ordered= */ false,
276 /** named= */ true
277 );
278 }
279 }