<?php
/**
* Variant of Experimental_Abtest used by the accelerated-onboarding experiment.
*
* @package WooCommerce\Payments
*/
namespace WCPay;
defined( 'ABSPATH' ) || exit;
/**
* Variant of Experimental_Abtest that returns null on failure so callers can
* distinguish a real 'control' assignment from a transient fetch failure that
* shouldn't be cached.
*
* The parent's get_variation() collapses no-consent and WP_Error fetch failures
* into a real-looking 'control' string. That makes it impossible for the caller
* to know whether to persist the assignment, which would otherwise lock a
* merchant who first encounters the experiment during an ExPlat outage into
* 'control' for the lifetime of the experiment.
*
* @internal Remove together with Onboarding_Experiment when the experiment ends.
*/
final class Onboarding_Experiment_Abtest extends Experimental_Abtest {
/**
* Whether tracking consent was granted at construction time.
*
* Mirrors the parent's private $consent so this subclass can branch on it
* without modifying the parent class.
*
* @var bool
*/
private $is_consented;
/**
* Constructor.
*
* @param string $anon_id ExPlat anonymous ID.
* @param string $platform ExPlat platform name.
* @param bool $consent Whether tracking consent is given.
*/
public function __construct( string $anon_id, string $platform, bool $consent ) {
parent::__construct( $anon_id, $platform, $consent );
$this->is_consented = $consent;
}
/**
* Retrieve the test variation, or null on failure.
*
* @param string $test_name Name of the A/B test.
* @return string|null The variation string on success, or null when consent is missing
* or the upstream fetch errored.
*/
public function get_variation( $test_name ) {
if ( ! $this->is_consented ) {
return null;
}
$variation = $this->fetch_variation( $test_name );
if ( is_wp_error( $variation ) ) {
return null;
}
return $variation;
}
}