2012-10-16 15:42:54 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @group API
|
|
|
|
|
* @group Database
|
2013-01-18 19:02:28 +00:00
|
|
|
* @group medium
|
2013-10-23 16:01:33 +00:00
|
|
|
*
|
|
|
|
|
* @covers ApiParse
|
2012-10-16 15:42:54 +00:00
|
|
|
*/
|
|
|
|
|
class ApiParseTest extends ApiTestCase {
|
|
|
|
|
|
2017-06-12 15:02:58 +00:00
|
|
|
protected static $pageId;
|
|
|
|
|
protected static $revIds = [];
|
|
|
|
|
|
|
|
|
|
public function addDBDataOnce() {
|
|
|
|
|
$user = static::getTestSysop()->getUser();
|
|
|
|
|
$title = Title::newFromText( __CLASS__ );
|
|
|
|
|
$page = WikiPage::factory( $title );
|
|
|
|
|
|
|
|
|
|
$status = $page->doEditContent(
|
|
|
|
|
ContentHandler::makeContent( 'Test for revdel', $title, CONTENT_MODEL_WIKITEXT ),
|
|
|
|
|
__METHOD__ . ' Test for revdel', 0, false, $user
|
|
|
|
|
);
|
2017-12-27 11:33:38 +00:00
|
|
|
if ( !$status->isOK() ) {
|
2017-06-12 15:02:58 +00:00
|
|
|
$this->fail( "Failed to create $title: " . $status->getWikiText( false, false, 'en' ) );
|
|
|
|
|
}
|
|
|
|
|
self::$pageId = $status->value['revision']->getPage();
|
|
|
|
|
self::$revIds['revdel'] = $status->value['revision']->getId();
|
|
|
|
|
|
|
|
|
|
$status = $page->doEditContent(
|
|
|
|
|
ContentHandler::makeContent( 'Test for oldid', $title, CONTENT_MODEL_WIKITEXT ),
|
|
|
|
|
__METHOD__ . ' Test for oldid', 0, false, $user
|
|
|
|
|
);
|
2017-12-27 11:33:38 +00:00
|
|
|
if ( !$status->isOK() ) {
|
2017-06-12 15:02:58 +00:00
|
|
|
$this->fail( "Failed to edit $title: " . $status->getWikiText( false, false, 'en' ) );
|
|
|
|
|
}
|
|
|
|
|
self::$revIds['oldid'] = $status->value['revision']->getId();
|
|
|
|
|
|
|
|
|
|
$status = $page->doEditContent(
|
|
|
|
|
ContentHandler::makeContent( 'Test for latest', $title, CONTENT_MODEL_WIKITEXT ),
|
|
|
|
|
__METHOD__ . ' Test for latest', 0, false, $user
|
|
|
|
|
);
|
2017-12-27 11:33:38 +00:00
|
|
|
if ( !$status->isOK() ) {
|
2017-06-12 15:02:58 +00:00
|
|
|
$this->fail( "Failed to edit $title: " . $status->getWikiText( false, false, 'en' ) );
|
|
|
|
|
}
|
|
|
|
|
self::$revIds['latest'] = $status->value['revision']->getId();
|
|
|
|
|
|
|
|
|
|
RevisionDeleter::createList(
|
|
|
|
|
'revision', RequestContext::getMain(), $title, [ self::$revIds['revdel'] ]
|
|
|
|
|
)->setVisibility( [
|
|
|
|
|
'value' => [
|
|
|
|
|
Revision::DELETED_TEXT => 1,
|
|
|
|
|
],
|
|
|
|
|
'comment' => 'Test for revdel',
|
|
|
|
|
] );
|
|
|
|
|
|
|
|
|
|
Title::clearCaches(); // Otherwise it has the wrong latest revision for some reason
|
2012-10-16 15:42:54 +00:00
|
|
|
}
|
|
|
|
|
|
2017-06-12 15:02:58 +00:00
|
|
|
public function testParseByName() {
|
|
|
|
|
$res = $this->doApiRequest( [
|
|
|
|
|
'action' => 'parse',
|
|
|
|
|
'page' => __CLASS__,
|
|
|
|
|
] );
|
|
|
|
|
$this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
|
|
|
|
|
|
|
|
|
|
$res = $this->doApiRequest( [
|
|
|
|
|
'action' => 'parse',
|
|
|
|
|
'page' => __CLASS__,
|
|
|
|
|
'disablelimitreport' => 1,
|
|
|
|
|
] );
|
|
|
|
|
$this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testParseById() {
|
|
|
|
|
$res = $this->doApiRequest( [
|
|
|
|
|
'action' => 'parse',
|
|
|
|
|
'pageid' => self::$pageId,
|
|
|
|
|
] );
|
|
|
|
|
$this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testParseByOldId() {
|
|
|
|
|
$res = $this->doApiRequest( [
|
|
|
|
|
'action' => 'parse',
|
|
|
|
|
'oldid' => self::$revIds['oldid'],
|
|
|
|
|
] );
|
|
|
|
|
$this->assertContains( 'Test for oldid', $res[0]['parse']['text'] );
|
|
|
|
|
$this->assertArrayNotHasKey( 'textdeleted', $res[0]['parse'] );
|
|
|
|
|
$this->assertArrayNotHasKey( 'textsuppressed', $res[0]['parse'] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testParseRevDel() {
|
|
|
|
|
$user = static::getTestUser()->getUser();
|
|
|
|
|
$sysop = static::getTestSysop()->getUser();
|
2012-10-16 15:42:54 +00:00
|
|
|
|
|
|
|
|
try {
|
2016-02-17 09:09:32 +00:00
|
|
|
$this->doApiRequest( [
|
2012-10-16 15:42:54 +00:00
|
|
|
'action' => 'parse',
|
2017-06-12 15:02:58 +00:00
|
|
|
'oldid' => self::$revIds['revdel'],
|
|
|
|
|
], null, null, $user );
|
|
|
|
|
$this->fail( "API did not return an error as expected" );
|
|
|
|
|
} catch ( ApiUsageException $ex ) {
|
|
|
|
|
$this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'permissiondenied' ),
|
|
|
|
|
"API failed with error 'permissiondenied'" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$res = $this->doApiRequest( [
|
|
|
|
|
'action' => 'parse',
|
|
|
|
|
'oldid' => self::$revIds['revdel'],
|
|
|
|
|
], null, null, $sysop );
|
|
|
|
|
$this->assertContains( 'Test for revdel', $res[0]['parse']['text'] );
|
|
|
|
|
$this->assertArrayHasKey( 'textdeleted', $res[0]['parse'] );
|
|
|
|
|
$this->assertArrayNotHasKey( 'textsuppressed', $res[0]['parse'] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testParseNonexistentPage() {
|
|
|
|
|
try {
|
|
|
|
|
$this->doApiRequest( [
|
|
|
|
|
'action' => 'parse',
|
|
|
|
|
'page' => 'DoesNotExist',
|
|
|
|
|
] );
|
2012-10-16 15:42:54 +00:00
|
|
|
|
|
|
|
|
$this->fail( "API did not return an error when parsing a nonexistent page" );
|
2016-10-19 16:54:25 +00:00
|
|
|
} catch ( ApiUsageException $ex ) {
|
|
|
|
|
$this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'missingtitle' ),
|
2014-04-24 15:05:10 +00:00
|
|
|
"Parse request for nonexistent page must give 'missingtitle' error: "
|
2016-10-19 16:54:25 +00:00
|
|
|
. var_export( self::getErrorFormatter()->arrayFromStatus( $ex->getStatusValue() ), true )
|
2014-04-24 15:05:10 +00:00
|
|
|
);
|
2012-10-16 15:42:54 +00:00
|
|
|
}
|
|
|
|
|
}
|
2017-10-25 01:07:59 +00:00
|
|
|
|
|
|
|
|
public function testSkinModules() {
|
|
|
|
|
$factory = new SkinFactory();
|
|
|
|
|
$factory->register( 'testing', 'Testing', function () {
|
|
|
|
|
$skin = $this->getMockBuilder( SkinFallback::class )
|
2017-10-25 01:16:01 +00:00
|
|
|
->setMethods( [ 'getDefaultModules', 'setupSkinUserCss' ] )
|
2017-10-25 01:07:59 +00:00
|
|
|
->getMock();
|
|
|
|
|
$skin->expects( $this->once() )->method( 'getDefaultModules' )
|
|
|
|
|
->willReturn( [
|
|
|
|
|
'core' => [ 'foo', 'bar' ],
|
|
|
|
|
'content' => [ 'baz' ]
|
|
|
|
|
] );
|
2017-10-25 01:16:01 +00:00
|
|
|
$skin->expects( $this->once() )->method( 'setupSkinUserCss' )
|
|
|
|
|
->will( $this->returnCallback( function ( OutputPage $out ) {
|
|
|
|
|
$out->addModuleStyles( 'foo.styles' );
|
|
|
|
|
} ) );
|
2017-10-25 01:07:59 +00:00
|
|
|
return $skin;
|
|
|
|
|
} );
|
|
|
|
|
$this->setService( 'SkinFactory', $factory );
|
|
|
|
|
|
|
|
|
|
$res = $this->doApiRequest( [
|
|
|
|
|
'action' => 'parse',
|
|
|
|
|
'pageid' => self::$pageId,
|
|
|
|
|
'useskin' => 'testing',
|
|
|
|
|
'prop' => 'modules',
|
|
|
|
|
] );
|
|
|
|
|
$this->assertSame(
|
|
|
|
|
[ 'foo', 'bar', 'baz' ],
|
|
|
|
|
$res[0]['parse']['modules'],
|
|
|
|
|
'resp.parse.modules'
|
|
|
|
|
);
|
|
|
|
|
$this->assertSame(
|
|
|
|
|
[],
|
|
|
|
|
$res[0]['parse']['modulescripts'],
|
|
|
|
|
'resp.parse.modulescripts'
|
|
|
|
|
);
|
|
|
|
|
$this->assertSame(
|
2017-10-25 01:16:01 +00:00
|
|
|
[ 'foo.styles' ],
|
2017-10-25 01:07:59 +00:00
|
|
|
$res[0]['parse']['modulestyles'],
|
|
|
|
|
'resp.parse.modulestyles'
|
|
|
|
|
);
|
|
|
|
|
}
|
2012-10-16 15:42:54 +00:00
|
|
|
}
|