mediawiki-skins-Vector/tests/phpunit/integration/SkinVersionLookupTest.php
jdlrobson 7d2d50873f Vector is split into 2 skins
A new vector-2022 skin is added. This will be the eventual home
of the new Vector skin when we are ready to migrate.

Please see SkinVector class for the migration plan to simulate this
as part of testing.

Bug: T291098
Change-Id: Ibaddf94a5bfb5e21bbbaf1e0aa1b343a3f566d2d
2022-01-06 15:52:10 -08:00

238 lines
6.2 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @since 1.35
*/
use MediaWiki\User\UserOptionsLookup;
use Vector\Constants;
use Vector\SkinVersionLookup;
/**
* @group Vector
* @coversDefaultClass \Vector\SkinVersionLookup
*/
class SkinVersionLookupTest extends \MediaWikiIntegrationTestCase {
/**
* @covers ::isLegacy
* @covers ::getVersion
*/
public function testRequest() {
$request = $this->getMockBuilder( \WebRequest::class )->getMock();
$request
->method( 'getVal' )
->with( $this->anything(), 'beta' )
->willReturn( 'alpha' );
$user = $this->createMock( \User::class );
$user
->method( 'isRegistered' )
->willReturn( false );
$config = new HashConfig( [
'VectorSkinMigrationMode' => false,
'VectorDefaultSkinVersion' => '2',
'VectorDefaultSkinVersionForExistingAccounts' => '1'
] );
$userOptionsLookup = $this->getUserOptionsLookupMock( $user, 'beta', [
'skin' => Constants::SKIN_NAME_LEGACY,
] );
$skinVersionLookup = new SkinVersionLookup( $request, $user, $config, $userOptionsLookup );
$this->assertSame(
'alpha',
$skinVersionLookup->getVersion(),
'Query parameter is the first priority.'
);
$this->assertSame(
false,
$skinVersionLookup->isLegacy(),
'Version is non-Legacy.'
);
}
/**
* @covers ::getVersion
* @covers ::isLegacy
*/
public function testUserPreference() {
$request = $this->getMockBuilder( \WebRequest::class )->getMock();
$request
->method( 'getVal' )
->with( $this->anything(), 'beta' )
->willReturn( 'beta' );
$user = $this->createMock( \User::class );
$user
->method( 'isRegistered' )
->willReturn( false );
$config = new HashConfig( [
'VectorSkinMigrationMode' => false,
'VectorDefaultSkinVersion' => '2',
'VectorDefaultSkinVersionForExistingAccounts' => '1'
] );
$userOptionsLookup = $this->getUserOptionsLookupMock( $user, 'beta', [
'skin' => Constants::SKIN_NAME_LEGACY,
] );
$skinVersionLookup = new SkinVersionLookup( $request, $user, $config, $userOptionsLookup );
$this->assertSame(
'beta',
$skinVersionLookup->getVersion(),
'User preference is the second priority.'
);
$this->assertSame(
false,
$skinVersionLookup->isLegacy(),
'Version is non-Legacy.'
);
}
/**
* @covers ::getVersion
* @covers ::isLegacy
*/
public function testConfigRegistered() {
$request = $this->getMockBuilder( \WebRequest::class )->getMock();
$request
->method( 'getVal' )
->with( $this->anything(), '1' )
->willReturn( '1' );
$user = $this->createMock( \User::class );
$user
->method( 'isRegistered' )
->willReturn( true );
$config = new HashConfig( [
'VectorSkinMigrationMode' => false,
'VectorDefaultSkinVersion' => '2',
'VectorDefaultSkinVersionForExistingAccounts' => '1'
] );
$userOptionsLookup = $this->getUserOptionsLookupMock( $user, '1', [
'skin' => Constants::SKIN_NAME_LEGACY,
] );
$skinVersionLookup = new SkinVersionLookup( $request, $user, $config, $userOptionsLookup );
$this->assertSame(
'1',
$skinVersionLookup->getVersion(),
'Config is the third priority and distinguishes logged in users from anonymous users.'
);
$this->assertSame(
true,
$skinVersionLookup->isLegacy(),
'Version is Legacy.'
);
}
/**
* @covers ::getVersion
*/
public function testSkin22() {
$request = $this->getMockBuilder( \WebRequest::class )->getMock();
$request
->method( 'getVal' )
->willReturn( '1' );
$user = $this->createMock( \User::class );
$user
->method( 'isRegistered' )
->willReturn( true );
$config = new HashConfig( [
'VectorSkinMigrationMode' => false,
'VectorDefaultSkinVersion' => '1',
'VectorDefaultSkinVersionForExistingAccounts' => '1'
] );
$userOptionsLookup = $this->getUserOptionsLookupMock( $user, '1', [
'skin' => Constants::SKIN_NAME_MODERN
] );
$skinVersionLookup = new SkinVersionLookup( $request, $user, $config, $userOptionsLookup );
$this->assertSame(
'2',
$skinVersionLookup->getVersion(),
'Using the modern skin always returns 2. Ignores skinversion query string.'
);
}
/**
* @covers ::getVersion
* @covers ::isLegacy
*/
public function testConfigAnon() {
$request = $this->getMockBuilder( \WebRequest::class )->getMock();
$request
->method( 'getVal' )
->with( $this->anything(), '2' )
->willReturn( '2' );
$user = $this->createMock( \User::class );
$user
->method( 'isRegistered' )
->willReturn( false );
$config = new HashConfig( [
'VectorSkinMigrationMode' => false,
'VectorDefaultSkinVersion' => '2',
'VectorDefaultSkinVersionForExistingAccounts' => '1'
] );
$userOptionsLookup = $this->getUserOptionsLookupMock( $user, '2', [
'skin' => Constants::SKIN_NAME_LEGACY,
] );
$skinVersionLookup = new SkinVersionLookup( $request, $user, $config, $userOptionsLookup );
$this->assertSame(
'2',
$skinVersionLookup->getVersion(),
'Config is the third priority and distinguishes anonymous users from logged in users.'
);
$this->assertSame(
false,
$skinVersionLookup->isLegacy(),
'Version is non-Legacy.'
);
}
/**
* @param User $user
* @param array $returnVal
* @param array $lookup values
* @return UserOptionsLookup
*/
private function getUserOptionsLookupMock( $user, $returnVal, $lookup = [] ) {
$mock = $this->createMock( UserOptionsLookup::class );
$mock->method( 'getOption' )
->willReturnCallback( static function ( $user, $key ) use ( $returnVal, $lookup ) {
return $lookup[ $key ] ?? $returnVal;
} );
return $mock;
}
}