wiki.techinc.nl/tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php
Thiemo Kreuz 9e6e3f8d08 Inline a few more trivial createMock() calls in tests
createMock() is still relatively new. This code was using more
complicated mock builders before. This was changed just recently.
createMock() is now so short, the extra helper methods don't make
the code more readable, I would argue.

Change-Id: Ia7e24827157d5f49fc7da102418c79ae33c8e053
2022-08-08 09:50:50 +02:00

163 lines
5.9 KiB
PHP

<?php
namespace MediaWiki\Auth;
use MediaWiki\Tests\Unit\Auth\AuthenticationProviderTestTrait;
use MediaWiki\User\UserNameUtils;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Wikimedia\ObjectFactory\ObjectFactory;
use Wikimedia\TestingAccessWrapper;
/**
* @covers \MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider
* @group Database
*/
class EmailNotificationSecondaryAuthenticationProviderTest extends \MediaWikiIntegrationTestCase {
use AuthenticationProviderTestTrait;
/**
* @param array $options
* @return EmailNotificationSecondaryAuthenticationProvider
*/
private function getProvider( array $options = [] ): EmailNotificationSecondaryAuthenticationProvider {
$services = $this->getServiceContainer();
$provider = new EmailNotificationSecondaryAuthenticationProvider(
$options['loadBalancer'] ?? $services->getDBLoadBalancer(),
$options // make things easier for tests by using the same options
);
$this->initProvider(
$provider,
$options['config'] ?? null,
$options['logger'] ?? null,
$options['authManager'] ?? null,
$options['hookContainer'] ?? null,
$options['userNameUtils'] ?? null
);
return $provider;
}
public function testConstructor() {
$config = new \HashConfig( [
'EnableEmail' => true,
'EmailAuthentication' => true,
] );
$provider = $this->getProvider( [
'config' => $config,
] );
$providerPriv = TestingAccessWrapper::newFromObject( $provider );
$this->assertTrue( $providerPriv->sendConfirmationEmail );
$provider = $this->getProvider( [
'config' => $config,
'sendConfirmationEmail' => false,
] );
$providerPriv = TestingAccessWrapper::newFromObject( $provider );
$this->assertFalse( $providerPriv->sendConfirmationEmail );
}
/**
* @dataProvider provideGetAuthenticationRequests
* @param string $action
* @param AuthenticationRequest[] $expected
*/
public function testGetAuthenticationRequests( $action, $expected ) {
$provider = $this->getProvider( [
'sendConfirmationEmail' => true,
] );
$this->assertSame( $expected, $provider->getAuthenticationRequests( $action, [] ) );
}
public function provideGetAuthenticationRequests() {
return [
[ AuthManager::ACTION_LOGIN, [] ],
[ AuthManager::ACTION_CREATE, [] ],
[ AuthManager::ACTION_LINK, [] ],
[ AuthManager::ACTION_CHANGE, [] ],
[ AuthManager::ACTION_REMOVE, [] ],
];
}
public function testBeginSecondaryAuthentication() {
$provider = $this->getProvider( [
'sendConfirmationEmail' => true,
] );
$this->assertEquals( AuthenticationResponse::newAbstain(),
$provider->beginSecondaryAuthentication( \User::newFromName( 'Foo' ), [] ) );
}
public function testBeginSecondaryAccountCreation() {
$mwServices = $this->getServiceContainer();
$hookContainer = $this->createHookContainer();
$userNameUtils = $this->createNoOpMock( UserNameUtils::class );
$authManager = new AuthManager(
new \FauxRequest(),
new \HashConfig(),
new ObjectFactory( $this->createNoOpAbstractMock( ContainerInterface::class ) ),
$hookContainer,
$mwServices->getReadOnlyMode(),
$userNameUtils,
$mwServices->getBlockManager(),
$mwServices->getWatchlistManager(),
$mwServices->getDBLoadBalancer(),
$mwServices->getContentLanguage(),
$mwServices->getLanguageConverterFactory(),
$mwServices->getBotPasswordStore(),
$mwServices->getUserFactory(),
$mwServices->getUserIdentityLookup(),
$mwServices->getUserOptionsManager()
);
$creator = $this->createMock( \User::class );
$userWithoutEmail = $this->createMock( \User::class );
$userWithoutEmail->method( 'getEmail' )->willReturn( '' );
$userWithoutEmail->method( 'getInstanceForUpdate' )->willReturnSelf();
$userWithoutEmail->expects( $this->never() )->method( 'sendConfirmationMail' );
$userWithEmailError = $this->createMock( \User::class );
$userWithEmailError->method( 'getEmail' )->willReturn( 'foo@bar.baz' );
$userWithEmailError->method( 'getInstanceForUpdate' )->willReturnSelf();
$userWithEmailError->method( 'sendConfirmationMail' )
->willReturn( \Status::newFatal( 'fail' ) );
$userExpectsConfirmation = $this->createMock( \User::class );
$userExpectsConfirmation->method( 'getEmail' )
->willReturn( 'foo@bar.baz' );
$userExpectsConfirmation->method( 'getInstanceForUpdate' )
->willReturnSelf();
$userExpectsConfirmation->expects( $this->once() )->method( 'sendConfirmationMail' )
->willReturn( \Status::newGood() );
$userNotExpectsConfirmation = $this->createMock( \User::class );
$userNotExpectsConfirmation->method( 'getEmail' )
->willReturn( 'foo@bar.baz' );
$userNotExpectsConfirmation->method( 'getInstanceForUpdate' )
->willReturnSelf();
$userNotExpectsConfirmation->expects( $this->never() )->method( 'sendConfirmationMail' );
$provider = $this->getProvider( [
'sendConfirmationEmail' => false,
'authManager' => $authManager,
'hookContainer' => $hookContainer,
'userNameUtils' => $userNameUtils
] );
$provider->beginSecondaryAccountCreation( $userNotExpectsConfirmation, $creator, [] );
$provider = $this->getProvider( [
'sendConfirmationEmail' => true,
'authManager' => $authManager,
'userNameUtils' => $userNameUtils
] );
$provider->beginSecondaryAccountCreation( $userWithoutEmail, $creator, [] );
$provider->beginSecondaryAccountCreation( $userExpectsConfirmation, $creator, [] );
// test logging of email errors
$logger = $this->getMockForAbstractClass( LoggerInterface::class );
$logger->expects( $this->once() )->method( 'warning' );
$this->initProvider( $provider, null, $logger, $authManager );
$provider->beginSecondaryAccountCreation( $userWithEmailError, $creator, [] );
// test disable flag used by other providers
$authManager->setAuthenticationSessionData( 'no-email', true );
$this->initProvider( $provider, null, null, $authManager );
$provider->beginSecondaryAccountCreation( $userNotExpectsConfirmation, $creator, [] );
}
}