Find: /isset\(\s*([^()]+?)\s*\)\s*\?\s*\1\s*:\s*/ Replace with: '\1 ?? ' (Everywhere except includes/PHPVersionCheck.php) (Then, manually fix some line length and indentation issues) Then manually reviewed the replacements for cases where confusing operator precedence would result in incorrect results (fixing those in I478db046a1cc162c6767003ce45c9b56270f3372). Change-Id: I33b421c8cb11cdd4ce896488c9ff5313f03a38cf
151 lines
3.6 KiB
PHP
151 lines
3.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Abstract base class for shared logic when testing ChangesListSpecialPage
|
|
* and subclasses
|
|
*
|
|
* @group Database
|
|
*/
|
|
abstract class AbstractChangesListSpecialPageTestCase extends MediaWikiTestCase {
|
|
// Must be initialized by subclass
|
|
/**
|
|
* @var ChangesListSpecialPage
|
|
*/
|
|
protected $changesListSpecialPage;
|
|
|
|
protected $oldPatrollersGroup;
|
|
|
|
protected function setUp() {
|
|
global $wgGroupPermissions;
|
|
|
|
parent::setUp();
|
|
$this->setMwGlobals( [
|
|
'wgRCWatchCategoryMembership' => true,
|
|
'wgUseRCPatrol' => 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();
|
|
}
|
|
|
|
abstract protected function getPage();
|
|
|
|
protected function tearDown() {
|
|
global $wgGroupPermissions;
|
|
|
|
parent::tearDown();
|
|
|
|
if ( $this->oldPatrollersGroup !== null ) {
|
|
$wgGroupPermissions['patrollers'] = $this->oldPatrollersGroup;
|
|
}
|
|
}
|
|
|
|
abstract public function provideParseParameters();
|
|
|
|
/**
|
|
* @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 = $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'
|
|
);
|
|
}
|
|
}
|
|
}
|