Merge "rdbms: deprecate LoadBalancer::haveIndex() and LoadBalancer::isNonZeroLoad()"
[lhc/web/wiklou.git] / tests / phpunit / includes / specialpage / AbstractChangesListSpecialPageTestCase.php
1 <?php
2
3 /**
4 * Abstract base class for shared logic when testing ChangesListSpecialPage
5 * and subclasses
6 *
7 * @group Database
8 */
9 abstract class AbstractChangesListSpecialPageTestCase extends MediaWikiTestCase {
10 // Must be initialized by subclass
11 /**
12 * @var ChangesListSpecialPage
13 */
14 protected $changesListSpecialPage;
15
16 protected $oldPatrollersGroup;
17
18 protected function setUp() {
19 global $wgGroupPermissions;
20
21 parent::setUp();
22 $this->setMwGlobals( [
23 'wgRCWatchCategoryMembership' => true,
24 'wgUseRCPatrol' => true,
25 ] );
26
27 if ( isset( $wgGroupPermissions['patrollers'] ) ) {
28 $this->oldPatrollersGroup = $wgGroupPermissions['patrollers'];
29 }
30
31 $wgGroupPermissions['patrollers'] = [
32 'patrol' => true,
33 ];
34
35 # setup the ChangesListSpecialPage (or subclass) object
36 $this->changesListSpecialPage = $this->getPage();
37 $context = $this->changesListSpecialPage->getContext();
38 $context = new DerivativeContext( $context );
39 $context->setUser( $this->getTestUser( [ 'patrollers' ] )->getUser() );
40 $this->changesListSpecialPage->setContext( $context );
41 $this->changesListSpecialPage->registerFilters();
42 }
43
44 abstract protected function getPage();
45
46 protected function tearDown() {
47 global $wgGroupPermissions;
48
49 parent::tearDown();
50
51 if ( $this->oldPatrollersGroup !== null ) {
52 $wgGroupPermissions['patrollers'] = $this->oldPatrollersGroup;
53 }
54 }
55
56 abstract public function provideParseParameters();
57
58 /**
59 * @dataProvider provideParseParameters
60 */
61 public function testParseParameters( $params, $expected ) {
62 $opts = new FormOptions();
63 foreach ( $expected as $key => $value ) {
64 // Register it as null so sets aren't rejected.
65 $opts->add(
66 $key,
67 null,
68 FormOptions::guessType( $expected )
69 );
70 }
71
72 $this->changesListSpecialPage->parseParameters(
73 $params,
74 $opts
75 );
76
77 $this->assertArrayEquals(
78 $expected,
79 $opts->getAllValues(),
80 /** ordered= */ false,
81 /** named= */ true
82 );
83 }
84
85 /**
86 * @dataProvider validateOptionsProvider
87 */
88 public function testValidateOptions(
89 $optionsToSet,
90 $expectedRedirect,
91 $expectedRedirectOptions,
92 $rcfilters
93 ) {
94 $redirectQuery = [];
95 $redirected = false;
96 $output = $this->getMockBuilder( OutputPage::class )
97 ->disableProxyingToOriginalMethods()
98 ->disableOriginalConstructor()
99 ->getMock();
100 $output->method( 'redirect' )->willReturnCallback(
101 function ( $url ) use ( &$redirectQuery, &$redirected ) {
102 $urlParts = wfParseUrl( $url );
103 $query = $urlParts[ 'query' ] ?? '';
104 parse_str( $query, $redirectQuery );
105 $redirected = true;
106 }
107 );
108 $ctx = new RequestContext();
109
110 // Give users patrol permissions so we can test that.
111 $user = $this->getTestSysop()->getUser();
112 $user->setOption( 'rcenhancedfilters-disable', $rcfilters ? 0 : 1 );
113 $ctx->setUser( $user );
114
115 // Disable this hook or it could break changeType
116 // depending on which other extensions are running.
117 $this->setTemporaryHook(
118 'ChangesListSpecialPageStructuredFilters',
119 null
120 );
121
122 $ctx->setOutput( $output );
123 $clsp = $this->changesListSpecialPage;
124 $clsp->setContext( $ctx );
125 $opts = $clsp->getDefaultOptions();
126
127 foreach ( $optionsToSet as $option => $value ) {
128 $opts->setValue( $option, $value );
129 }
130
131 $clsp->validateOptions( $opts );
132
133 $this->assertEquals( $expectedRedirect, $redirected, 'redirection' );
134
135 if ( $expectedRedirect ) {
136 if ( count( $expectedRedirectOptions ) > 0 ) {
137 $expectedRedirectOptions += [
138 'title' => $clsp->getPageTitle()->getPrefixedText(),
139 ];
140 }
141
142 $this->assertArrayEquals(
143 $expectedRedirectOptions,
144 $redirectQuery,
145 /* $ordered= */ false,
146 /* $named= */ true,
147 'redirection query'
148 );
149 }
150 }
151 }