tests: Add helper function for ini_set with automatic cleanup
[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 // Deprecated
36 $this->setTemporaryHook(
37 'ChangesListSpecialPageFilters',
38 null
39 );
40
41 # setup the ChangesListSpecialPage (or subclass) object
42 $this->changesListSpecialPage = $this->getPage();
43 $context = $this->changesListSpecialPage->getContext();
44 $context = new DerivativeContext( $context );
45 $context->setUser( $this->getTestUser( [ 'patrollers' ] )->getUser() );
46 $this->changesListSpecialPage->setContext( $context );
47 $this->changesListSpecialPage->registerFilters();
48 }
49
50 abstract protected function getPage();
51
52 protected function tearDown() {
53 global $wgGroupPermissions;
54
55 parent::tearDown();
56
57 if ( $this->oldPatrollersGroup !== null ) {
58 $wgGroupPermissions['patrollers'] = $this->oldPatrollersGroup;
59 }
60 }
61
62 abstract public function provideParseParameters();
63
64 /**
65 * @dataProvider provideParseParameters
66 */
67 public function testParseParameters( $params, $expected ) {
68 $opts = new FormOptions();
69 foreach ( $expected as $key => $value ) {
70 // Register it as null so sets aren't rejected.
71 $opts->add(
72 $key,
73 null,
74 FormOptions::guessType( $expected )
75 );
76 }
77
78 $this->changesListSpecialPage->parseParameters(
79 $params,
80 $opts
81 );
82
83 $this->assertArrayEquals(
84 $expected,
85 $opts->getAllValues(),
86 /** ordered= */ false,
87 /** named= */ true
88 );
89 }
90
91 /**
92 * @dataProvider validateOptionsProvider
93 */
94 public function testValidateOptions(
95 $optionsToSet,
96 $expectedRedirect,
97 $expectedRedirectOptions,
98 $rcfilters
99 ) {
100 $redirectQuery = [];
101 $redirected = false;
102 $output = $this->getMockBuilder( OutputPage::class )
103 ->disableProxyingToOriginalMethods()
104 ->disableOriginalConstructor()
105 ->getMock();
106 $output->method( 'redirect' )->willReturnCallback(
107 function ( $url ) use ( &$redirectQuery, &$redirected ) {
108 $urlParts = wfParseUrl( $url );
109 $query = $urlParts[ 'query' ] ?? '';
110 parse_str( $query, $redirectQuery );
111 $redirected = true;
112 }
113 );
114 $ctx = new RequestContext();
115
116 // Give users patrol permissions so we can test that.
117 $user = $this->getTestSysop()->getUser();
118 $user->setOption( 'rcenhancedfilters-disable', $rcfilters ? 0 : 1 );
119 $ctx->setUser( $user );
120
121 // Disable this hook or it could break changeType
122 // depending on which other extensions are running.
123 $this->setTemporaryHook(
124 'ChangesListSpecialPageStructuredFilters',
125 null
126 );
127
128 $ctx->setOutput( $output );
129 $clsp = $this->changesListSpecialPage;
130 $clsp->setContext( $ctx );
131 $opts = $clsp->getDefaultOptions();
132
133 foreach ( $optionsToSet as $option => $value ) {
134 $opts->setValue( $option, $value );
135 }
136
137 $clsp->validateOptions( $opts );
138
139 $this->assertEquals( $expectedRedirect, $redirected, 'redirection' );
140
141 if ( $expectedRedirect ) {
142 if ( count( $expectedRedirectOptions ) > 0 ) {
143 $expectedRedirectOptions += [
144 'title' => $clsp->getPageTitle()->getPrefixedText(),
145 ];
146 }
147
148 $this->assertArrayEquals(
149 $expectedRedirectOptions,
150 $redirectQuery,
151 /* $ordered= */ false,
152 /* $named= */ true,
153 'redirection query'
154 );
155 }
156 }
157 }