Skip to content

Commit 88bb6e9

Browse files
committed
Migrate to proper unit test
This requires mocking wfMessage, and moving to a unit/ subdirectory to indicate that we do not need to load MW when running these tests.
1 parent fa90cbb commit 88bb6e9

File tree

3 files changed

+156
-129
lines changed

3 files changed

+156
-129
lines changed

includes/Hooks.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,12 @@ public function onSpecialPageBeforeExecute( $special, $subPage ) {
114114
*/
115115
private static function denyAccess( OutputPage $output ): void {
116116
$output->setStatusCode( 403 );
117-
$output->setPageTitle( wfMessage( 'crawlerprotection-accessdenied-title' )->text() );
118-
$output->addWikiTextAsInterface( wfMessage( 'crawlerprotection-accessdenied-text' )->text() );
117+
$output->addWikiTextAsInterface( wfMessage( 'crawlerprotection-accessdenied-text' )->plain() );
118+
119+
if ( version_compare( MW_VERSION, '1.41', '<' ) ) {
120+
$output->setPageTitle( wfMessage( 'crawlerprotection-accessdenied-title' ) );
121+
} else {
122+
$output->setPageTitleMsg( wfMessage( 'crawlerprotection-accessdenied-title' ) );
123+
}
119124
}
120125
}

tests/phpunit/HooksTest.php

Lines changed: 0 additions & 127 deletions
This file was deleted.

tests/phpunit/unit/HooksTest.php

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
<?php
2+
3+
namespace MediaWiki\Extension\CrawlerProtection\Tests {
4+
5+
use MediaWiki\Extension\CrawlerProtection\Hooks;
6+
use PHPUnit\Framework\Constraint\RegularExpression;
7+
use PHPUnit\Framework\TestCase;
8+
9+
/**
10+
* @coversDefaultClass \MediaWiki\Extension\CrawlerProtection\Hooks
11+
*/
12+
class HooksTest extends TestCase {
13+
/** @var string */
14+
private static string $actionEntryPointClassName;
15+
16+
/** @var string */
17+
private static string $articleClassName;
18+
19+
/** @var string */
20+
private static string $outputPageClassName;
21+
22+
/** @var string */
23+
private static string $titleClassName;
24+
25+
/** @var string */
26+
private static string $userClassName;
27+
28+
/** @var string */
29+
private static string $webRequestClassName;
30+
31+
public static function setUpBeforeClass(): void {
32+
self::$actionEntryPointClassName = class_exists( '\MediaWiki\Actions\ActionEntryPoint' )
33+
? '\MediaWiki\Actions\ActionEntryPoint'
34+
: '\MediaWiki';
35+
36+
self::$articleClassName = class_exists( '\MediaWiki\Page\Article' )
37+
? '\MediaWiki\Page\Article'
38+
: '\Article';
39+
40+
self::$outputPageClassName = class_exists( '\MediaWiki\Output\OutputPage' )
41+
? '\MediaWiki\Output\OutputPage'
42+
: '\OutputPage';
43+
44+
self::$titleClassName = class_exists( '\MediaWiki\Title\Title' )
45+
? '\MediaWiki\Title\Title'
46+
: '\Title';
47+
48+
self::$userClassName = class_exists( '\MediaWiki\User\User' )
49+
? '\MediaWiki\User\User'
50+
: '\User';
51+
52+
self::$webRequestClassName = class_exists( '\MediaWiki\Request\WebRequest' )
53+
? '\MediaWiki\Request\WebRequest'
54+
: '\WebRequest';
55+
}
56+
57+
/**
58+
* @covers ::onMediaWikiPerformAction
59+
*/
60+
public function testRevisionTypeBlocksAnonymous() {
61+
$output = $this->createMock( self::$outputPageClassName );
62+
$output->expects( $this->once() )->method( new RegularExpression( '/^setPageTitle(Msg)?$/' ) );
63+
$output->expects( $this->once() )->method( 'addWikiTextAsInterface' );
64+
$output->expects( $this->once() )->method( 'setStatusCode' )->with( 403 );
65+
66+
$request = $this->createMock( self::$webRequestClassName );
67+
$request->method( 'getVal' )->willReturnMap( [
68+
[ 'type', null, 'revision' ],
69+
] );
70+
71+
$user = $this->createMock( self::$userClassName );
72+
$user->method( 'isRegistered' )->willReturn( false );
73+
74+
$article = $this->createMock( self::$articleClassName );
75+
$title = $this->createMock( self::$titleClassName );
76+
$wiki = $this->createMock( self::$actionEntryPointClassName );
77+
78+
$runner = new Hooks();
79+
$result = $runner->onMediaWikiPerformAction( $output, $article, $title, $user, $request, $wiki );
80+
$this->assertFalse( $result );
81+
}
82+
83+
/**
84+
* @covers ::onMediaWikiPerformAction
85+
*/
86+
public function testRevisionTypeAllowsLoggedIn() {
87+
$output = $this->createMock( self::$outputPageClassName );
88+
89+
$request = $this->createMock( self::$webRequestClassName );
90+
$request->method( 'getVal' )->willReturnMap( [
91+
[ 'type', null, 'revision' ],
92+
] );
93+
94+
$user = $this->createMock( self::$userClassName );
95+
$user->method( 'isRegistered' )->willReturn( true );
96+
97+
$article = $this->createMock( self::$articleClassName );
98+
$title = $this->createMock( self::$titleClassName );
99+
$wiki = $this->createMock( self::$actionEntryPointClassName );
100+
101+
$runner = new Hooks();
102+
$result = $runner->onMediaWikiPerformAction( $output, $article, $title, $user, $request, $wiki );
103+
$this->assertTrue( $result );
104+
}
105+
106+
/**
107+
* @covers ::onMediaWikiPerformAction
108+
*/
109+
public function testNonRevisionTypeAlwaysAllowed() {
110+
$output = $this->createMock( self::$outputPageClassName );
111+
112+
$request = $this->createMock( self::$webRequestClassName );
113+
$request->method( 'getVal' )->willReturnMap( [
114+
[ 'type', null, 'view' ],
115+
] );
116+
117+
$user = $this->createMock( self::$userClassName );
118+
$user->method( 'isRegistered' )->willReturn( false );
119+
120+
$article = $this->createMock( self::$articleClassName );
121+
$title = $this->createMock( self::$titleClassName );
122+
$wiki = $this->createMock( self::$actionEntryPointClassName );
123+
124+
$runner = new Hooks();
125+
$result = $runner->onMediaWikiPerformAction( $output, $article, $title, $user, $request, $wiki );
126+
$this->assertTrue( $result );
127+
}
128+
}
129+
}
130+
131+
// Override wfMessage so we can properly mock the returned Message
132+
namespace MediaWiki\Extension\CrawlerProtection {
133+
134+
use MediaWiki\Message\Message;
135+
136+
class MessageStub extends Message {
137+
public function __construct( $key, $params ) {
138+
parent::__construct( $key, $params );
139+
}
140+
141+
public function plain() {
142+
return null;
143+
}
144+
}
145+
146+
function wfMessage( $key, ...$params ) {
147+
return new MessageStub( $key, $params );
148+
}
149+
}

0 commit comments

Comments
 (0)