X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/d57edfddd6c01f0ed6b1a84019649cdf6cddd5f8..83d871ca0d985c6d586b323bf96161afb510ebf6:/tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php diff --git a/tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php b/tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php new file mode 100644 index 00000000..b101857e --- /dev/null +++ b/tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php @@ -0,0 +1,144 @@ +setMwGlobals( 'wgRCWatchCategoryMembership', true ); + + if ( isset( $wgGroupPermissions['patrollers'] ) ) { + $this->oldPatrollersGroup = $wgGroupPermissions['patrollers']; + } + + $wgGroupPermissions['patrollers'] = [ + 'patrol' => true, + ]; + + // Deprecated + $this->setTemporaryHook( + 'ChangesListSpecialPageFilters', + null + ); + + # setup the ChangesListSpecialPage (or subclass) object + $this->changesListSpecialPage = $this->getPage(); + $context = $this->changesListSpecialPage->getContext(); + $context = new DerivativeContext( $context ); + $context->setUser( $this->getTestUser( [ 'patrollers' ] )->getUser() ); + $this->changesListSpecialPage->setContext( $context ); + $this->changesListSpecialPage->registerFilters(); + } + + protected function tearDown() { + global $wgGroupPermissions; + + parent::tearDown(); + + if ( $this->oldPatrollersGroup !== null ) { + $wgGroupPermissions['patrollers'] = $this->oldPatrollersGroup; + } + } + + /** + * @dataProvider provideParseParameters + */ + public function testParseParameters( $params, $expected ) { + $opts = new FormOptions(); + foreach ( $expected as $key => $value ) { + // Register it as null so sets aren't rejected. + $opts->add( + $key, + null, + FormOptions::guessType( $expected ) + ); + } + + $this->changesListSpecialPage->parseParameters( + $params, + $opts + ); + + $this->assertArrayEquals( + $expected, + $opts->getAllValues(), + /** ordered= */ false, + /** named= */ true + ); + } + + /** + * @dataProvider validateOptionsProvider + */ + public function testValidateOptions( $optionsToSet, $expectedRedirect, $expectedRedirectOptions ) { + $redirectQuery = []; + $redirected = false; + $output = $this->getMockBuilder( OutputPage::class ) + ->disableProxyingToOriginalMethods() + ->disableOriginalConstructor() + ->getMock(); + $output->method( 'redirect' )->willReturnCallback( + function ( $url ) use ( &$redirectQuery, &$redirected ) { + $urlParts = wfParseUrl( $url ); + $query = isset( $urlParts[ 'query' ] ) ? $urlParts[ 'query' ] : ''; + parse_str( $query, $redirectQuery ); + $redirected = true; + } + ); + $ctx = new RequestContext(); + + // Give users patrol permissions so we can test that. + $user = $this->getTestSysop()->getUser(); + $ctx->setUser( $user ); + + // Disable this hook or it could break changeType + // depending on which other extensions are running. + $this->setTemporaryHook( + 'ChangesListSpecialPageStructuredFilters', + null + ); + + $ctx->setOutput( $output ); + $clsp = $this->changesListSpecialPage; + $clsp->setContext( $ctx ); + $opts = $clsp->getDefaultOptions(); + + foreach ( $optionsToSet as $option => $value ) { + $opts->setValue( $option, $value ); + } + + $clsp->validateOptions( $opts ); + + $this->assertEquals( $expectedRedirect, $redirected, 'redirection' ); + + if ( $expectedRedirect ) { + if ( count( $expectedRedirectOptions ) > 0 ) { + $expectedRedirectOptions += [ + 'title' => $clsp->getPageTitle()->getPrefixedText(), + ]; + } + + $this->assertArrayEquals( + $expectedRedirectOptions, + $redirectQuery, + /* $ordered= */ false, + /* $named= */ true, + 'redirection query' + ); + } + } +}