Make feature defaults array private

[MAILPOET-2008]
This commit is contained in:
Jan Jakeš
2019-05-15 15:34:37 +02:00
committed by M. Shull
parent 9f194d8bc2
commit 5b4600193d
5 changed files with 71 additions and 63 deletions

View File

@ -12,14 +12,18 @@ if (!defined('ABSPATH')) exit;
class FeatureFlags extends APIEndpoint {
/** @var FeatureFlagsController */
private $feature_flags_controller;
public $permissions = [
'global' => AccessControl::PERMISSION_MANAGE_FEATURES,
];
function __construct(FeatureFlagsController $feature_flags) {
/** @var FeaturesController */
private $features_controller;
/** @var FeatureFlagsController */
private $feature_flags_controller;
function __construct(FeaturesController $features_controller, FeatureFlagsController $feature_flags) {
$this->features_controller = $features_controller;
$this->feature_flags_controller = $feature_flags;
}
@ -30,7 +34,7 @@ class FeatureFlags extends APIEndpoint {
function set(array $flags) {
foreach ($flags as $name => $value) {
if (!isset(FeaturesController::$defaults[$name])) {
if (!$this->features_controller->exists($name)) {
return $this->badRequest([
APIError::BAD_REQUEST => "Feature '$name' does not exist'",
]);

View File

@ -6,8 +6,15 @@ use MailPoet\Models\FeatureFlag;
use function MailPoet\Util\array_column;
class FeatureFlagsController {
/** @var FeaturesController */
private $features_controller;
function __construct(FeaturesController $features_controller) {
$this->features_controller = $features_controller;
}
function set($name, $value) {
if (!isset(FeaturesController::$defaults[$name])) {
if (!$this->features_controller->exists($name)) {
throw new \RuntimeException("Feature '$name' does not exist'");
}
@ -26,7 +33,7 @@ class FeatureFlagsController {
$flagsMap = array_combine(array_column($flags, 'name'), $flags);
$output = [];
foreach (FeaturesController::$defaults as $name => $default) {
foreach ($this->features_controller->getDefaults() as $name => $default) {
$output[] = [
'name' => $name,
'value' => isset($flagsMap[$name]) ? (bool)$flagsMap[$name]['value'] : $default,

View File

@ -12,7 +12,7 @@ class FeaturesController {
// Define feature defaults in the array below in the following form:
// self::FEATURE_NAME_OF_FEATURE => true,
public static $defaults = [
private $defaults = [
self::FEATURE_DISPLAY_WOOCOMMERCE_REVENUES => false,
];
@ -21,13 +21,23 @@ class FeaturesController {
/** @return bool */
function isSupported($feature) {
$this->ensureFlagsLoaded();
if (!array_key_exists($feature, $this->flags)) {
if (!$this->exists($feature)) {
throw new \RuntimeException("Unknown feature '$feature'");
}
$this->ensureFlagsLoaded();
return $this->flags[$feature];
}
/** @return bool */
function exists($feature) {
return array_key_exists($feature, $this->defaults);
}
/** @return array */
function getDefaults() {
return $this->defaults;
}
/** @return array */
function getAllFlags() {
$this->ensureFlagsLoaded();
@ -41,7 +51,7 @@ class FeaturesController {
$this->flags = [];
$flagsMap = $this->getValueMap();
foreach (self::$defaults as $name => $default) {
foreach ($this->defaults as $name => $default) {
$this->flags[$name] = isset($flagsMap[$name]) ? $flagsMap[$name] : $default;
}
}

View File

@ -9,23 +9,18 @@ use MailPoet\Features\FeaturesController;
use MailPoet\Models\FeatureFlag;
class FeatureFlagsTest extends \MailPoetTest {
/** @var array */
private $defaults_backup;
function _before() {
parent::_before();
FeatureFlag::deleteMany();
$this->defaults_backup = FeaturesController::$defaults;
}
function testItReturnsDefaults() {
FeaturesController::$defaults = [
$endpoint = $this->createEndpointWithFeatureDefaults([
'feature-a' => true,
'feature-b' => false,
];
]);
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
expect($endpoint->getAll()->data)->equals([
[
'name' => 'feature-a',
@ -41,17 +36,14 @@ class FeatureFlagsTest extends \MailPoetTest {
}
function testItReturnsDatabaseValue() {
FeaturesController::$defaults = [
'feature-a' => true,
];
FeatureFlag::createOrUpdate([
'name' => 'feature-a',
'value' => false,
]);
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
$endpoint = $this->createEndpointWithFeatureDefaults([
'feature-a' => true,
]);
expect($endpoint->getAll()->data)->equals([
[
@ -63,12 +55,10 @@ class FeatureFlagsTest extends \MailPoetTest {
}
function testItSetsDatabaseValue() {
FeaturesController::$defaults = [
$endpoint = $this->createEndpointWithFeatureDefaults([
'feature-a' => true,
];
]);
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
$endpoint->set([
'feature-a' => false,
]);
@ -81,17 +71,15 @@ class FeatureFlagsTest extends \MailPoetTest {
function testItUpdatesDatabaseValue() {
FeaturesController::$defaults = [
'feature-a' => true,
];
FeatureFlag::createOrUpdate([
'name' => 'feature-a',
'value' => false,
]);
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
$endpoint = $this->createEndpointWithFeatureDefaults([
'feature-a' => true,
]);
$endpoint->set([
'feature-a' => true,
]);
@ -103,24 +91,17 @@ class FeatureFlagsTest extends \MailPoetTest {
}
function testItDoesNotReturnUnknownFlag() {
FeaturesController::$defaults = [];
FeatureFlag::createOrUpdate([
'name' => 'feature-unknown',
'value' => true,
]);
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
$endpoint = $this->createEndpointWithFeatureDefaults([]);
expect($endpoint->getAll()->data)->isEmpty();
}
function testItDoesNotSaveUnknownFlag() {
FeaturesController::$defaults = [];
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
$endpoint = $this->createEndpointWithFeatureDefaults([]);
$response = $endpoint->set([
'feature-unknown' => false,
]);
@ -132,9 +113,16 @@ class FeatureFlagsTest extends \MailPoetTest {
expect(count($features))->equals(0);
}
private function createEndpointWithFeatureDefaults(array $defaults) {
$features_controller = $this->make(FeaturesController::class, [
'defaults' => $defaults,
]);
$controller = new FeatureFlagsController($features_controller);
return new FeatureFlags($features_controller, $controller);
}
function _after() {
parent::_before();
FeatureFlag::deleteMany();
FeaturesController::$defaults = $this->defaults_backup;
}
}

View File

@ -5,22 +5,20 @@ use MailPoet\Features\FeaturesController;
use MailPoet\Models\FeatureFlag;
class FeaturesControllerTest extends \MailPoetTest {
/** @var array */
private $defaults_backup;
function _before() {
parent::_before();
FeatureFlag::deleteMany();
$this->defaults_backup = FeaturesController::$defaults;
}
function testItReturnsDefaults() {
FeaturesController::$defaults = [
function testItWorksWithDefaults() {
$controller = $this->make(FeaturesController::class, [
'defaults' => [
'feature-a' => true,
'feature-b' => false,
];
],
]);
$controller = new FeaturesController();
expect($controller->isSupported('feature-a'))->equals(true);
expect($controller->isSupported('feature-b'))->equals(false);
expect($controller->getAllFlags())->equals([
@ -29,17 +27,18 @@ class FeaturesControllerTest extends \MailPoetTest {
]);
}
function testItReturnsDatabaseValue() {
FeaturesController::$defaults = [
'feature-a' => true,
];
function testItWorksWithDatabaseValues() {
FeatureFlag::createOrUpdate([
'name' => 'feature-a',
'value' => false,
]);
$controller = new FeaturesController();
$controller = $this->make(FeaturesController::class, [
'defaults' => [
'feature-a' => true,
],
]);
expect($controller->isSupported('feature-a'))->equals(false);
expect($controller->getAllFlags())->equals([
'feature-a' => false,
@ -47,14 +46,15 @@ class FeaturesControllerTest extends \MailPoetTest {
}
function testItDoesNotReturnUnknownFlag() {
FeaturesController::$defaults = [];
FeatureFlag::createOrUpdate([
'name' => 'feature-unknown',
'value' => true,
]);
$controller = new FeaturesController();
$controller = $this->make(FeaturesController::class, [
'defaults' => [],
]);
try {
$controller->isSupported('feature-unknown');
} catch (\RuntimeException $e) {
@ -66,6 +66,5 @@ class FeaturesControllerTest extends \MailPoetTest {
function _after() {
parent::_before();
FeatureFlag::deleteMany();
FeaturesController::$defaults = $this->defaults_backup;
}
}