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