1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
<?php
namespace MediaWiki\Tests\Unit\Revision;
use MediaWiki\Content\ContentHandler;
use MediaWiki\Revision\MainSlotRoleHandler;
use MediaWiki\Revision\SlotRecord;
use MediaWiki\Tests\Unit\DummyServicesTrait;
use MediaWiki\Title\Title;
use MediaWiki\Title\TitleFactory;
use MediaWikiUnitTestCase;
use MockTitleTrait;
/**
* @covers \MediaWiki\Revision\MainSlotRoleHandler
*/
class MainSlotRoleHandlerTest extends MediaWikiUnitTestCase {
use DummyServicesTrait;
use MockTitleTrait;
/**
* @param string[] $namespaceContentModels
* @return MainSlotRoleHandler
*/
private function getRoleHandler( array $namespaceContentModels ) {
// The ContentHandlerFactory is only used for retrieving the content handler
// for the model in ::isAllowedModel(), so that that content handler can have
// ::canBeUsedOn() called. We only have tests for ::isAllowedModel() with
// CONTENT_MODEL_WIKITEXT and CONTENT_MODEL_TEXT, and neither TextContentHandler
// or WikitextContentHandler overrides the method ::canBeUsedOn(), instead using
// the default in ContentHandler::canBeUsedOn of returning true unless a hook
// says otherwise. That hook is called via ProtectedHookAccessorTrait and
// thus uses MediaWikiServices, which we can't have in this unit test. But, since
// we aren't testing anything with the hooks, we can just return a mock content
// handler that returns true directly
$contentHandler = $this->createMock( ContentHandler::class );
$contentHandler->method( 'canBeUsedOn' )->willReturn( true );
$contentHandlerFactory = $this->getDummyContentHandlerFactory( [
CONTENT_MODEL_WIKITEXT => $contentHandler,
CONTENT_MODEL_TEXT => $contentHandler,
] );
// TitleFactory that for these tests is only called with Title objects, so just
// return them
$titleFactory = $this->createMock( TitleFactory::class );
$titleFactory->method( 'newFromLinkTarget' )
->with( $this->isInstanceOf( Title::class ) )
->willReturnArgument( 0 );
$titleFactory->method( 'newFromPageIdentity' )
->with( $this->isInstanceOf( Title::class ) )
->willReturnArgument( 0 );
return new MainSlotRoleHandler(
$namespaceContentModels,
$contentHandlerFactory,
$this->createHookContainer(),
$titleFactory
);
}
public function testConstruction() {
$handler = $this->getRoleHandler( [] );
$this->assertSame( SlotRecord::MAIN, $handler->getRole() );
$this->assertSame( 'slot-name-main', $handler->getNameMessageKey() );
$hints = $handler->getOutputLayoutHints();
$this->assertArrayHasKey( 'display', $hints );
$this->assertArrayHasKey( 'region', $hints );
$this->assertArrayHasKey( 'placement', $hints );
}
public function testGetDefaultModel() {
$handler = $this->getRoleHandler(
[ 100 => CONTENT_MODEL_TEXT ]
);
// For the main handler, the namespace determins the default model
$titleMain = $this->makeMockTitle(
'Article',
[ 'namespace' => NS_MAIN ]
);
$this->assertSame( CONTENT_MODEL_WIKITEXT, $handler->getDefaultModel( $titleMain ) );
$title100 = $this->makeMockTitle(
'Other page',
[ 'namespace' => 100 ]
);
$this->assertSame( CONTENT_MODEL_TEXT, $handler->getDefaultModel( $title100 ) );
}
public function testIsAllowedModel() {
$handler = $this->getRoleHandler( [] );
// For the main handler, (nearly) all models are allowed
$title = $this->makeMockTitle(
'Article',
[ 'namespace' => NS_MAIN ]
);
$this->assertTrue( $handler->isAllowedModel( CONTENT_MODEL_WIKITEXT, $title ) );
$this->assertTrue( $handler->isAllowedModel( CONTENT_MODEL_TEXT, $title ) );
}
public function testSupportsArticleCount() {
$handler = $this->getRoleHandler( [] );
$this->assertTrue( $handler->supportsArticleCount() );
}
}
|