diff --git a/includes/Constants.php b/includes/Constants.php index d6ae43487..4de6d05e7 100644 --- a/includes/Constants.php +++ b/includes/Constants.php @@ -258,6 +258,13 @@ final class Constants { */ public const CONFIG_ZEBRA_DESIGN = 'VectorZebraDesign'; + /** + * Requirement that checks the value of ABTestEnrollment. + * + * @var string + */ + public const REQUIREMENT_ZEBRA_AB_TEST = 'VectorZebraDesign'; + /** * This class is for namespacing constants only. Forbid construction. * @throws FatalError diff --git a/includes/FeatureManagement/Requirements/ABRequirement.php b/includes/FeatureManagement/Requirements/ABRequirement.php new file mode 100644 index 000000000..47a65e3dd --- /dev/null +++ b/includes/FeatureManagement/Requirements/ABRequirement.php @@ -0,0 +1,103 @@ +config = $config; + $this->user = $user; + $this->name = $name; + $this->experimentName = $experimentName; + } + + /** + * @inheritDoc + */ + public function getName(): string { + return $this->name; + } + + /** + * Returns true if the user is logged-in and false otherwise. + * + * @inheritDoc + */ + public function isMet(): bool { + // Get the experiment configuration from the config object. + $experiment = $this->config->get( 'VectorWebABTestEnrollment' ); + + // Check if the experiment is not enabled or does not match the specified name. + if ( !$experiment['enabled'] || $experiment['name'] !== $this->experimentName ) { + // If the experiment is not enabled or does not match the specified name, + // return true, indicating that the metric is "met" + return true; + } else { + // If the experiment is enabled and matches the specified name, + // calculate the user's variant based on their ID + $variant = $this->user->getID() % 2; + + // Cast the variant value to a boolean and return it, indicating whether + // the user is in the "control" or "test" group. + return (bool)$variant; + } + } +} diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index d1f06f2ba..0616ab79e 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -25,6 +25,7 @@ use MediaWiki\MediaWikiServices; use MediaWiki\Skins\Vector\Constants; use MediaWiki\Skins\Vector\FeatureManagement\FeatureManager; +use MediaWiki\Skins\Vector\FeatureManagement\Requirements\ABRequirement; use MediaWiki\Skins\Vector\FeatureManagement\Requirements\DynamicConfigRequirement; use MediaWiki\Skins\Vector\FeatureManagement\Requirements\LimitedWidthContentRequirement; use MediaWiki\Skins\Vector\FeatureManagement\Requirements\LoggedInRequirement; @@ -71,10 +72,21 @@ return [ // MultiConfig checks each config in turn, allowing us to override the main config for specific keys. $config = new MultiConfig( [ - new HashConfig( [] ), + new HashConfig( [ + Constants::REQUIREMENT_ZEBRA_AB_TEST => true, + ] ), $services->getMainConfig(), ] ); + $featureManager->registerRequirement( + new ABRequirement( + $services->getMainConfig(), + $context->getUser(), + Constants::REQUIREMENT_ZEBRA_AB_TEST, + 'skin-vector-zebra-experiment' + ) + ); + $featureManager->registerRequirement( new OverridableConfigRequirement( $config, @@ -82,8 +94,7 @@ return [ $context->getRequest(), $services->getCentralIdLookupFactory()->getNonLocalLookup(), Constants::CONFIG_KEY_LANGUAGE_IN_HEADER, - $requirementName, - /* $overrideName = */ '' + $requirementName ) ); @@ -282,7 +293,8 @@ return [ $context->getRequest(), null, Constants::CONFIG_ZEBRA_DESIGN, - Constants::REQUIREMENT_ZEBRA_DESIGN + Constants::REQUIREMENT_ZEBRA_DESIGN, + Constants::REQUIREMENT_ZEBRA_AB_TEST ) ); $featureManager->registerFeature( @@ -290,6 +302,7 @@ return [ [ Constants::REQUIREMENT_FULLY_INITIALISED, Constants::REQUIREMENT_ZEBRA_DESIGN, + Constants::REQUIREMENT_ZEBRA_AB_TEST ] ); diff --git a/skin.json b/skin.json index c001979f6..d7527b540 100644 --- a/skin.json +++ b/skin.json @@ -570,7 +570,7 @@ }, "VectorWebABTestEnrollment": { "value": { - "name": "skin-vector-toc-experiment", + "name": "skin-vector-zebra-experiment", "enabled": false, "buckets": { "unsampled": {