3 use Wikimedia\TestingAccessWrapper
;
6 * @covers ChangesListStringOptionsFilterGroup
8 class ChangesListStringOptionsFilterGroupTest
extends MediaWikiTestCase
{
10 * @expectedException MWException
12 public function testIsFullCoverage() {
13 $falseGroup = TestingAccessWrapper
::newFromObject(
14 new ChangesListStringOptionsFilterGroup( [
17 'isFullCoverage' => false,
18 'queryCallable' => function () {
25 $falseGroup->isFullCoverage
28 // Should throw due to missing isFullCoverage
29 $undefinedFullCoverageGroup = new ChangesListStringOptionsFilterGroup( [
30 'name' => 'othergroup',
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
40 * @dataProvider provideModifyQuery
42 public function testModifyQuery( $filterDefinitions, $expectedValues, $input ) {
45 $queryCallable = function (
55 ) use ( $self, $expectedValues ) {
65 'isFullCoverage' => true,
66 'filters' => $filterDefinitions,
67 'queryCallable' => $queryCallable,
70 $this->modifyQueryHelper( $groupDefinition, $input );
73 public function provideModifyQuery() {
90 'foo;bar;BaZ;invalid',
95 [ 'baz', 'foo', 'goo' ],
102 * @param array $filterDefinitions Array of filter definitions
103 * @param string $input Value in URL
104 * @param string $message Message thrown by exception
106 * @dataProvider provideNoOpModifyQuery
108 public function testNoOpModifyQuery( $filterDefinitions, $input, $message ) {
109 $noFiltersAllowedCallable = function (
118 $actualSelectedValues
120 throw new MWException( $message );
126 'isFullCoverage' => true,
127 'filters' => $filterDefinitions,
128 'queryCallable' => $noFiltersAllowedCallable,
131 $this->modifyQueryHelper( $groupDefinition, $input );
135 'Test successfully completed without calling queryCallable'
139 public function provideNoOpModifyQuery() {
154 'disallowed1;disallowed3',
155 'The queryCallable should not be called if there are no filters',
161 'The queryCallable should not be called if no filters are selected',
167 'The queryCallable should not be called if no valid filters are selected',
172 protected function getSpecialPage() {
173 return $this->getMockBuilder( 'ChangesListSpecialPage' )
174 ->setConstructorArgs( [
175 'ChangesListSpecialPage',
178 ->getMockForAbstractClass();
182 * @param array $groupDefinition Group definition
183 * @param string $input Value in URL
185 * @dataProvider provideModifyQuery
187 protected function modifyQueryHelper( $groupDefinition, $input ) {
188 $ctx = $this->createMock( 'IContextSource' );
189 $dbr = $this->createMock( 'IDatabase' );
190 $tables = $fields = $conds = $query_options = $join_conds = [];
192 $group = new ChangesListStringOptionsFilterGroup( $groupDefinition );
194 $specialPage = $this->getSpecialPage();
208 public function testGetJsData() {
210 'name' => 'some-group',
211 'title' => 'some-group-title',
214 'isFullCoverage' => false,
215 'queryCallable' => function () {
220 'label' => 'foo-label',
221 'description' => 'foo-description',
226 'label' => 'bar-label',
227 'description' => 'bar-description',
233 $group = new ChangesListStringOptionsFilterGroup( $definition );
235 $this->assertArrayEquals(
237 'name' => 'some-group',
238 'title' => 'some-group-title',
239 'type' => ChangesListStringOptionsFilterGroup
::TYPE
,
242 'fullCoverage' => false,
246 'label' => 'bar-label',
247 'description' => 'bar-description',
255 'label' => 'foo-label',
256 'description' => 'foo-description',
274 /** ordered= */ false,