Regression test for detecting edit conflicts.
Change-Id: I9f8f3850ff0d6d51f173f5be73ffcb3b64886235
This commit is contained in:
parent
f6e8d4a04c
commit
1aed5382d2
1 changed files with 149 additions and 0 deletions
|
|
@ -196,4 +196,153 @@ class ApiEditPageTest extends ApiTestCase {
|
|||
function testUndo() {
|
||||
$this->markTestIncomplete( "not yet implemented" );
|
||||
}
|
||||
|
||||
function testEditConflict() {
|
||||
static $count = 0;
|
||||
$count++;
|
||||
|
||||
// assume NS_HELP defaults to wikitext
|
||||
$name = "Help:ApiEditPageTest_testEditConflict_$count";
|
||||
$title = Title::newFromText( $name );
|
||||
|
||||
$page = WikiPage::factory( $title );
|
||||
|
||||
// base edit
|
||||
$page->doEditContent( new WikitextContent( "Foo" ),
|
||||
"testing 1", EDIT_NEW, false, self::$users['sysop']->user );
|
||||
$this->forceRevisionDate( $page, '20120101000000' );
|
||||
$baseTime = $page->getRevision()->getTimestamp();
|
||||
|
||||
// conflicting edit
|
||||
$page->doEditContent( new WikitextContent( "Foo bar" ),
|
||||
"testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
|
||||
$this->forceRevisionDate( $page, '20120101020202' );
|
||||
|
||||
// try to save edit, expect conflict
|
||||
try {
|
||||
list( $re,, ) = $this->doApiRequestWithToken( array(
|
||||
'action' => 'edit',
|
||||
'title' => $name,
|
||||
'text' => 'nix bar!',
|
||||
'basetimestamp' => $baseTime,
|
||||
), null, self::$users['sysop']->user );
|
||||
|
||||
$this->fail( 'edit conflict expected' );
|
||||
} catch ( UsageException $ex ) {
|
||||
$this->assertEquals( 'editconflict', $ex->getCodeString() );
|
||||
}
|
||||
}
|
||||
|
||||
function testEditConflict_redirect() {
|
||||
static $count = 0;
|
||||
$count++;
|
||||
|
||||
// assume NS_HELP defaults to wikitext
|
||||
$name = "Help:ApiEditPageTest_testEditConflict_redirect_$count";
|
||||
$title = Title::newFromText( $name );
|
||||
$page = WikiPage::factory( $title );
|
||||
|
||||
$rname = "Help:ApiEditPageTest_testEditConflict_redirect_r$count";
|
||||
$rtitle = Title::newFromText( $rname );
|
||||
$rpage = WikiPage::factory( $rtitle );
|
||||
|
||||
// base edit for content
|
||||
$page->doEditContent( new WikitextContent( "Foo" ),
|
||||
"testing 1", EDIT_NEW, false, self::$users['sysop']->user );
|
||||
$this->forceRevisionDate( $page, '20120101000000' );
|
||||
$baseTime = $page->getRevision()->getTimestamp();
|
||||
|
||||
// base edit for redirect
|
||||
$rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
|
||||
"testing 1", EDIT_NEW, false, self::$users['sysop']->user );
|
||||
$this->forceRevisionDate( $rpage, '20120101000000' );
|
||||
|
||||
// conflicting edit to redirect
|
||||
$rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]\n\n[[Category:Test]]" ),
|
||||
"testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
|
||||
$this->forceRevisionDate( $rpage, '20120101020202' );
|
||||
|
||||
// try to save edit; should work, because we follow the redirect
|
||||
list( $re,, ) = $this->doApiRequestWithToken( array(
|
||||
'action' => 'edit',
|
||||
'title' => $rname,
|
||||
'text' => 'nix bar!',
|
||||
'basetimestamp' => $baseTime,
|
||||
'redirect' => true,
|
||||
), null, self::$users['sysop']->user );
|
||||
|
||||
$this->assertEquals( 'Success', $re['edit']['result'],
|
||||
"no edit conflict expected when following redirect" );
|
||||
|
||||
// try again, without following the redirect. Should fail.
|
||||
try {
|
||||
list( $re,, ) = $this->doApiRequestWithToken( array(
|
||||
'action' => 'edit',
|
||||
'title' => $rname,
|
||||
'text' => 'nix bar!',
|
||||
'basetimestamp' => $baseTime,
|
||||
), null, self::$users['sysop']->user );
|
||||
|
||||
$this->fail( 'edit conflict expected' );
|
||||
} catch ( UsageException $ex ) {
|
||||
$this->assertEquals( 'editconflict', $ex->getCodeString() );
|
||||
}
|
||||
}
|
||||
|
||||
function testEditConflict_bug41990() {
|
||||
static $count = 0;
|
||||
$count++;
|
||||
|
||||
/*
|
||||
* bug 41990: if the target page has a newer revision than the redirect, then editing the
|
||||
* redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erronously
|
||||
* caused an edit conflict to be detected.
|
||||
*/
|
||||
|
||||
// assume NS_HELP defaults to wikitext
|
||||
$name = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_$count";
|
||||
$title = Title::newFromText( $name );
|
||||
$page = WikiPage::factory( $title );
|
||||
|
||||
$rname = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_r$count";
|
||||
$rtitle = Title::newFromText( $rname );
|
||||
$rpage = WikiPage::factory( $rtitle );
|
||||
|
||||
// base edit for content
|
||||
$page->doEditContent( new WikitextContent( "Foo" ),
|
||||
"testing 1", EDIT_NEW, false, self::$users['sysop']->user );
|
||||
$this->forceRevisionDate( $page, '20120101000000' );
|
||||
|
||||
// base edit for redirect
|
||||
$rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
|
||||
"testing 1", EDIT_NEW, false, self::$users['sysop']->user );
|
||||
$this->forceRevisionDate( $rpage, '20120101000000' );
|
||||
$baseTime = $rpage->getRevision()->getTimestamp();
|
||||
|
||||
// new edit to content
|
||||
$page->doEditContent( new WikitextContent( "Foo bar" ),
|
||||
"testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
|
||||
$this->forceRevisionDate( $rpage, '20120101020202' );
|
||||
|
||||
// try to save edit; should work, following the redirect.
|
||||
list( $re,, ) = $this->doApiRequestWithToken( array(
|
||||
'action' => 'edit',
|
||||
'title' => $rname,
|
||||
'text' => 'nix bar!',
|
||||
'redirect' => true,
|
||||
), null, self::$users['sysop']->user );
|
||||
|
||||
$this->assertEquals( 'Success', $re['edit']['result'],
|
||||
"no edit conflict expected here" );
|
||||
}
|
||||
|
||||
protected function forceRevisionDate( WikiPage $page, $timestamp ) {
|
||||
$dbw = wfGetDB( DB_MASTER );
|
||||
|
||||
$dbw->update( 'revision',
|
||||
array( 'rev_timestamp' => $timestamp ),
|
||||
array( 'rev_id' => $page->getLatest() ) );
|
||||
|
||||
$page->clear();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue