X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=tests%2Fphpunit%2Fincludes%2Fapi%2FApiEditPageTest.php;h=02d0a0dc57af7c67d57810731a3e23eeb1d5151e;hb=6b3e5511fb848890f174690885e748b90389c0b8;hp=4a90bf84587703e39d5c4e3e5813a0d61ba539a3;hpb=638c4528259b71a5bc90439fad7cd8d110a86b06;p=lhc%2Fweb%2Fwiklou.git diff --git a/tests/phpunit/includes/api/ApiEditPageTest.php b/tests/phpunit/includes/api/ApiEditPageTest.php index 4a90bf8458..7eac55975a 100644 --- a/tests/phpunit/includes/api/ApiEditPageTest.php +++ b/tests/phpunit/includes/api/ApiEditPageTest.php @@ -18,12 +18,12 @@ class ApiEditPageTest extends ApiTestCase { parent::setUp(); - $this->setMwGlobals( array( + $this->setMwGlobals( [ 'wgExtraNamespaces' => $wgExtraNamespaces, 'wgNamespaceContentModels' => $wgNamespaceContentModels, 'wgContentHandlers' => $wgContentHandlers, 'wgContLang' => $wgContLang, - ) ); + ] ); $wgExtraNamespaces[12312] = 'Dummy'; $wgExtraNamespaces[12313] = 'Dummy_talk'; @@ -36,14 +36,18 @@ class ApiEditPageTest extends ApiTestCase { $wgContentHandlers["testing"] = 'DummyContentHandlerForTesting'; $wgContentHandlers["testing-nontext"] = 'DummyNonTextContentHandler'; - MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache + MWNamespace::clearCaches(); $wgContLang->resetNamespaces(); # reset namespace cache $this->doLogin(); } protected function tearDown() { - MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache + global $wgContLang; + + MWNamespace::clearCaches(); + $wgContLang->resetNamespaces(); # reset namespace cache + parent::tearDown(); } @@ -51,11 +55,11 @@ class ApiEditPageTest extends ApiTestCase { $name = 'Help:ApiEditPageTest_testEdit'; // assume Help namespace to default to wikitext // -- test new page -------------------------------------------- - $apiResult = $this->doApiRequestWithToken( array( + $apiResult = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'text' => 'some text', - ) ); + ] ); $apiResult = $apiResult[0]; // Validate API result data @@ -69,11 +73,11 @@ class ApiEditPageTest extends ApiTestCase { $this->assertArrayHasKey( 'pageid', $apiResult['edit'] ); // -- test existing page, no change ---------------------------- - $data = $this->doApiRequestWithToken( array( + $data = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'text' => 'some text', - ) ); + ] ); $this->assertEquals( 'Success', $data[0]['edit']['result'] ); @@ -81,11 +85,11 @@ class ApiEditPageTest extends ApiTestCase { $this->assertArrayHasKey( 'nochange', $data[0]['edit'] ); // -- test existing page, with change -------------------------- - $data = $this->doApiRequestWithToken( array( + $data = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'text' => 'different text' - ) ); + ] ); $this->assertEquals( 'Success', $data[0]['edit']['result'] ); @@ -105,26 +109,26 @@ class ApiEditPageTest extends ApiTestCase { * @return array */ public static function provideEditAppend() { - return array( - array( # 0: append + return [ + [ # 0: append 'foo', 'append', 'bar', "foobar" - ), - array( # 1: prepend + ], + [ # 1: prepend 'foo', 'prepend', 'bar', "barfoo" - ), - array( # 2: append to empty page + ], + [ # 2: append to empty page '', 'append', 'foo', "foo" - ), - array( # 3: prepend to empty page + ], + [ # 3: prepend to empty page '', 'prepend', 'foo', "foo" - ), - array( # 4: append to non-existing page + ], + [ # 4: append to non-existing page null, 'append', 'foo', "foo" - ), - array( # 5: prepend to non-existing page + ], + [ # 5: prepend to non-existing page null, 'prepend', 'foo', "foo" - ), - ); + ], + ]; } /** @@ -139,19 +143,19 @@ class ApiEditPageTest extends ApiTestCase { // -- create page (or not) ----------------------------------------- if ( $text !== null ) { - list( $re ) = $this->doApiRequestWithToken( array( + list( $re ) = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, - 'text' => $text, ) ); + 'text' => $text, ] ); $this->assertEquals( 'Success', $re['edit']['result'] ); // sanity } // -- try append/prepend -------------------------------------------- - list( $re ) = $this->doApiRequestWithToken( array( + list( $re ) = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, - $op . 'text' => $append, ) ); + $op . 'text' => $append, ] ); $this->assertEquals( 'Success', $re['edit']['result'] ); @@ -175,12 +179,12 @@ class ApiEditPageTest extends ApiTestCase { // Preload the page with some text $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 'summary' ); - list( $re ) = $this->doApiRequestWithToken( array( + list( $re ) = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'section' => '1', 'text' => "==section 1==\nnew content 1", - ) ); + ] ); $this->assertEquals( 'Success', $re['edit']['result'] ); $newtext = WikiPage::factory( Title::newFromText( $name ) ) ->getContent( Revision::RAW ) @@ -189,22 +193,22 @@ class ApiEditPageTest extends ApiTestCase { // Test that we raise a 'nosuchsection' error try { - $this->doApiRequestWithToken( array( + $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'section' => '9999', 'text' => 'text', - ) ); - $this->fail( "Should have raised a UsageException" ); - } catch ( UsageException $e ) { - $this->assertEquals( 'nosuchsection', $e->getCodeString() ); + ] ); + $this->fail( "Should have raised an ApiUsageException" ); + } catch ( ApiUsageException $e ) { + $this->assertTrue( self::apiExceptionHasCode( $e, 'nosuchsection' ) ); } } /** * Test action=edit§ion=new * Run it twice so we test adding a new section on a - * page that doesn't exist (bug 52830) and one that + * page that doesn't exist (T54830) and one that * does exist */ public function testEditNewSection() { @@ -212,13 +216,13 @@ class ApiEditPageTest extends ApiTestCase { // Test on a page that does not already exist $this->assertFalse( Title::newFromText( $name )->exists() ); - list( $re ) = $this->doApiRequestWithToken( array( + list( $re ) = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'section' => 'new', 'text' => 'test', 'summary' => 'header', - ) ); + ] ); $this->assertEquals( 'Success', $re['edit']['result'] ); // Check the page text is correct @@ -229,13 +233,13 @@ class ApiEditPageTest extends ApiTestCase { // Now on one that does $this->assertTrue( Title::newFromText( $name )->exists() ); - list( $re2 ) = $this->doApiRequestWithToken( array( + list( $re2 ) = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'section' => 'new', 'text' => 'test', 'summary' => 'header', - ) ); + ] ); $this->assertEquals( 'Success', $re2['edit']['result'] ); $text = WikiPage::factory( Title::newFromText( $name ) ) @@ -277,14 +281,14 @@ class ApiEditPageTest extends ApiTestCase { $this->forceRevisionDate( $rpage, '20120101020202' ); // try to save edit, following the redirect - list( $re, , ) = $this->doApiRequestWithToken( array( + list( $re, , ) = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $rname, 'text' => 'nix bar!', 'basetimestamp' => $baseTime, 'section' => 'new', 'redirect' => true, - ), null, self::$users['sysop']->getUser() ); + ], null, self::$users['sysop']->getUser() ); $this->assertEquals( 'Success', $re['edit']['result'], "no problems expected when following redirect" ); @@ -324,17 +328,17 @@ class ApiEditPageTest extends ApiTestCase { // try to save edit, following the redirect but without creating a section try { - $this->doApiRequestWithToken( array( + $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $rname, 'text' => 'nix bar!', 'basetimestamp' => $baseTime, 'redirect' => true, - ), null, self::$users['sysop']->getUser() ); + ], null, self::$users['sysop']->getUser() ); $this->fail( 'redirect-appendonly error expected' ); - } catch ( UsageException $ex ) { - $this->assertEquals( 'redirect-appendonly', $ex->getCodeString() ); + } catch ( ApiUsageException $ex ) { + $this->assertTrue( self::apiExceptionHasCode( $ex, 'redirect-appendonly' ) ); } } @@ -361,16 +365,16 @@ class ApiEditPageTest extends ApiTestCase { // try to save edit, expect conflict try { - $this->doApiRequestWithToken( array( + $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'text' => 'nix bar!', 'basetimestamp' => $baseTime, - ), null, self::$users['sysop']->getUser() ); + ], null, self::$users['sysop']->getUser() ); $this->fail( 'edit conflict expected' ); - } catch ( UsageException $ex ) { - $this->assertEquals( 'editconflict', $ex->getCodeString() ); + } catch ( ApiUsageException $ex ) { + $this->assertTrue( self::apiExceptionHasCode( $ex, 'editconflict' ) ); } } @@ -399,13 +403,13 @@ class ApiEditPageTest extends ApiTestCase { $this->forceRevisionDate( $page, '20120101020202' ); // try to save edit, expect no conflict - list( $re, , ) = $this->doApiRequestWithToken( array( + list( $re, , ) = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'text' => 'nix bar!', 'basetimestamp' => $baseTime, 'section' => 'new', - ), null, self::$users['sysop']->getUser() ); + ], null, self::$users['sysop']->getUser() ); $this->assertEquals( 'Success', $re['edit']['result'], "no edit conflict expected here" ); @@ -416,7 +420,7 @@ class ApiEditPageTest extends ApiTestCase { $count++; /* - * bug 41990: if the target page has a newer revision than the redirect, then editing the + * T43990: if the target page has a newer revision than the redirect, then editing the * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erroneously * caused an edit conflict to be detected. */ @@ -446,13 +450,13 @@ class ApiEditPageTest extends ApiTestCase { $this->forceRevisionDate( $rpage, '20120101020202' ); // try to save edit; should work, following the redirect. - list( $re, , ) = $this->doApiRequestWithToken( array( + list( $re, , ) = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $rname, 'text' => 'nix bar!', 'section' => 'new', 'redirect' => true, - ), null, self::$users['sysop']->getUser() ); + ], null, self::$users['sysop']->getUser() ); $this->assertEquals( 'Success', $re['edit']['result'], "no edit conflict expected here" ); @@ -466,35 +470,35 @@ class ApiEditPageTest extends ApiTestCase { $dbw = wfGetDB( DB_MASTER ); $dbw->update( 'revision', - array( 'rev_timestamp' => $dbw->timestamp( $timestamp ) ), - array( 'rev_id' => $page->getLatest() ) ); + [ 'rev_timestamp' => $dbw->timestamp( $timestamp ) ], + [ 'rev_id' => $page->getLatest() ] ); $page->clear(); } public function testCheckDirectApiEditingDisallowed_forNonTextContent() { $this->setExpectedException( - 'UsageException', + ApiUsageException::class, 'Direct editing via API is not supported for content model ' . 'testing used by Dummy:ApiEditPageTest_nonTextPageEdit' ); - $this->doApiRequestWithToken( array( + $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => 'Dummy:ApiEditPageTest_nonTextPageEdit', 'text' => '{"animals":["kittens!"]}' - ) ); + ] ); } public function testSupportsDirectApiEditing_withContentHandlerOverride() { $name = 'DummyNonText:ApiEditPageTest_testNonTextEdit'; $data = serialize( 'some bla bla text' ); - $result = $this->doApiRequestWithToken( array( + $result = $this->doApiRequestWithToken( [ 'action' => 'edit', 'title' => $name, 'text' => $data, - ) ); + ] ); $apiResult = $result[0]; @@ -513,4 +517,57 @@ class ApiEditPageTest extends ApiTestCase { $this->assertEquals( "testing-nontext", $page->getContentModel() ); $this->assertEquals( $data, $page->getContent()->serialize() ); } + + /** + * This test verifies that after changing the content model + * of a page, undoing that edit via the API will also + * undo the content model change. + */ + public function testUndoAfterContentModelChange() { + $name = 'Help:' . __FUNCTION__; + $uploader = self::$users['uploader']->getUser(); + $sysop = self::$users['sysop']->getUser(); + $apiResult = $this->doApiRequestWithToken( [ + 'action' => 'edit', + 'title' => $name, + 'text' => 'some text', + ], null, $sysop )[0]; + + // Check success + $this->assertArrayHasKey( 'edit', $apiResult ); + $this->assertArrayHasKey( 'result', $apiResult['edit'] ); + $this->assertEquals( 'Success', $apiResult['edit']['result'] ); + $this->assertArrayHasKey( 'contentmodel', $apiResult['edit'] ); + // Content model is wikitext + $this->assertEquals( 'wikitext', $apiResult['edit']['contentmodel'] ); + + // Convert the page to JSON + $apiResult = $this->doApiRequestWithToken( [ + 'action' => 'edit', + 'title' => $name, + 'text' => '{}', + 'contentmodel' => 'json', + ], null, $uploader )[0]; + + // Check success + $this->assertArrayHasKey( 'edit', $apiResult ); + $this->assertArrayHasKey( 'result', $apiResult['edit'] ); + $this->assertEquals( 'Success', $apiResult['edit']['result'] ); + $this->assertArrayHasKey( 'contentmodel', $apiResult['edit'] ); + $this->assertEquals( 'json', $apiResult['edit']['contentmodel'] ); + + $apiResult = $this->doApiRequestWithToken( [ + 'action' => 'edit', + 'title' => $name, + 'undo' => $apiResult['edit']['newrevid'] + ], null, $sysop )[0]; + + // Check success + $this->assertArrayHasKey( 'edit', $apiResult ); + $this->assertArrayHasKey( 'result', $apiResult['edit'] ); + $this->assertEquals( 'Success', $apiResult['edit']['result'] ); + $this->assertArrayHasKey( 'contentmodel', $apiResult['edit'] ); + // Check that the contentmodel is back to wikitext now. + $this->assertEquals( 'wikitext', $apiResult['edit']['contentmodel'] ); + } }