wiki.techinc.nl/tests/phpunit/includes/MergeHistoryTest.php
Ori Livneh e638075936 Whenever possible, reuse User objects in unit tests
The unit tests spend nearly half of their run time resetting the user table for
each test. But the majority of tests do not depend on the user table having the
exact value that the setup code resets it to, and do not need to modify the
user objects they require to run.

Fix that by providing an API for tests to get User objects, and to indicate
whether the User object will be subject to destructive modification or not.
This allows User objects to be reused across multiple unit tests.

Change-Id: I17ef1f519759c5e7796c259282afe730ef722e96
2016-05-26 20:42:31 +00:00

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 string $source Source page
* @param string $dest Destination page
* @param string|bool $timestamp Timestamp up to which revisions are merged (or false for all)
* @param string|bool $error 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 = static::getTestSysop()->getUser();
$status = $mh->checkPermissions( $sysop, '' );
$this->assertTrue( $status->isOK() );
// Normal user
$notSysop = static::getTestUser()->getUser();
$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' )
);
$sysop = static::getTestSysop()->getUser();
$mh->merge( $sysop );
$this->assertEquals( $mh->getMergedRevisionCount(), 1 );
}
}