Merge "i18n: Clarify the default sidebar 'Help' link is about MediaWiki itself"
[lhc/web/wiklou.git] / tests / phpunit / includes / Revision / SlotRoleRegistryTest.php
1 <?php
2
3 namespace MediaWiki\Tests\Revision;
4
5 use InvalidArgumentException;
6 use LogicException;
7 use MediaWiki\Revision\MainSlotRoleHandler;
8 use MediaWiki\Revision\SlotRoleHandler;
9 use MediaWiki\Revision\SlotRoleRegistry;
10 use MediaWiki\Storage\NameTableStore;
11 use MediaWikiTestCase;
12 use Title;
13 use Wikimedia\Assert\PostconditionException;
14
15 /**
16 * @covers \MediaWiki\Revision\SlotRoleRegistry
17 */
18 class SlotRoleRegistryTest extends MediaWikiTestCase {
19
20 private function makeBlankTitleObject() {
21 /** @var Title $title */
22 $title = $this->getMockBuilder( Title::class )
23 ->disableOriginalConstructor()
24 ->getMock();
25
26 return $title;
27 }
28
29 private function makeNameTableStore( array $names = [] ) {
30 $mock = $this->getMockBuilder( NameTableStore::class )
31 ->disableOriginalConstructor()
32 ->getMock();
33
34 $mock->method( 'getMap' )
35 ->willReturn( $names );
36
37 return $mock;
38 }
39
40 private function newSlotRoleRegistry( NameTableStore $roleNameStore = null ) {
41 if ( !$roleNameStore ) {
42 $roleNameStore = $this->makeNameTableStore();
43 }
44
45 return new SlotRoleRegistry( $roleNameStore );
46 }
47
48 /**
49 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRole()
50 * @covers \MediaWiki\Revision\SlotRoleRegistry::getDefinedRoles()
51 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
52 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
53 */
54 public function testDefineRole() {
55 $registry = $this->newSlotRoleRegistry();
56 $registry->defineRole( 'foo', function ( $role ) {
57 return new SlotRoleHandler( $role, 'FooModel' );
58 } );
59
60 $this->assertTrue( $registry->isDefinedRole( 'foo' ) );
61 $this->assertContains( 'foo', $registry->getDefinedRoles() );
62 $this->assertContains( 'foo', $registry->getKnownRoles() );
63
64 $handler = $registry->getRoleHandler( 'foo' );
65 $this->assertSame( 'foo', $handler->getRole() );
66
67 $title = $this->makeBlankTitleObject();
68 $this->assertSame( 'FooModel', $handler->getDefaultModel( $title ) );
69 }
70
71 /**
72 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRole()
73 */
74 public function testDefineRoleFailsForDupe() {
75 $registry = $this->newSlotRoleRegistry();
76 $registry->defineRole( 'foo', function ( $role ) {
77 return new SlotRoleHandler( $role, 'FooModel' );
78 } );
79
80 $this->setExpectedException( LogicException::class );
81 $registry->defineRole( 'foo', function ( $role ) {
82 return new SlotRoleHandler( $role, 'FooModel' );
83 } );
84 }
85
86 /**
87 * @covers \MediaWiki\Revision\SlotRoleRegistry::defineRoleWithModel()
88 * @covers \MediaWiki\Revision\SlotRoleRegistry::getDefinedRoles()
89 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
90 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
91 */
92 public function testDefineRoleWithContentModel() {
93 $registry = $this->newSlotRoleRegistry();
94 $registry->defineRoleWithModel( 'foo', 'FooModel' );
95
96 $this->assertTrue( $registry->isDefinedRole( 'foo' ) );
97 $this->assertContains( 'foo', $registry->getDefinedRoles() );
98 $this->assertContains( 'foo', $registry->getKnownRoles() );
99
100 $handler = $registry->getRoleHandler( 'foo' );
101 $this->assertSame( 'foo', $handler->getRole() );
102
103 /** @var Title $title */
104 $title = $this->getMockBuilder( Title::class )
105 ->disableOriginalConstructor()
106 ->getMock();
107 $this->assertSame( 'FooModel', $handler->getDefaultModel( $title ) );
108 }
109
110 /**
111 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
112 */
113 public function testGetRoleHandlerForUnknownModel() {
114 $registry = $this->newSlotRoleRegistry();
115
116 $this->setExpectedException( InvalidArgumentException::class );
117
118 $registry->getRoleHandler( 'foo' );
119 }
120
121 /**
122 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
123 */
124 public function testGetRoleHandlerFallbackHandler() {
125 $registry = $this->newSlotRoleRegistry(
126 $this->makeNameTableStore( [ 1 => 'foo' ] )
127 );
128
129 \Wikimedia\suppressWarnings();
130 $handler = $registry->getRoleHandler( 'foo' );
131 $this->assertSame( 'foo', $handler->getRole() );
132
133 \Wikimedia\restoreWarnings();
134 }
135
136 /**
137 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRoleHandler()
138 */
139 public function testGetRoleHandlerWithBadInstantiator() {
140 $registry = $this->newSlotRoleRegistry();
141 $registry->defineRole( 'foo', function ( $role ) {
142 return 'Not a SlotRoleHandler instance';
143 } );
144
145 $this->setExpectedException( PostconditionException::class );
146 $registry->getRoleHandler( 'foo' );
147 }
148
149 /**
150 * @covers \MediaWiki\Revision\SlotRoleRegistry::getRequiredRoles()
151 */
152 public function testGetRequiredRoles() {
153 $registry = $this->newSlotRoleRegistry();
154 $registry->defineRole( 'main', function ( $role ) {
155 return new MainSlotRoleHandler( [] );
156 } );
157
158 $title = $this->makeBlankTitleObject();
159 $this->assertEquals( [ 'main' ], $registry->getRequiredRoles( $title ) );
160 }
161
162 /**
163 * @covers \MediaWiki\Revision\SlotRoleRegistry::getAllowedRoles()
164 */
165 public function testGetAllowedRoles() {
166 $registry = $this->newSlotRoleRegistry();
167 $registry->defineRole( 'main', function ( $role ) {
168 return new MainSlotRoleHandler( [] );
169 } );
170 $registry->defineRoleWithModel( 'foo', CONTENT_MODEL_TEXT );
171
172 $title = $this->makeBlankTitleObject();
173 $this->assertEquals( [ 'main', 'foo' ], $registry->getAllowedRoles( $title ) );
174 }
175
176 /**
177 * @covers \MediaWiki\Revision\SlotRoleRegistry::getKnownRoles()
178 * @covers \MediaWiki\Revision\SlotRoleRegistry::isKnownRole()
179 */
180 public function testGetKnownRoles() {
181 $registry = $this->newSlotRoleRegistry(
182 $this->makeNameTableStore( [ 1 => 'foo' ] )
183 );
184 $registry->defineRoleWithModel( 'bar', CONTENT_MODEL_TEXT );
185
186 $this->assertTrue( $registry->isKnownRole( 'foo' ) );
187 $this->assertTrue( $registry->isKnownRole( 'bar' ) );
188 $this->assertFalse( $registry->isKnownRole( 'xyzzy' ) );
189
190 $title = $this->makeBlankTitleObject();
191 $this->assertArrayEquals( [ 'foo', 'bar' ], $registry->getKnownRoles( $title ) );
192 }
193
194 }