wiki.techinc.nl/tests/phpunit/integration/includes/Rest/Handler/RevisionContentHelperTest.php
Umherirrender 2909d06a08 Use new namespace for revision related classes
All revision related classes are namespaced MediaWiki\Revision
instead of MediaWiki\Storage since 1.32. The old namespaced
class names are deprecated and only kept for backwards-compatibility.

Bug: T305784
Change-Id: I34e492d84d9fc4bc78481667202716d93b3c43cb
2022-04-14 23:03:43 +02:00

297 lines
9.6 KiB
PHP

<?php
namespace MediaWiki\Tests\Rest\Helper;
use HashConfig;
use MediaWiki\Page\ExistingPageRecord;
use MediaWiki\Permissions\Authority;
use MediaWiki\Rest\Handler\RevisionContentHelper;
use MediaWiki\Rest\HttpException;
use MediaWiki\Rest\Response;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Revision\SlotRecord;
use MediaWiki\Tests\Unit\Permissions\MockAuthorityTrait;
use MediaWikiIntegrationTestCase;
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper
* @group Database
*/
class RevisionContentHelperTest extends MediaWikiIntegrationTestCase {
use MockAuthorityTrait;
private const NO_REVISION_ETAG = '"b620cd7841f9ea8f545f11cc44ce794f848fa2d3"';
protected function setUp(): void {
parent::setUp();
// Clean up these tables after each test
$this->tablesUsed = [
'page',
'revision',
'comment',
'text',
'content'
];
}
/**
* @param array $params
* @param Authority|null $authority
* @return RevisionContentHelper
* @throws \Exception
*/
private function newHelper(
array $params = [],
Authority $authority = null
): RevisionContentHelper {
$helper = new RevisionContentHelper(
new HashConfig( [
'RightsUrl' => 'https://example.com/rights',
'RightsText' => 'some rights',
] ),
$this->getServiceContainer()->getRevisionLookup(),
$this->getServiceContainer()->getTitleFormatter(),
$this->getServiceContainer()->getPageStore()
);
$authority = $authority ?: $this->mockRegisteredUltimateAuthority();
$helper->init( $authority, $params );
return $helper;
}
private function getExistingPageWithRevisions( $name ) {
$page = $this->getNonexistingTestPage( $name );
$this->editPage( $page, 'First revision of ' . $name );
$revisions['first'] = $page->getRevisionRecord();
$this->editPage( $page, 'DEAD BEEF' );
$revisions['latest'] = $page->getRevisionRecord();
return [ $page, $revisions ];
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getRole()
*/
public function testGetRole() {
$helper = $this->newHelper();
$this->assertSame( SlotRecord::MAIN, $helper->getRole() );
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getTitleText()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getPage()
*/
public function testGetPage() {
[ $page, $revisions ] = $this->getExistingPageWithRevisions( __METHOD__ );
$helper = $this->newHelper( [ 'id' => $revisions['first']->getId() ] );
$this->assertSame( $page->getTitle()->getPrefixedDBKey(), $helper->getTitleText() );
$this->assertInstanceOf( ExistingPageRecord::class, $helper->getPage() );
$this->assertTrue( $helper->getPage()->isSamePageAs( $page->getTitle() ) );
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getTargetRevision()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getContent()
*/
public function testGetTargetRevisionAndContent() {
[ $page, $revisions ] = $this->getExistingPageWithRevisions( __METHOD__ );
$helper = $this->newHelper( [ 'id' => $revisions['first']->getId() ] );
$targetRev = $helper->getTargetRevision();
$this->assertInstanceOf( RevisionRecord::class, $targetRev );
$this->assertSame( $revisions['first']->getId(), $targetRev->getId() );
$pageContent = $helper->getContent();
$this->assertSame(
$revisions['first']->getContent( SlotRecord::MAIN )->serialize(),
$pageContent->serialize()
);
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getTitleText()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getPage()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::isAccessible()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::hasContent()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getTargetRevision()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getContent()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getLastModified()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getETag()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::checkAccess()
*/
public function testNoTitle() {
$helper = $this->newHelper();
$this->assertNull( $helper->getTitleText() );
$this->assertNull( $helper->getPage() );
$this->assertFalse( $helper->hasContent() );
$this->assertFalse( $helper->isAccessible() );
$this->assertNull( $helper->getTargetRevision() );
$this->assertNull( $helper->getLastModified() );
$this->assertSame( self::NO_REVISION_ETAG, $helper->getETag() );
try {
$helper->getContent();
$this->fail( 'Expected HttpException' );
} catch ( HttpException $ex ) {
$this->assertSame( 404, $ex->getCode() );
}
try {
$helper->checkAccess();
$this->fail( 'Expected HttpException' );
} catch ( HttpException $ex ) {
$this->assertSame( 404, $ex->getCode() );
}
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getTitleText()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getPage()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::isAccessible()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::hasContent()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getTargetRevision()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getContent()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getLastModified()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getETag()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::checkAccess()
*/
public function testNonExistingRevision() {
$helper = $this->newHelper( [ 'id' => 287436534 ] );
$this->assertSame( 287436534, $helper->getRevisionId() );
$this->assertNull( $helper->getTitleText() );
$this->assertNull( $helper->getPage() );
$this->assertFalse( $helper->hasContent() );
$this->assertFalse( $helper->isAccessible() );
$this->assertNull( $helper->getTargetRevision() );
$this->assertNull( $helper->getLastModified() );
$this->assertSame( self::NO_REVISION_ETAG, $helper->getETag() );
try {
$helper->getContent();
$this->fail( 'Expected HttpException' );
} catch ( HttpException $ex ) {
$this->assertSame( 404, $ex->getCode() );
}
try {
$helper->checkAccess();
$this->fail( 'Expected HttpException' );
} catch ( HttpException $ex ) {
$this->assertSame( 404, $ex->getCode() );
}
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getTitleText()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getPage()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::isAccessible()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::hasContent()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getTargetRevision()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getContent()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getLastModified()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getETag()
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::checkAccess()
*/
public function testForbidenPage() {
[ $page, $revisions ] = $this->getExistingPageWithRevisions( __METHOD__ );
$title = $page->getTitle();
$helper = $this->newHelper(
[ 'id' => $revisions['first']->getId() ],
$this->mockAnonNullAuthority()
);
$this->assertSame( $title->getPrefixedDBkey(), $helper->getTitleText() );
$this->assertTrue( $helper->getPage()->isSamePageAs( $title ) );
$this->assertTrue( $helper->hasContent() );
$this->assertFalse( $helper->isAccessible() );
$this->assertNull( $helper->getLastModified() );
try {
$helper->checkAccess();
$this->fail( 'Expected HttpException' );
} catch ( HttpException $ex ) {
$this->assertSame( 403, $ex->getCode() );
}
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::getParamSettings()
*/
public function testParameterSettings() {
$helper = $this->newHelper();
$settings = $helper->getParamSettings();
$this->assertArrayHasKey( 'id', $settings );
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::setCacheControl()
*/
public function testCacheControl() {
$helper = $this->newHelper();
$response = new Response();
$helper->setCacheControl( $response ); // default
$this->assertStringContainsString( 'max-age=5', $response->getHeaderLine( 'Cache-Control' ) );
$helper->setCacheControl( $response, 2 ); // explicit
$this->assertStringContainsString( 'max-age=2', $response->getHeaderLine( 'Cache-Control' ) );
$helper->setCacheControl( $response, 1000 * 1000 ); // too big
$this->assertStringContainsString( 'max-age=5', $response->getHeaderLine( 'Cache-Control' ) );
}
/**
* @covers \MediaWiki\Rest\Handler\RevisionContentHelper::constructMetadata()
*/
public function testConstructMetadata() {
[ $page, $revisions ] = $this->getExistingPageWithRevisions( __METHOD__ );
$title = $page->getTitle();
$revision = $revisions['first'];
$content = $revision->getContent( SlotRecord::MAIN );
$expected = [
'id' => $revision->getId(),
'size' => $revision->getSize(),
'minor' => $revision->isMinor(),
'timestamp' => wfTimestampOrNull( TS_ISO_8601, $revision->getTimestamp() ),
'content_model' => $content->getModel(),
'page' => [
'id' => $title->getArticleID(),
'key' => $title->getPrefixedDBkey(),
'title' => $title->getPrefixedText(),
],
'license' => [
'url' => 'https://example.com/rights',
'title' => 'some rights',
],
'user' => [
'id' => $revision->getUser()->getId(),
'name' => $revision->getUser()->getName(),
],
'comment' => '',
'delta' => null, // first revision doesn't have a delta for now
];
$helper = $this->newHelper( [ 'id' => $revision->getId() ] );
$data = $helper->constructMetadata();
$this->assertEquals( $expected, $data );
}
}