Merge "Skin: Make skins aware of their registered skin name"
[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 protected function tearDown() {
51 global $wgGroupPermissions;
52
53 parent::tearDown();
54
55 if ( $this->oldPatrollersGroup !== null ) {
56 $wgGroupPermissions['patrollers'] = $this->oldPatrollersGroup;
57 }
58 }
59
60 /**
61 * @dataProvider provideParseParameters
62 */
63 public function testParseParameters( $params, $expected ) {
64 $opts = new FormOptions();
65 foreach ( $expected as $key => $value ) {
66 // Register it as null so sets aren't rejected.
67 $opts->add(
68 $key,
69 null,
70 FormOptions::guessType( $expected )
71 );
72 }
73
74 $this->changesListSpecialPage->parseParameters(
75 $params,
76 $opts
77 );
78
79 $this->assertArrayEquals(
80 $expected,
81 $opts->getAllValues(),
82 /** ordered= */ false,
83 /** named= */ true
84 );
85 }
86
87 /**
88 * @dataProvider validateOptionsProvider
89 */
90 public function testValidateOptions( $optionsToSet, $expectedRedirect, $expectedRedirectOptions ) {
91 $redirectQuery = [];
92 $redirected = false;
93 $output = $this->getMockBuilder( OutputPage::class )
94 ->disableProxyingToOriginalMethods()
95 ->disableOriginalConstructor()
96 ->getMock();
97 $output->method( 'redirect' )->willReturnCallback(
98 function ( $url ) use ( &$redirectQuery, &$redirected ) {
99 $urlParts = wfParseUrl( $url );
100 $query = isset( $urlParts[ 'query' ] ) ? $urlParts[ 'query' ] : '';
101 parse_str( $query, $redirectQuery );
102 $redirected = true;
103 }
104 );
105 $ctx = new RequestContext();
106
107 // Give users patrol permissions so we can test that.
108 $user = $this->getTestSysop()->getUser();
109 $ctx->setUser( $user );
110
111 // Disable this hook or it could break changeType
112 // depending on which other extensions are running.
113 $this->setTemporaryHook(
114 'ChangesListSpecialPageStructuredFilters',
115 null
116 );
117
118 $ctx->setOutput( $output );
119 $clsp = $this->changesListSpecialPage;
120 $clsp->setContext( $ctx );
121 $opts = $clsp->getDefaultOptions();
122
123 foreach ( $optionsToSet as $option => $value ) {
124 $opts->setValue( $option, $value );
125 }
126
127 $clsp->validateOptions( $opts );
128
129 $this->assertEquals( $expectedRedirect, $redirected, 'redirection' );
130
131 if ( $expectedRedirect ) {
132 if ( count( $expectedRedirectOptions ) > 0 ) {
133 $expectedRedirectOptions += [
134 'title' => $clsp->getPageTitle()->getPrefixedText(),
135 ];
136 }
137
138 $this->assertArrayEquals(
139 $expectedRedirectOptions,
140 $redirectQuery,
141 /* $ordered= */ false,
142 /* $named= */ true,
143 'redirection query'
144 );
145 }
146 }
147 }