4 * @covers ChangesListStringOptionsFilterGroup
6 class ChangesListStringOptionsFilterGroupTest
extends MediaWikiTestCase
{
8 * @expectedException MWException
10 public function testIsFullCoverage() {
11 $falseGroup = TestingAccessWrapper
::newFromObject(
12 new ChangesListStringOptionsFilterGroup( [
15 'isFullCoverage' => false,
16 'queryCallable' => function () {
23 $falseGroup->isFullCoverage
26 // Should throw due to missing isFullCoverage
27 $undefinedFullCoverageGroup = new ChangesListStringOptionsFilterGroup( [
28 'name' => 'othergroup',
34 * @param array $filterDefinitions Array of filter definitions
35 * @param array $expectedValues Array of values callback should receive
36 * @param string $input Value in URL
38 * @dataProvider provideModifyQuery
40 public function testModifyQuery( $filterDefinitions, $expectedValues, $input ) {
43 $queryCallable = function (
53 ) use ( $self, $expectedValues ) {
63 'isFullCoverage' => true,
64 'filters' => $filterDefinitions,
65 'queryCallable' => $queryCallable,
68 $this->modifyQueryHelper( $groupDefinition, $input );
71 public function provideModifyQuery() {
78 'isAllowedCallable' => function () {
94 'foo;bar;BaZ;invalid',
99 [ 'baz', 'foo', 'goo' ],
106 * @param array $filterDefinitions Array of filter definitions
107 * @param string $input Value in URL
108 * @param string $message Message thrown by exception
110 * @dataProvider provideNoOpModifyQuery
112 public function testNoOpModifyQuery( $filterDefinitions, $input, $message ) {
113 $noFiltersAllowedCallable = function (
122 $actualSelectedValues
124 throw new MWException( $message );
130 'isFullCoverage' => true,
131 'filters' => $filterDefinitions,
132 'queryCallable' => $noFiltersAllowedCallable,
135 $this->modifyQueryHelper( $groupDefinition, $input );
139 'Test successfully completed without calling queryCallable'
143 public function provideNoOpModifyQuery() {
145 'isAllowedCallable' => function () {
150 $allDisallowedFilters = [
152 'name' => 'disallowed1',
156 'name' => 'disallowed2',
160 'name' => 'disallowed3',
175 $allDisallowedFilters,
176 'disallowed1;disallowed3',
177 'The queryCallable should not be called if no filters are allowed',
183 'The queryCallable should not be called if no filters are selected',
189 'The queryCallable should not be called if no valid filters are selected',
194 protected function getSpecialPage() {
195 return $this->getMockBuilder( 'ChangesListSpecialPage' )
196 ->setConstructorArgs( [
197 'ChangesListSpecialPage',
200 ->getMockForAbstractClass();
204 * @param array $groupDefinition Group definition
205 * @param string $input Value in URL
207 * @dataProvider provideModifyQuery
209 protected function modifyQueryHelper( $groupDefinition, $input ) {
210 $ctx = $this->getMock( 'IContextSource' );
211 $dbr = $this->getMock( 'IDatabase' );
212 $tables = $fields = $conds = $query_options = $join_conds = [];
214 $group = new ChangesListStringOptionsFilterGroup( $groupDefinition );
216 $specialPage = $this->getSpecialPage();
230 public function testGetJsData() {
232 'name' => 'some-group',
233 'title' => 'some-group-title',
236 'isFullCoverage' => false,
237 'queryCallable' => function () {
242 'label' => 'foo-label',
243 'description' => 'foo-description',
248 'label' => 'bar-label',
249 'description' => 'bar-description',
255 $group = new ChangesListStringOptionsFilterGroup( $definition );
257 $specialPage = $this->getSpecialPage();
259 $this->assertArrayEquals(
261 'name' => 'some-group',
262 'title' => 'some-group-title',
263 'type' => ChangesListStringOptionsFilterGroup
::TYPE
,
266 'fullCoverage' => false,
270 'label' => 'bar-label',
271 'description' => 'bar-description',
279 'label' => 'foo-label',
280 'description' => 'foo-description',
297 $group->getJsData( $specialPage ),
298 /** ordered= */ false,