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

View File

@ -6,8 +6,15 @@ use MailPoet\Models\FeatureFlag;
use function MailPoet\Util\array_column; use function MailPoet\Util\array_column;
class FeatureFlagsController { class FeatureFlagsController {
/** @var FeaturesController */
private $features_controller;
function __construct(FeaturesController $features_controller) {
$this->features_controller = $features_controller;
}
function set($name, $value) { function set($name, $value) {
if (!isset(FeaturesController::$defaults[$name])) { if (!$this->features_controller->exists($name)) {
throw new \RuntimeException("Feature '$name' does not exist'"); throw new \RuntimeException("Feature '$name' does not exist'");
} }
@ -26,7 +33,7 @@ class FeatureFlagsController {
$flagsMap = array_combine(array_column($flags, 'name'), $flags); $flagsMap = array_combine(array_column($flags, 'name'), $flags);
$output = []; $output = [];
foreach (FeaturesController::$defaults as $name => $default) { foreach ($this->features_controller->getDefaults() as $name => $default) {
$output[] = [ $output[] = [
'name' => $name, 'name' => $name,
'value' => isset($flagsMap[$name]) ? (bool)$flagsMap[$name]['value'] : $default, '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: // Define feature defaults in the array below in the following form:
// self::FEATURE_NAME_OF_FEATURE => true, // self::FEATURE_NAME_OF_FEATURE => true,
public static $defaults = [ private $defaults = [
self::FEATURE_DISPLAY_WOOCOMMERCE_REVENUES => false, self::FEATURE_DISPLAY_WOOCOMMERCE_REVENUES => false,
]; ];
@ -21,13 +21,23 @@ class FeaturesController {
/** @return bool */ /** @return bool */
function isSupported($feature) { function isSupported($feature) {
$this->ensureFlagsLoaded(); if (!$this->exists($feature)) {
if (!array_key_exists($feature, $this->flags)) {
throw new \RuntimeException("Unknown feature '$feature'"); throw new \RuntimeException("Unknown feature '$feature'");
} }
$this->ensureFlagsLoaded();
return $this->flags[$feature]; 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 */ /** @return array */
function getAllFlags() { function getAllFlags() {
$this->ensureFlagsLoaded(); $this->ensureFlagsLoaded();
@ -41,7 +51,7 @@ class FeaturesController {
$this->flags = []; $this->flags = [];
$flagsMap = $this->getValueMap(); $flagsMap = $this->getValueMap();
foreach (self::$defaults as $name => $default) { foreach ($this->defaults as $name => $default) {
$this->flags[$name] = isset($flagsMap[$name]) ? $flagsMap[$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; use MailPoet\Models\FeatureFlag;
class FeatureFlagsTest extends \MailPoetTest { class FeatureFlagsTest extends \MailPoetTest {
/** @var array */
private $defaults_backup;
function _before() { function _before() {
parent::_before(); parent::_before();
FeatureFlag::deleteMany(); FeatureFlag::deleteMany();
$this->defaults_backup = FeaturesController::$defaults;
} }
function testItReturnsDefaults() { function testItReturnsDefaults() {
FeaturesController::$defaults = [ $endpoint = $this->createEndpointWithFeatureDefaults([
'feature-a' => true, 'feature-a' => true,
'feature-b' => false, 'feature-b' => false,
]; ]);
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
expect($endpoint->getAll()->data)->equals([ expect($endpoint->getAll()->data)->equals([
[ [
'name' => 'feature-a', 'name' => 'feature-a',
@ -41,17 +36,14 @@ class FeatureFlagsTest extends \MailPoetTest {
} }
function testItReturnsDatabaseValue() { function testItReturnsDatabaseValue() {
FeaturesController::$defaults = [
'feature-a' => true,
];
FeatureFlag::createOrUpdate([ FeatureFlag::createOrUpdate([
'name' => 'feature-a', 'name' => 'feature-a',
'value' => false, 'value' => false,
]); ]);
$controller = new FeatureFlagsController(); $endpoint = $this->createEndpointWithFeatureDefaults([
$endpoint = new FeatureFlags($controller); 'feature-a' => true,
]);
expect($endpoint->getAll()->data)->equals([ expect($endpoint->getAll()->data)->equals([
[ [
@ -63,12 +55,10 @@ class FeatureFlagsTest extends \MailPoetTest {
} }
function testItSetsDatabaseValue() { function testItSetsDatabaseValue() {
FeaturesController::$defaults = [ $endpoint = $this->createEndpointWithFeatureDefaults([
'feature-a' => true, 'feature-a' => true,
]; ]);
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
$endpoint->set([ $endpoint->set([
'feature-a' => false, 'feature-a' => false,
]); ]);
@ -81,17 +71,15 @@ class FeatureFlagsTest extends \MailPoetTest {
function testItUpdatesDatabaseValue() { function testItUpdatesDatabaseValue() {
FeaturesController::$defaults = [
'feature-a' => true,
];
FeatureFlag::createOrUpdate([ FeatureFlag::createOrUpdate([
'name' => 'feature-a', 'name' => 'feature-a',
'value' => false, 'value' => false,
]); ]);
$controller = new FeatureFlagsController(); $endpoint = $this->createEndpointWithFeatureDefaults([
$endpoint = new FeatureFlags($controller); 'feature-a' => true,
]);
$endpoint->set([ $endpoint->set([
'feature-a' => true, 'feature-a' => true,
]); ]);
@ -103,24 +91,17 @@ class FeatureFlagsTest extends \MailPoetTest {
} }
function testItDoesNotReturnUnknownFlag() { function testItDoesNotReturnUnknownFlag() {
FeaturesController::$defaults = [];
FeatureFlag::createOrUpdate([ FeatureFlag::createOrUpdate([
'name' => 'feature-unknown', 'name' => 'feature-unknown',
'value' => true, 'value' => true,
]); ]);
$controller = new FeatureFlagsController(); $endpoint = $this->createEndpointWithFeatureDefaults([]);
$endpoint = new FeatureFlags($controller);
expect($endpoint->getAll()->data)->isEmpty(); expect($endpoint->getAll()->data)->isEmpty();
} }
function testItDoesNotSaveUnknownFlag() { function testItDoesNotSaveUnknownFlag() {
FeaturesController::$defaults = []; $endpoint = $this->createEndpointWithFeatureDefaults([]);
$controller = new FeatureFlagsController();
$endpoint = new FeatureFlags($controller);
$response = $endpoint->set([ $response = $endpoint->set([
'feature-unknown' => false, 'feature-unknown' => false,
]); ]);
@ -132,9 +113,16 @@ class FeatureFlagsTest extends \MailPoetTest {
expect(count($features))->equals(0); 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() { function _after() {
parent::_before(); parent::_before();
FeatureFlag::deleteMany(); FeatureFlag::deleteMany();
FeaturesController::$defaults = $this->defaults_backup;
} }
} }

View File

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