X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/tests/phpunit/includes/MergeHistoryTest.php diff --git a/tests/phpunit/includes/MergeHistoryTest.php b/tests/phpunit/includes/MergeHistoryTest.php new file mode 100644 index 00000000..f44ae322 --- /dev/null +++ b/tests/phpunit/includes/MergeHistoryTest.php @@ -0,0 +1,124 @@ +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 ); + } +}