wiki.techinc.nl/tests/phpunit/integration/includes/Rest/Handler/RevisionSourceHandlerTest.php
Bill Pirkle fc7acbee64 Promote experimental revision rest endpoints to official
These three endpoints have been experimental for many months:
  revision/{id}
  revision/{id}/html
  revision/{id}/with_html
Promote them to officially released. This completes the
basic "revision" endpoint support, and helps clear out
the coreDevelopmentRoutes.json file for unrelated
experiments.

This also modifies the existing revision/{id}/bare endpoint
response, which previously pointed callers to the experimental
endpoint for html. It now points callers to the official one.

Bug: T305506
Change-Id: Iee8d1723e98dd3e3e389a0514dde28799914b2fd
2022-04-13 11:30:53 -05:00

163 lines
4.6 KiB
PHP

<?php
namespace MediaWiki\Tests\Rest\Handler;
use BagOStuff;
use Exception;
use HashConfig;
use MediaWiki\Rest\Handler\RevisionSourceHandler;
use MediaWiki\Rest\LocalizedHttpException;
use MediaWiki\Rest\RequestData;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Revision\SlotRecord;
use MediaWikiIntegrationTestCase;
use TextContent;
use Wikimedia\Message\MessageValue;
/**
* @covers \MediaWiki\Rest\Handler\RevisionSourceHandler
* @group Database
*/
class RevisionSourceHandlerTest extends MediaWikiIntegrationTestCase {
use HandlerTestTrait;
private const WIKITEXT = 'Hello \'\'\'World\'\'\'';
private const HTML = '<p>Hello <b>World</b></p>';
protected function setUp(): void {
parent::setUp();
// Clean up these tables after each test
$this->tablesUsed = [
'page',
'revision',
'comment',
'text',
'content'
];
}
/**
* @param BagOStuff|null $cache
* @return RevisionSourceHandler
* @throws Exception
*/
private function newHandler( BagOStuff $cache = null ): RevisionSourceHandler {
$handler = new RevisionSourceHandler(
new HashConfig( [
'RightsUrl' => 'https://example.com/rights',
'RightsText' => 'some rights',
] ),
$this->getServiceContainer()->getRevisionLookup(),
$this->getServiceContainer()->getTitleFormatter(),
$this->getServiceContainer()->getPageStore()
);
return $handler;
}
private function getExistingPageWithRevisions( $name ) {
$page = $this->getNonexistingTestPage( $name );
$this->editPage( $page, self::WIKITEXT );
$revisions['first'] = $page->getRevisionRecord();
$this->editPage( $page, 'DEAD BEEF' );
$revisions['latest'] = $page->getRevisionRecord();
return [ $page, $revisions ];
}
public function testExecuteBare() {
[ $page, $revisions ] = $this->getExistingPageWithRevisions( __METHOD__ );
$firstRev = $revisions['first'];
$request = new RequestData(
[ 'pathParams' => [ 'id' => $firstRev->getId() ] ]
);
$htmlUrl = "https://wiki.example.com/rest/v1/revision/{$firstRev->getId()}/html";
$handler = $this->newHandler();
$config = [ 'format' => 'bare' ];
$data = $this->executeHandlerAndGetBodyData( $handler, $request, $config );
$this->assertResponseData( $firstRev, $data );
$this->assertSame( $htmlUrl, $data['html_url'] );
}
public function testExecuteSource() {
[ $page, $revisions ] = $this->getExistingPageWithRevisions( __METHOD__ );
$firstRev = $revisions['first'];
$request = new RequestData(
[ 'pathParams' => [ 'id' => $firstRev->getId() ] ]
);
$handler = $this->newHandler();
$config = [ 'format' => 'source' ];
$data = $this->executeHandlerAndGetBodyData( $handler, $request, $config );
/** @var TextContent $content */
$content = $firstRev->getContent( SlotRecord::MAIN );
$this->assertResponseData( $firstRev, $data );
$this->assertSame( $content->getText(), $data['source'] );
}
public function testExecute_missingparam() {
$request = new RequestData();
$this->expectExceptionObject(
new LocalizedHttpException(
new MessageValue( "paramvalidator-missingparam", [ 'title' ] ),
400
)
);
$handler = $this->newHandler();
$this->executeHandler( $handler, $request );
}
public function testExecute_error() {
$request = new RequestData( [ 'pathParams' => [ 'id' => '2074398742' ] ] );
$this->expectExceptionObject(
new LocalizedHttpException(
new MessageValue( "rest-nonexistent-revision", [ 'testing' ] ),
404
)
);
$handler = $this->newHandler();
$this->executeHandler( $handler, $request );
}
/**
* @param RevisionRecord $rev
* @param array $data
*/
private function assertResponseData( RevisionRecord $rev, array $data ): void {
$this->assertSame( $rev->getId(), $data['id'] );
$this->assertSame( $rev->getSize(), $data['size'] );
$this->assertSame( $rev->isMinor(), $data['minor'] );
$this->assertSame(
wfTimestampOrNull( TS_ISO_8601, $rev->getTimestamp() ),
$data['timestamp']
);
$this->assertSame( $rev->getPage()->getId(), $data['page']['id'] );
$this->assertSame( $rev->getPage()->getDBkey(), $data['page']['key'] ); // assume main namespace
$this->assertSame(
$rev->getPageAsLinkTarget()->getText(),
$data['page']['title']
); // assume main namespace
$this->assertSame( CONTENT_MODEL_WIKITEXT, $data['content_model'] );
$this->assertSame( 'https://example.com/rights', $data['license']['url'] );
$this->assertSame( 'some rights', $data['license']['title'] );
$this->assertSame( $rev->getComment()->text, $data['comment'] );
$this->assertSame( $rev->getUser()->getId(), $data['user']['id'] );
$this->assertSame( $rev->getUser()->getName(), $data['user']['name'] );
}
}