mediawiki-skins-Vector/tests/phpunit/integration/FeatureManagement/FeatureManagerTest.php
Jan Drewniak a3801497b9 Add exclusion notice for night mode feature
If night-mode is disabled on a certain page via the
exclude list in skin.json, then the following class:
".skin-theme-clientpref-excluded" will be added to the HTML element.

In this scenario, the related client-preferences
menu options are visible, but disabled, and a notice
is rendered below the options informing users of this state.

Bug: T361158
Change-Id: I46d335d079a2d27c7a4122e23ac7e479c286b886
2024-04-16 22:38:35 -04:00

107 lines
3.8 KiB
PHP

<?php
use MediaWiki\Skins\Vector\Constants;
use MediaWiki\Skins\Vector\FeatureManagement\FeatureManager;
/**
* @coversDefaultClass \MediaWiki\Skins\Vector\FeatureManagement\FeatureManager
*/
class FeatureManagerTest extends \MediaWikiIntegrationTestCase {
public static function provideGetFeatureBodyClass() {
return [
[ CONSTANTS::FEATURE_LIMITED_WIDTH, false, 'vector-feature-limited-width-clientpref-0' ],
[ CONSTANTS::FEATURE_LIMITED_WIDTH, true, 'vector-feature-limited-width-clientpref-1' ],
[ CONSTANTS::FEATURE_TOC_PINNED, false, 'vector-feature-toc-pinned-clientpref-0' ],
[ CONSTANTS::FEATURE_TOC_PINNED, true, 'vector-feature-toc-pinned-clientpref-1' ],
[ 'default', false, 'vector-feature-default-disabled' ],
[ 'default', true, 'vector-feature-default-enabled' ],
];
}
/**
* @dataProvider provideGetFeatureBodyClass
* @covers ::getFeatureBodyClass basic usage
*/
public function testGetFeatureBodyClass( $feature, $enabled, $expected ) {
$featureManager = new FeatureManager();
$featureManager->registerSimpleRequirement( 'requirement', $enabled );
$featureManager->registerFeature( $feature, [ 'requirement' ] );
$this->assertSame( [ $expected ], $featureManager->getFeatureBodyClass() );
}
/**
* @covers ::getFeatureBodyClass returning multiple feature classes
*/
public function testGetFeatureBodyClassMultiple() {
$featureManager = new FeatureManager();
$featureManager->registerSimpleRequirement( 'requirement', true );
$featureManager->registerSimpleRequirement( 'disabled', false );
$featureManager->registerFeature( 'sticky-header', [ 'requirement' ] );
$featureManager->registerFeature( 'TableOfContents', [ 'requirement' ] );
$featureManager->registerFeature( 'Test', [ 'disabled' ] );
$this->assertEquals(
[
'vector-feature-sticky-header-enabled',
'vector-feature-table-of-contents-enabled',
'vector-feature-test-disabled'
],
$featureManager->getFeatureBodyClass()
);
}
public static function provideGetFeatureBodyClassNightModeQueryParam() {
return [
[ 0, 'skin-theme-clientpref-day' ],
[ 1, 'skin-theme-clientpref-night' ],
[ 2, 'skin-theme-clientpref-os' ],
[ 'day', 'skin-theme-clientpref-day' ],
[ 'night', 'skin-theme-clientpref-night' ],
[ 'os', 'skin-theme-clientpref-os' ],
[ 'invalid', 'skin-theme-clientpref-day' ]
];
}
/**
* @dataProvider provideGetFeatureBodyClassNightModeQueryParam
* @covers ::getFeatureBodyClass pref night mode specifics - disabled pages
*/
public function testGetFeatureBodyClassNightModeQueryParam( $value, $expected ) {
$featureManager = new FeatureManager();
$featureManager->registerFeature( CONSTANTS::PREF_NIGHT_MODE, [] );
$context = RequestContext::getMain();
$context->setTitle( Title::makeTitle( NS_MAIN, 'test' ) );
$request = $context->getRequest();
$request->setVal( 'vectornightmode', $value );
$this->assertEquals( [ $expected ], $featureManager->getFeatureBodyClass() );
}
/** ensure the class is present when disabled and absent when not */
public static function provideGetFeatureBodyClassNightModeDisabled() {
return [
[ true ], [ false ]
];
}
/**
* @dataProvider provideGetFeatureBodyClassNightModeDisabled
* @covers ::getFeatureBodyClass pref night mode specifics - disabled pages
*/
public function testGetFeatureBodyClassNightModeDisabled( $disabled ) {
$featureManager = new FeatureManager();
$featureManager->registerFeature( CONSTANTS::PREF_NIGHT_MODE, [] );
$context = RequestContext::getMain();
$context->setTitle( Title::makeTitle( NS_MAIN, 'Main Page' ) );
$this->overrideConfigValues( [ 'VectorNightModeOptions' => [ 'exclude' => [ 'mainpage' => $disabled ] ] ] );
$this->assertEquals(
in_array( 'skin-theme-clientpref-excluded', $featureManager->getFeatureBodyClass() ),
$disabled
);
}
}