3 use MediaWiki\Block\BlockRestrictionStore
;
4 use MediaWiki\Block\CompositeBlock
;
5 use MediaWiki\Block\Restriction\PageRestriction
;
6 use MediaWiki\Block\Restriction\NamespaceRestriction
;
7 use MediaWiki\Block\SystemBlock
;
8 use MediaWiki\MediaWikiServices
;
13 * @coversDefaultClass \MediaWiki\Block\CompositeBlock
15 class CompositeBlockTest
extends MediaWikiLangTestCase
{
16 private function getPartialBlocks() {
17 $sysopId = $this->getTestSysop()->getUser()->getId();
19 $userBlock = new Block( [
20 'address' => $this->getTestUser()->getUser(),
24 $ipBlock = new Block( [
25 'address' => '127.0.0.1',
39 private function deleteBlocks( $blocks ) {
40 foreach ( $blocks as $block ) {
46 * @covers ::__construct
47 * @dataProvider provideTestStrictestParametersApplied
49 public function testStrictestParametersApplied( $blocks, $expected ) {
50 $this->setMwGlobals( [
51 'wgBlockDisablesLogin' => false,
52 'wgBlockAllowsUTEdit' => true,
55 $block = new CompositeBlock( [
56 'originalBlocks' => $blocks,
59 $this->assertSame( $expected[ 'hideName' ], $block->getHideName() );
60 $this->assertSame( $expected[ 'sitewide' ], $block->isSitewide() );
61 $this->assertSame( $expected[ 'blockEmail' ], $block->isEmailBlocked() );
62 $this->assertSame( $expected[ 'allowUsertalk' ], $block->isUsertalkEditAllowed() );
65 public static function provideTestStrictestParametersApplied() {
67 'Sitewide block and partial block' => [
72 'allowUsertalk' => true,
76 'blockEmail' => false,
77 'allowUsertalk' => false,
84 'allowUsertalk' => false,
87 'Partial block and system block' => [
92 'allowUsertalk' => false,
95 'systemBlock' => 'proxy',
101 'blockEmail' => true,
102 'allowUsertalk' => false,
105 'System block and user name hiding block' => [
110 'blockEmail' => true,
111 'allowUsertalk' => false,
114 'systemBlock' => 'proxy',
120 'blockEmail' => true,
121 'allowUsertalk' => false,
124 'Two lenient partial blocks' => [
128 'blockEmail' => false,
129 'allowUsertalk' => true,
133 'blockEmail' => false,
134 'allowUsertalk' => true,
140 'blockEmail' => false,
141 'allowUsertalk' => true,
148 * @covers ::appliesToTitle
150 public function testBlockAppliesToTitle() {
151 $this->setMwGlobals( [
152 'wgBlockDisablesLogin' => false,
155 $blocks = $this->getPartialBlocks();
157 $block = new CompositeBlock( [
158 'originalBlocks' => $blocks,
161 $pageFoo = $this->getExistingTestPage( 'Foo' );
162 $pageBar = $this->getExistingTestPage( 'User:Bar' );
164 $this->getBlockRestrictionStore()->insert( [
165 new PageRestriction( $blocks[ 'user' ]->getId(), $pageFoo->getId() ),
166 new NamespaceRestriction( $blocks[ 'ip' ]->getId(), NS_USER
),
169 $this->assertTrue( $block->appliesToTitle( $pageFoo->getTitle() ) );
170 $this->assertTrue( $block->appliesToTitle( $pageBar->getTitle() ) );
172 $this->deleteBlocks( $blocks );
176 * @covers ::appliesToUsertalk
177 * @covers ::appliesToPage
178 * @covers ::appliesToNamespace
180 public function testBlockAppliesToUsertalk() {
181 $this->setMwGlobals( [
182 'wgBlockAllowsUTEdit' => true,
183 'wgBlockDisablesLogin' => false,
186 $blocks = $this->getPartialBlocks();
188 $block = new CompositeBlock( [
189 'originalBlocks' => $blocks,
192 $title = $blocks[ 'user' ]->getTarget()->getTalkPage();
193 $page = $this->getExistingTestPage( 'User talk:' . $title->getText() );
195 $this->getBlockRestrictionStore()->insert( [
196 new PageRestriction( $blocks[ 'user' ]->getId(), $page->getId() ),
197 new NamespaceRestriction( $blocks[ 'ip' ]->getId(), NS_USER
),
200 $this->assertTrue( $block->appliesToUsertalk( $blocks[ 'user' ]->getTarget()->getTalkPage() ) );
202 $this->deleteBlocks( $blocks );
206 * @covers ::appliesToRight
207 * @dataProvider provideTestBlockAppliesToRight
209 public function testBlockAppliesToRight( $blocks, $right, $expected ) {
210 $this->setMwGlobals( [
211 'wgBlockDisablesLogin' => false,
214 $block = new CompositeBlock( [
215 'originalBlocks' => $blocks,
218 $this->assertSame( $block->appliesToRight( $right ), $expected );
221 public static function provideTestBlockAppliesToRight() {
223 'Read is not blocked' => [
231 'Email is blocked if blocked by any blocks' => [
234 'blockEmail' => true,
237 'blockEmail' => false,
247 * Get an instance of BlockRestrictionStore
249 * @return BlockRestrictionStore
251 protected function getBlockRestrictionStore() : BlockRestrictionStore
{
252 return MediaWikiServices
::getInstance()->getBlockRestrictionStore();