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
{
23 private function makeBlankTitleObject() {
24 return $this->createMock( Title
::class );
27 private function makeNameTableStore( array $names = [] ) {
28 $mock = $this->getMockBuilder( NameTableStore
::class )
29 ->disableOriginalConstructor()
32 $mock->method( 'getMap' )
33 ->willReturn( $names );
38 private function newSlotRoleRegistry( NameTableStore
$roleNameStore = null ) {
39 if ( !$roleNameStore ) {
40 $roleNameStore = $this->makeNameTableStore();
43 return new SlotRoleRegistry( $roleNameStore );
47 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRole()
48 * @covers \MediaWiki\Revision\SlotRoleRegistry::getDefinedRoles()
49 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
50 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
52 public function testDefineRole() {
53 $registry = $this->newSlotRoleRegistry();
54 $registry->defineRole( 'foo', function ( $role ) {
55 return new SlotRoleHandler( $role, 'FooModel' );
58 $this->assertTrue( $registry->isDefinedRole( 'foo' ) );
59 $this->assertContains( 'foo', $registry->getDefinedRoles() );
60 $this->assertContains( 'foo', $registry->getKnownRoles() );
62 $handler = $registry->getRoleHandler( 'foo' );
63 $this->assertSame( 'foo', $handler->getRole() );
65 $title = $this->makeBlankTitleObject();
66 $this->assertSame( 'FooModel', $handler->getDefaultModel( $title ) );
70 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRole()
72 public function testDefineRoleFailsForDupe() {
73 $registry = $this->newSlotRoleRegistry();
74 $registry->defineRole( 'foo', function ( $role ) {
75 return new SlotRoleHandler( $role, 'FooModel' );
78 $this->setExpectedException( LogicException
::class );
79 $registry->defineRole( 'foo', function ( $role ) {
80 return new SlotRoleHandler( $role, 'FooModel' );
85 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRoleWithModel()
86 * @covers \MediaWiki\Revision\SlotRoleRegistry::getDefinedRoles()
87 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
88 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
90 public function testDefineRoleWithContentModel() {
91 $registry = $this->newSlotRoleRegistry();
92 $registry->defineRoleWithModel( 'foo', 'FooModel' );
94 $this->assertTrue( $registry->isDefinedRole( 'foo' ) );
95 $this->assertContains( 'foo', $registry->getDefinedRoles() );
96 $this->assertContains( 'foo', $registry->getKnownRoles() );
98 $handler = $registry->getRoleHandler( 'foo' );
99 $this->assertSame( 'foo', $handler->getRole() );
101 /** @var Title $title */
102 $title = $this->getMockBuilder( Title
::class )
103 ->disableOriginalConstructor()
105 $this->assertSame( 'FooModel', $handler->getDefaultModel( $title ) );
109 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
111 public function testGetRoleHandlerForUnknownModel() {
112 $registry = $this->newSlotRoleRegistry();
114 $this->setExpectedException( InvalidArgumentException
::class );
116 $registry->getRoleHandler( 'foo' );
120 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
122 public function testGetRoleHandlerFallbackHandler() {
123 $registry = $this->newSlotRoleRegistry(
124 $this->makeNameTableStore( [ 1 => 'foo' ] )
127 \Wikimedia\
suppressWarnings();
128 $handler = $registry->getRoleHandler( 'foo' );
129 $this->assertSame( 'foo', $handler->getRole() );
131 \Wikimedia\restoreWarnings
();
135 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
137 public function testGetRoleHandlerWithBadInstantiator() {
138 $registry = $this->newSlotRoleRegistry();
139 $registry->defineRole( 'foo', function ( $role ) {
140 return 'Not a SlotRoleHandler instance';
143 $this->setExpectedException( PostconditionException
::class );
144 $registry->getRoleHandler( 'foo' );
148 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRequiredRoles()
150 public function testGetRequiredRoles() {
151 $registry = $this->newSlotRoleRegistry();
152 $registry->defineRole( 'main', function ( $role ) {
153 return new MainSlotRoleHandler( [] );
156 $title = $this->makeBlankTitleObject();
157 $this->assertEquals( [ 'main' ], $registry->getRequiredRoles( $title ) );
161 * @covers \MediaWiki\Revision\SlotRoleRegistry::getAllowedRoles()
163 public function testGetAllowedRoles() {
164 $registry = $this->newSlotRoleRegistry();
165 $registry->defineRole( 'main', function ( $role ) {
166 return new MainSlotRoleHandler( [] );
168 $registry->defineRoleWithModel( 'foo', CONTENT_MODEL_TEXT
);
170 $title = $this->makeBlankTitleObject();
171 $this->assertEquals( [ 'main', 'foo' ], $registry->getAllowedRoles( $title ) );
175 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
176 * @covers \MediaWiki\Revision\SlotRoleRegistry::isKnownRole()
178 public function testGetKnownRoles() {
179 $registry = $this->newSlotRoleRegistry(
180 $this->makeNameTableStore( [ 1 => 'foo' ] )
182 $registry->defineRoleWithModel( 'bar', CONTENT_MODEL_TEXT
);
184 $this->assertTrue( $registry->isKnownRole( 'foo' ) );
185 $this->assertTrue( $registry->isKnownRole( 'bar' ) );
186 $this->assertFalse( $registry->isKnownRole( 'xyzzy' ) );
188 $title = $this->makeBlankTitleObject();
189 $this->assertArrayEquals( [ 'foo', 'bar' ], $registry->getKnownRoles( $title ) );