wiki.techinc.nl/tests/phpunit/includes/exception/UserNotLoggedInTest.php
Dreamy Jazz 0fa81768c2 Send temporary accounts to Special:CreateAccount on ::requireNamed
Why:
* When code throws a UserNotLoggedIn error for a temporary account,
  this takes them to Special:UserLogin and asks them to log in to
  an account
* Users using temporary accounts are less likely to have a named
  account, so should instead be sent to Special:CreateAccount
  (as described in T358586)
* When doing this, the warning message should be customised to
  talk about the user needing to create an account (and not
  log in)

What:
* Update UserNotLoggedIn to redirect to Special:CreateAccount
  when the user is logged in to a temporary account
** The code which constructs the exception object can override
   this and force the redirect to always be to Special:UserLogin.
* When the redirect is to Special:CreateAccount, allow customising
  the message shown by adding a '-for-temp-user' suffix to the
  message key in UserNotLoggedIn.
** This suffix is only added if the resulting message exists,
   so that code can choose whether they need a message that is
   different to the one on Special:UserLogin.
* Update SpecialPage::requiredNamedUser to allow special pages to
  force the redirect to always be to Special:UserLogin
** This is made use of in Special:ChangeEmail and
   Special:ConfirmEmail, as these special pages only make sense
   for use with an existing account.
* Update and add message keys to allow a different message for
  Special:CreateAccount.
* Update and add tests for these changes.

Bug: T358586
Change-Id: Ie0dd06f51b1e2b85eef6be377f673a02732ce604
2024-09-24 21:42:17 +00:00

111 lines
3.8 KiB
PHP

<?php
use MediaWiki\Context\RequestContext;
use MediaWiki\Request\FauxRequest;
use MediaWiki\Tests\User\TempUser\TempUserTestTrait;
use MediaWiki\Title\Title;
/**
* @covers \UserNotLoggedIn
* @author Addshore
* @author Dreamy Jazz
* @group Database
*/
class UserNotLoggedInTest extends MediaWikiIntegrationTestCase {
use TempUserTestTrait;
/** @dataProvider provideConstruction */
public function testConstruction( $userIsTemp, $expectedReasonMsgKey ) {
if ( $userIsTemp ) {
$this->enableAutoCreateTempUser();
$user = $this->getServiceContainer()->getTempUserCreator()->create( null, new FauxRequest() )->getUser();
RequestContext::getMain()->setUser( $user );
}
$e = new UserNotLoggedIn();
$this->assertEquals( 'exception-nologin', $e->title );
$this->assertEquals( $expectedReasonMsgKey, $e->msg );
$this->assertEquals( [], $e->params );
}
public static function provideConstruction() {
return [
'User is not a temporary account' => [ false, 'exception-nologin-text' ],
'User is a temporary account' => [ true, 'exception-nologin-text-for-temp-user' ],
];
}
public function testConstructionForTempAccountWithAlwaysRedirectToLoginPageSet() {
$this->enableAutoCreateTempUser();
$user = $this->getServiceContainer()->getTempUserCreator()->create( null, new FauxRequest() )->getUser();
RequestContext::getMain()->setUser( $user );
$e = new UserNotLoggedIn( 'exception-nologin-text', 'exception-nologin', [], true );
$this->assertEquals( 'exception-nologin', $e->title );
$this->assertEquals( 'exception-nologin-text', $e->msg );
$this->assertEquals( [], $e->params );
}
public function testConstructionForReasonMsgWithoutTemporaryAccountEquivalent() {
$this->enableAutoCreateTempUser();
$user = $this->getServiceContainer()->getTempUserCreator()->create( null, new FauxRequest() )->getUser();
RequestContext::getMain()->setUser( $user );
$e = new UserNotLoggedIn( 'changeemail-no-info' );
$this->assertEquals( 'changeemail-no-info', $e->msg );
}
/** @dataProvider provideTemporaryAccountsEnabled */
public function testReportForRedirectToLoginPage( $temporaryAccountsEnabled ) {
if ( $temporaryAccountsEnabled ) {
$this->enableAutoCreateTempUser();
} else {
$this->disableAutoCreateTempUser();
}
RequestContext::getMain()->setTitle( Title::newFromText( 'Preferences', NS_SPECIAL ) );
$e = new UserNotLoggedIn();
$e->report();
$redirectUrl = RequestContext::getMain()->getOutput()->getRedirect();
$parsedUrlParts = $this->getServiceContainer()->getUrlUtils()->parse( $redirectUrl );
$this->assertNotNull( $parsedUrlParts );
$this->assertArrayEquals(
[
'title' => 'Special:UserLogin',
'returntoquery' => '',
'returnto' => 'Special:Preferences',
'warning' => 'exception-nologin-text',
],
wfCgiToArray( $parsedUrlParts['query'] ),
false,
true
);
}
public static function provideTemporaryAccountsEnabled() {
return [
'Temporary accounts disabled' => [ false ],
'Temporary accounts enabled' => [ true ],
];
}
public function testReportForRedirectToAccountCreationPage() {
$this->enableAutoCreateTempUser();
$user = $this->getServiceContainer()->getTempUserCreator()->create( null, new FauxRequest() )->getUser();
RequestContext::getMain()->setUser( $user );
RequestContext::getMain()->setTitle( Title::newFromText( 'Preferences', NS_SPECIAL ) );
$e = new UserNotLoggedIn();
$e->report();
$redirectUrl = RequestContext::getMain()->getOutput()->getRedirect();
$parsedUrlParts = $this->getServiceContainer()->getUrlUtils()->parse( $redirectUrl );
$this->assertNotNull( $parsedUrlParts );
$this->assertArrayEquals(
[
'title' => 'Special:CreateAccount',
'returntoquery' => '',
'returnto' => 'Special:Preferences',
'warning' => 'exception-nologin-text-for-temp-user',
],
wfCgiToArray( $parsedUrlParts['query'] ),
false,
true
);
}
}