mediawiki-skins-Vector/tests/phpunit/integration/FeatureManagement/FeatureManagerTest.php
Jon Robson acb79c5e1b Improve documentation for how feature manager classes work.
This changes nothing about the existing classes, it just improves
how they are documented.

The FIXME comment was making things confusing.

Make sure every feature class is accounted for and audited and
throw a RuntimeException if we forget to document it.

Change-Id: I9d8f6553fe6b8c2ae80d8b2490c8895a8334a537
2024-08-08 20:19:48 +00:00

119 lines
4.4 KiB
PHP

<?php
use MediaWiki\Context\RequestContext;
use MediaWiki\Skins\Vector\Constants;
use MediaWiki\Skins\Vector\FeatureManagement\FeatureManager;
use MediaWiki\Title\Title;
/**
* @coversDefaultClass \MediaWiki\Skins\Vector\FeatureManagement\FeatureManager
*/
class FeatureManagerTest extends \MediaWikiIntegrationTestCase {
private function newFeatureManager(): FeatureManager {
return new FeatureManager(
$this->getServiceContainer()->getUserOptionsLookup(),
RequestContext::getMain()
);
}
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' ],
[ CONSTANTS::FEATURE_NIGHT_MODE, false, 'vector-feature-night-mode-disabled' ],
[ CONSTANTS::FEATURE_NIGHT_MODE, true, 'vector-feature-night-mode-enabled' ],
];
}
/**
* @dataProvider provideGetFeatureBodyClass
* @covers ::getFeatureBodyClass basic usage
*/
public function testGetFeatureBodyClass( $feature, $enabled, $expected ) {
$featureManager = $this->newFeatureManager();
$featureManager->registerSimpleRequirement( 'requirement', $enabled );
$featureManager->registerFeature( $feature, [ 'requirement' ] );
// Title is required for checking whether or not the feature is excluded
// based on page title.
$context = RequestContext::getMain();
$context->setTitle( Title::makeTitle( NS_MAIN, 'test' ) );
$this->assertSame( [ $expected ], $featureManager->getFeatureBodyClass() );
}
/**
* @covers ::getFeatureBodyClass returning multiple feature classes
*/
public function testGetFeatureBodyClassMultiple() {
$featureManager = $this->newFeatureManager();
$featureManager->registerSimpleRequirement( 'requirement', true );
$featureManager->registerSimpleRequirement( 'disabled', false );
$featureManager->registerFeature( Constants::FEATURE_STICKY_HEADER, [ 'requirement' ] );
$featureManager->registerFeature( Constants::FEATURE_NIGHT_MODE, [ 'requirement' ] );
$featureManager->registerFeature( Constants::FEATURE_LIMITED_WIDTH_CONTENT, [ 'disabled' ] );
$this->assertEquals(
[
'vector-feature-sticky-header-enabled',
'vector-feature-night-mode-enabled',
'vector-feature-limited-width-content-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 = $this->newFeatureManager();
$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 = $this->newFeatureManager();
$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
);
}
}