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