3 namespace MediaWiki\Tests\Revision
;
5 use InvalidArgumentException
;
7 use MediaWiki\Revision\MainSlotRoleHandler
;
8 use MediaWiki\Revision\SlotRoleHandler
;
9 use MediaWiki\Revision\SlotRoleRegistry
;
10 use MediaWiki\Storage\NameTableStore
;
11 use MediaWikiTestCase
;
13 use Wikimedia\Assert\PostconditionException
;
16 * @covers \MediaWiki\Revision\SlotRoleRegistry
18 class SlotRoleRegistryTest
extends MediaWikiTestCase
{
20 private function makeBlankTitleObject() {
21 /** @var Title $title */
22 $title = $this->getMockBuilder( Title
::class )
23 ->disableOriginalConstructor()
29 private function makeNameTableStore( array $names = [] ) {
30 $mock = $this->getMockBuilder( NameTableStore
::class )
31 ->disableOriginalConstructor()
34 $mock->method( 'getMap' )
35 ->willReturn( $names );
40 private function newSlotRoleRegistry( NameTableStore
$roleNameStore = null ) {
41 if ( !$roleNameStore ) {
42 $roleNameStore = $this->makeNameTableStore();
45 return new SlotRoleRegistry( $roleNameStore );
49 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRole()
50 * @covers \MediaWiki\Revision\SlotRoleRegistry::getDefinedRoles()
51 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
52 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
54 public function testDefineRole() {
55 $registry = $this->newSlotRoleRegistry();
56 $registry->defineRole( 'foo', function ( $role ) {
57 return new SlotRoleHandler( $role, 'FooModel' );
60 $this->assertTrue( $registry->isDefinedRole( 'foo' ) );
61 $this->assertContains( 'foo', $registry->getDefinedRoles() );
62 $this->assertContains( 'foo', $registry->getKnownRoles() );
64 $handler = $registry->getRoleHandler( 'foo' );
65 $this->assertSame( 'foo', $handler->getRole() );
67 $title = $this->makeBlankTitleObject();
68 $this->assertSame( 'FooModel', $handler->getDefaultModel( $title ) );
72 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRole()
74 public function testDefineRoleFailsForDupe() {
75 $registry = $this->newSlotRoleRegistry();
76 $registry->defineRole( 'foo', function ( $role ) {
77 return new SlotRoleHandler( $role, 'FooModel' );
80 $this->setExpectedException( LogicException
::class );
81 $registry->defineRole( 'foo', function ( $role ) {
82 return new SlotRoleHandler( $role, 'FooModel' );
87 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRoleWithModel()
88 * @covers \MediaWiki\Revision\SlotRoleRegistry::getDefinedRoles()
89 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
90 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
92 public function testDefineRoleWithContentModel() {
93 $registry = $this->newSlotRoleRegistry();
94 $registry->defineRoleWithModel( 'foo', 'FooModel' );
96 $this->assertTrue( $registry->isDefinedRole( 'foo' ) );
97 $this->assertContains( 'foo', $registry->getDefinedRoles() );
98 $this->assertContains( 'foo', $registry->getKnownRoles() );
100 $handler = $registry->getRoleHandler( 'foo' );
101 $this->assertSame( 'foo', $handler->getRole() );
103 /** @var Title $title */
104 $title = $this->getMockBuilder( Title
::class )
105 ->disableOriginalConstructor()
107 $this->assertSame( 'FooModel', $handler->getDefaultModel( $title ) );
111 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
113 public function testGetRoleHandlerForUnknownModel() {
114 $registry = $this->newSlotRoleRegistry();
116 $this->setExpectedException( InvalidArgumentException
::class );
118 $registry->getRoleHandler( 'foo' );
122 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
124 public function testGetRoleHandlerFallbackHandler() {
125 $registry = $this->newSlotRoleRegistry(
126 $this->makeNameTableStore( [ 1 => 'foo' ] )
129 \Wikimedia\
suppressWarnings();
130 $handler = $registry->getRoleHandler( 'foo' );
131 $this->assertSame( 'foo', $handler->getRole() );
133 \Wikimedia\restoreWarnings
();
137 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
139 public function testGetRoleHandlerWithBadInstantiator() {
140 $registry = $this->newSlotRoleRegistry();
141 $registry->defineRole( 'foo', function ( $role ) {
142 return 'Not a SlotRoleHandler instance';
145 $this->setExpectedException( PostconditionException
::class );
146 $registry->getRoleHandler( 'foo' );
150 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRequiredRoles()
152 public function testGetRequiredRoles() {
153 $registry = $this->newSlotRoleRegistry();
154 $registry->defineRole( 'main', function ( $role ) {
155 return new MainSlotRoleHandler( [] );
158 $title = $this->makeBlankTitleObject();
159 $this->assertEquals( [ 'main' ], $registry->getRequiredRoles( $title ) );
163 * @covers \MediaWiki\Revision\SlotRoleRegistry::getAllowedRoles()
165 public function testGetAllowedRoles() {
166 $registry = $this->newSlotRoleRegistry();
167 $registry->defineRole( 'main', function ( $role ) {
168 return new MainSlotRoleHandler( [] );
170 $registry->defineRoleWithModel( 'foo', CONTENT_MODEL_TEXT
);
172 $title = $this->makeBlankTitleObject();
173 $this->assertEquals( [ 'main', 'foo' ], $registry->getAllowedRoles( $title ) );
177 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
178 * @covers \MediaWiki\Revision\SlotRoleRegistry::isKnownRole()
180 public function testGetKnownRoles() {
181 $registry = $this->newSlotRoleRegistry(
182 $this->makeNameTableStore( [ 1 => 'foo' ] )
184 $registry->defineRoleWithModel( 'bar', CONTENT_MODEL_TEXT
);
186 $this->assertTrue( $registry->isKnownRole( 'foo' ) );
187 $this->assertTrue( $registry->isKnownRole( 'bar' ) );
188 $this->assertFalse( $registry->isKnownRole( 'xyzzy' ) );
190 $title = $this->makeBlankTitleObject();
191 $this->assertArrayEquals( [ 'foo', 'bar' ], $registry->getKnownRoles( $title ) );