This reduces the runtime of database-bound tests by about 40% (on my system, from 4:55 to 2:47; results from Jenkins are inconclusive). The basic idea is to call addCoreDBData() only once, and have a addDBDataOnce() that is called once per test class, not for every test method lie addDBData() is. Most tests could be trivially be changed to implement addDBDataOnce() instead of addDBData(). The ones for which this did not work immediately were left out for now. A closer look at the tests that still implement addDBData() may reveal additional potential for improvement. TODO: Once this is merged, try to change addDBData() to addDBDataOnce() where possible in extensions. Change-Id: Iec4ed4c8419fb4ad87e6710de808863ede9998b7
124 lines
3.5 KiB
PHP
124 lines
3.5 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @group Database
|
|
*/
|
|
class MergeHistoryTest extends MediaWikiTestCase {
|
|
|
|
/**
|
|
* Make some pages to work with
|
|
*/
|
|
public function addDBDataOnce() {
|
|
// Pages that won't actually be merged
|
|
$this->insertPage( 'Test' );
|
|
$this->insertPage( 'Test2' );
|
|
|
|
// Pages that will be merged
|
|
$this->insertPage( 'Merge1' );
|
|
$this->insertPage( 'Merge2' );
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideIsValidMerge
|
|
* @covers MergeHistory::isValidMerge
|
|
* @param $source string Source page
|
|
* @param $dest string Destination page
|
|
* @param $timestamp string|bool Timestamp up to which revisions are merged (or false for all)
|
|
* @param $error string|bool Expected error for test (or true for no error)
|
|
*/
|
|
public function testIsValidMerge( $source, $dest, $timestamp, $error ) {
|
|
$this->setMwGlobals( 'wgContentHandlerUseDB', false );
|
|
$mh = new MergeHistory(
|
|
Title::newFromText( $source ),
|
|
Title::newFromText( $dest ),
|
|
$timestamp
|
|
);
|
|
$status = $mh->isValidMerge();
|
|
if ( $error === true ) {
|
|
$this->assertTrue( $status->isGood() );
|
|
} else {
|
|
$this->assertTrue( $status->hasMessage( $error ) );
|
|
}
|
|
}
|
|
|
|
public static function provideIsValidMerge() {
|
|
return [
|
|
// for MergeHistory::isValidMerge
|
|
[ 'Test', 'Test2', false, true ],
|
|
// Although this timestamp is after the latest timestamp of both pages,
|
|
// MergeHistory should select the latest source timestamp up to this which should
|
|
// still work for the merge.
|
|
[ 'Test', 'Test2', strtotime( 'tomorrow' ), true ],
|
|
[ 'Test', 'Test', false, 'mergehistory-fail-self-merge' ],
|
|
[ 'Nonexistant', 'Test2', false, 'mergehistory-fail-invalid-source' ],
|
|
[ 'Test', 'Nonexistant', false, 'mergehistory-fail-invalid-dest' ],
|
|
[
|
|
'Test',
|
|
'Test2',
|
|
'This is obviously an invalid timestamp',
|
|
'mergehistory-fail-bad-timestamp'
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test merge revision limit checking
|
|
* @covers MergeHistory::isValidMerge
|
|
*/
|
|
public function testIsValidMergeRevisionLimit() {
|
|
$limit = MergeHistory::REVISION_LIMIT;
|
|
|
|
$mh = $this->getMockBuilder( 'MergeHistory' )
|
|
->setMethods( [ 'getRevisionCount' ] )
|
|
->setConstructorArgs( [
|
|
Title::newFromText( 'Test' ),
|
|
Title::newFromText( 'Test2' ),
|
|
] )
|
|
->getMock();
|
|
$mh->expects( $this->once() )
|
|
->method( 'getRevisionCount' )
|
|
->will( $this->returnValue( $limit + 1 ) );
|
|
|
|
$status = $mh->isValidMerge();
|
|
$this->assertTrue( $status->hasMessage( 'mergehistory-fail-toobig' ) );
|
|
$errors = $status->getErrorsByType( 'error' );
|
|
$params = $errors[0]['params'];
|
|
$this->assertEquals( $params[0], Message::numParam( $limit ) );
|
|
}
|
|
|
|
/**
|
|
* Test user permission checking
|
|
* @covers MergeHistory::checkPermissions
|
|
*/
|
|
public function testCheckPermissions() {
|
|
$mh = new MergeHistory(
|
|
Title::newFromText( 'Test' ),
|
|
Title::newFromText( 'Test2' )
|
|
);
|
|
|
|
// Sysop with mergehistory permission
|
|
$sysop = User::newFromName( 'UTSysop' );
|
|
$status = $mh->checkPermissions( $sysop, '' );
|
|
$this->assertTrue( $status->isOK() );
|
|
|
|
// Normal user
|
|
$notSysop = User::newFromName( 'UTNotSysop' );
|
|
$notSysop->addToDatabase();
|
|
$status = $mh->checkPermissions( $notSysop, '' );
|
|
$this->assertTrue( $status->hasMessage( 'mergehistory-fail-permission' ) );
|
|
}
|
|
|
|
/**
|
|
* Test merged revision count
|
|
* @covers MergeHistory::getMergedRevisionCount
|
|
*/
|
|
public function testGetMergedRevisionCount() {
|
|
$mh = new MergeHistory(
|
|
Title::newFromText( 'Merge1' ),
|
|
Title::newFromText( 'Merge2' )
|
|
);
|
|
|
|
$mh->merge( User::newFromName( 'UTSysop' ) );
|
|
$this->assertEquals( $mh->getMergedRevisionCount(), 1 );
|
|
}
|
|
}
|