mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/ConfirmEdit
synced 2024-12-12 16:25:14 +00:00
4228dbd2b7
This breaks later tests, e.g.: https://gerrit.wikimedia.org/r/c/mediawiki/core/+/450433 https://gerrit.wikimedia.org/r/c/mediawiki/core/+/465423 The only reason this didn't cause test failures until now is because the namespace data was getting (incorrectly) cached in between tests. As soon as we start resetting namespaces for each test, namespaces set by the extension registry get wiped out by these tests. Change-Id: Icb7a4a2a5d19fb1f2453b4b57a5271196b0e316d
217 lines
5.4 KiB
PHP
217 lines
5.4 KiB
PHP
<?php
|
|
|
|
use Wikimedia\ScopedCallback;
|
|
use Wikimedia\TestingAccessWrapper;
|
|
|
|
/**
|
|
* @covers SimpleCaptcha
|
|
*/
|
|
class CaptchaTest extends MediaWikiTestCase {
|
|
|
|
/** @var ScopedCallback[] */
|
|
private $hold = [];
|
|
|
|
public function tearDown() {
|
|
// Destroy any ScopedCallbacks being held
|
|
$this->hold = [];
|
|
parent::tearDown();
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideSimpleTriggersCaptcha
|
|
*/
|
|
public function testTriggersCaptcha( $action, $expectedResult ) {
|
|
$captcha = new SimpleCaptcha();
|
|
$this->setMwGlobals( [
|
|
'wgCaptchaTriggers' => [
|
|
$action => $expectedResult,
|
|
]
|
|
] );
|
|
$this->assertEquals( $expectedResult, $captcha->triggersCaptcha( $action ) );
|
|
}
|
|
|
|
public function provideSimpleTriggersCaptcha() {
|
|
$data = [];
|
|
$captchaTriggers = new ReflectionClass( CaptchaTriggers::class );
|
|
$constants = $captchaTriggers->getConstants();
|
|
foreach ( $constants as $const ) {
|
|
$data[] = [ $const, true ];
|
|
$data[] = [ $const, false ];
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideNamespaceOverwrites
|
|
*/
|
|
public function testNamespaceTriggersOverwrite( $trigger, $expected ) {
|
|
$captcha = new SimpleCaptcha();
|
|
$this->setMwGlobals( [
|
|
'wgCaptchaTriggers' => [
|
|
$trigger => !$expected,
|
|
],
|
|
'wgCaptchaTriggersOnNamespace' => [
|
|
0 => [
|
|
$trigger => $expected,
|
|
],
|
|
],
|
|
] );
|
|
$title = Title::newFromText( 'Main' );
|
|
$this->assertEquals( $expected, $captcha->triggersCaptcha( $trigger, $title ) );
|
|
}
|
|
|
|
public function provideNamespaceOverwrites() {
|
|
return [
|
|
[ 'edit', true ],
|
|
[ 'edit', false ],
|
|
];
|
|
}
|
|
|
|
private function setCaptchaTriggersAttribute( $trigger, $value ) {
|
|
// XXX This is really hacky, but is needed to stop extensions from
|
|
// being clobbered in subsequent tests. This should be fixed properly
|
|
// by making extension registration happen in services instead of
|
|
// globals.
|
|
$keys =
|
|
TestingAccessWrapper::newFromClass( ExtensionProcessor::class )->globalSettings;
|
|
$globalsToStash = [];
|
|
foreach ( $keys as $key ) {
|
|
$globalsToStash["wg$key"] = $GLOBALS["wg$key"];
|
|
}
|
|
$this->setMwGlobals( $globalsToStash );
|
|
|
|
$info = [
|
|
'globals' => [],
|
|
'callbacks' => [],
|
|
'defines' => [],
|
|
'credits' => [],
|
|
'attributes' => [
|
|
'CaptchaTriggers' => [
|
|
$trigger => $value
|
|
]
|
|
],
|
|
'autoloaderPaths' => []
|
|
];
|
|
$this->hold[] = ExtensionRegistry::getInstance()->setAttributeForTest(
|
|
'CaptchaTriggers', [ $trigger => $value ]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideAttributeSet
|
|
*/
|
|
public function testCaptchaTriggersAttributeSetTrue( $trigger, $value ) {
|
|
$this->setCaptchaTriggersAttribute( $trigger, $value );
|
|
$captcha = new SimpleCaptcha();
|
|
$this->assertEquals( $value, $captcha->triggersCaptcha( $trigger ) );
|
|
}
|
|
|
|
public function provideAttributeSet() {
|
|
return [
|
|
[ 'test', true ],
|
|
[ 'test', false ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideAttributeOverwritten
|
|
*/
|
|
public function testCaptchaTriggersAttributeGetsOverwritten( $trigger, $expected ) {
|
|
$this->setMwGlobals( [
|
|
'wgCaptchaTriggers' => [
|
|
$trigger => $expected
|
|
]
|
|
] );
|
|
$this->setCaptchaTriggersAttribute( $trigger, !$expected );
|
|
$captcha = new SimpleCaptcha();
|
|
$this->assertEquals( $expected, $captcha->triggersCaptcha( $trigger ) );
|
|
}
|
|
|
|
public function provideAttributeOverwritten() {
|
|
return [
|
|
[ 'edit', true ],
|
|
[ 'edit', false ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideCanSkipCaptchaUserright
|
|
*/
|
|
public function testCanSkipCaptchaUserright( $userIsAllowed, $expected ) {
|
|
$testObject = new SimpleCaptcha();
|
|
$user = $this->getMock( User::class );
|
|
$user->method( 'isAllowed' )->willReturn( $userIsAllowed );
|
|
|
|
$actual = $testObject->canSkipCaptcha( $user, RequestContext::getMain()->getConfig() );
|
|
|
|
$this->assertEquals( $expected, $actual );
|
|
}
|
|
|
|
public function provideCanSkipCaptchaUserright() {
|
|
return [
|
|
[ true, true ],
|
|
[ false, false ]
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @param $allowUserConfirmEmail
|
|
* @param $userIsMailConfirmed
|
|
* @param $expected
|
|
* @throws ConfigException
|
|
* @dataProvider provideCanSkipCaptchaMailconfirmed
|
|
*/
|
|
public function testCanSkipCaptchaMailconfirmed( $allowUserConfirmEmail,
|
|
$userIsMailConfirmed, $expected ) {
|
|
$testObject = new SimpleCaptcha();
|
|
$user = $this->getMock( User::class );
|
|
$user->method( 'isEmailConfirmed' )->willReturn( $userIsMailConfirmed );
|
|
$config = $this->getMock( Config::class );
|
|
$config->method( 'get' )->willReturn( $allowUserConfirmEmail );
|
|
|
|
$actual = $testObject->canSkipCaptcha( $user, $config );
|
|
|
|
$this->assertEquals( $expected, $actual );
|
|
}
|
|
|
|
public function provideCanSkipCaptchaMailconfirmed() {
|
|
return [
|
|
[ false, false, false ],
|
|
[ false, true, false ],
|
|
[ true, false, false ],
|
|
[ true, true, true ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @param $requestIP
|
|
* @param $IPWhitelist
|
|
* @param $expected
|
|
* @throws ConfigException
|
|
* @dataProvider provideCanSkipCaptchaIPWhitelisted
|
|
*/
|
|
public function testCanSkipCaptchaIPWhitelisted( $requestIP, $IPWhitelist, $expected ) {
|
|
$testObject = new SimpleCaptcha();
|
|
$config = $this->getMock( Config::class );
|
|
$request = $this->getMock( WebRequest::class );
|
|
$request->method( 'getIP' )->willReturn( $requestIP );
|
|
|
|
$this->setMwGlobals( [
|
|
'wgRequest' => $request,
|
|
'wgCaptchaWhitelistIP' => $IPWhitelist
|
|
] );
|
|
|
|
$actual = $testObject->canSkipCaptcha( RequestContext::getMain()->getUser(), $config );
|
|
|
|
$this->assertEquals( $expected, $actual );
|
|
}
|
|
|
|
public function provideCanSkipCaptchaIPWhitelisted() {
|
|
return ( [
|
|
[ '127.0.0.1', [ '127.0.0.1', '127.0.0.2' ], true ],
|
|
[ '127.0.0.1', [], false ]
|
|
]
|
|
);
|
|
}
|
|
}
|