قرینه از
https://github.com/matomo-org/matomo.git
synced 2025-08-22 15:07:44 +00:00

* Add feature flags plugin w/ config implementation and example feature * Make sure FeatureFlags plugin always loaded * Don't use DI for test feature, create new migration / version for the plugin * Add license info to files * Update screenshot tests * Update screenshot tests * Show HTML tag in markup * Update plugins/FeatureFlags/config/config.php Co-authored-by: Michal Kleiner <michal@innocraft.com> * Change Feature class names to NameFeatureFlag * Increase version * Increase version * Fix migration file name * Don't use DI for test feature, create new migration / version for the plugin * remove not needed migration * Make interface easier to use so you don't have to pass objects but just class names. * Move flags to DI and write more tests * Add command + system tests * Fix cs problems * Fix problem with example flag in home controller * Fix CS issues * Tidy up command * Update plugins/FeatureFlags/config/config.php Co-authored-by: Michal Kleiner <michal@innocraft.com> * Remove dependency on DI for feature flag manager * Split command into 3 commands, and rely on plugin manager rather than DI * Use constants for storage implementation * Use correct implementation of manager * Update deletion to not depend on concrete class * Remove plugin from pluginToAlwaysActivate and add plugin.json file * Fix spacing * Remove orphaned test * Remove extra closing bracket * Fix desc of command * Remove plugins.json and plugin base class * Fix config DI * Add plugin to list of always activated plugins * ensure to automatically activate newly added plugins, that are enabled by default * Ensure to always load di config of always activated plugins * Update expected screenshots --------- Co-authored-by: Michal Kleiner <michal@innocraft.com> Co-authored-by: sgiehl <stefan@matomo.org> Co-authored-by: Marc Neudert <marc@innocraft.com>
173 خطوط
5.7 KiB
PHP
173 خطوط
5.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Matomo - free/libre analytics platform
|
|
*
|
|
* @link https://matomo.org
|
|
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
|
*/
|
|
|
|
namespace Piwik\Plugins\FeatureFlags\tests\Unit\Storage;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Piwik\Config;
|
|
use Piwik\Plugins\FeatureFlags\FeatureFlagInterface;
|
|
use Piwik\Plugins\FeatureFlags\Storage\ConfigFeatureFlagStorage;
|
|
use Piwik\Tests\Framework\Mock\FakeConfig;
|
|
|
|
class ConfigFeatureFlagStorageTest extends TestCase
|
|
{
|
|
public function testIsFeatureActiveReturnsFalseIfConfigIsMissing(): void
|
|
{
|
|
$configMock = $this->createMock(Config::class);
|
|
$configMock->method('__get')->willThrowException(new \Exception());
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$mockFeature = $this->createMock(FeatureFlagInterface::class);
|
|
|
|
$this->assertFalse($sut->isFeatureActive($mockFeature));
|
|
}
|
|
|
|
public function testIsFeatureActiveReturnsNullIfFeatureIsntConfigured(): void
|
|
{
|
|
$configMock = $this->createMock(Config::class);
|
|
$configMock->method('__get')->willReturn([
|
|
'SomeOther_feature' => 'enabled',
|
|
'AnotherOne_feature' => 'disabled'
|
|
]);
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$mockFeature = $this->createMock(FeatureFlagInterface::class);
|
|
$mockFeature->method('getName')->willReturn('NotSet');
|
|
|
|
$this->assertNull($sut->isFeatureActive($mockFeature));
|
|
}
|
|
|
|
public function testIsFeatureActiveReturnsTrueIfFeatureIsConfiguredAndEnabled(): void
|
|
{
|
|
$configMock = $this->createMock(Config::class);
|
|
$configMock->method('__get')->willReturn([
|
|
'Other_feature' => 'disabled',
|
|
'UnitTest_feature' => 'enabled'
|
|
]);
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$mockFeature = $this->createMock(FeatureFlagInterface::class);
|
|
$mockFeature->method('getName')->willReturn('UnitTest');
|
|
|
|
$this->assertTrue($sut->isFeatureActive($mockFeature));
|
|
}
|
|
|
|
public function testIsFeatureActiveReturnsFalseIfFeatureIsConfiguredButNotEnabled(): void
|
|
{
|
|
$configMock = $this->createMock(Config::class);
|
|
$configMock->method('__get')->willReturn([
|
|
'Other_feature' => 'disabled',
|
|
'UnitTest_feature' => 'disabled'
|
|
]);
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$mockFeature = $this->createMock(FeatureFlagInterface::class);
|
|
$mockFeature->method('getName')->willReturn('UnitTest');
|
|
|
|
$this->assertFalse($sut->isFeatureActive($mockFeature));
|
|
}
|
|
|
|
public function testDisableFeatureFlagDoesntUpdateIfFeatureDoesntExists(): void
|
|
{
|
|
$configMock = $this->createMock(Config::class);
|
|
$configMock->expects($this->never())->method('__set');
|
|
$configMock->expects($this->never())->method('forceSave');
|
|
|
|
$mockFeature = $this->createMock(FeatureFlagInterface::class);
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$sut->disableFeatureFlag($mockFeature);
|
|
}
|
|
|
|
public function testDisableFeatureFlagUpdatesConfigAndForcesSaveOfConfig(): void
|
|
{
|
|
$configMock = $this->getMockBuilder(FakeConfig::class)
|
|
->setMethodsExcept(['__get', '__set', '__construct'])
|
|
->setConstructorArgs([
|
|
'configValues' => [
|
|
'FeatureFlags' =>
|
|
[
|
|
'TestFeature_feature' => 'enabled'
|
|
]
|
|
]
|
|
])
|
|
->getMock();
|
|
|
|
$configMock->expects($this->once())->method('forceSave');
|
|
|
|
$mockFeature = $this->createMock(FeatureFlagInterface::class);
|
|
$mockFeature->method('getName')->willReturn('TestFeature');
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$sut->disableFeatureFlag($mockFeature);
|
|
|
|
$this->assertEquals(
|
|
[
|
|
'TestFeature_feature' => 'disabled'
|
|
],
|
|
$configMock->FeatureFlags
|
|
);
|
|
}
|
|
|
|
public function testEnableFeatureFlagUpdatesConfig(): void
|
|
{
|
|
$configMock = $this->getMockBuilder(FakeConfig::class)
|
|
->setMethodsExcept(['__get', '__set', '__construct'])
|
|
->setConstructorArgs([
|
|
'configValues' => []
|
|
])
|
|
->getMock();
|
|
|
|
$configMock->expects($this->once())->method('forceSave');
|
|
|
|
$mockFeature = $this->createMock(FeatureFlagInterface::class);
|
|
$mockFeature->method('getName')->willReturn('TestFeature');
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$sut->enableFeatureFlag($mockFeature);
|
|
|
|
$this->assertEquals(
|
|
[
|
|
'TestFeature_feature' => 'enabled'
|
|
],
|
|
$configMock->FeatureFlags
|
|
);
|
|
}
|
|
|
|
public function testDeleteFeatureDoesNothingIfFeatureDoesntExist(): void
|
|
{
|
|
$configMock = $this->createMock(Config::class);
|
|
$configMock->expects($this->never())->method('forceSave');
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$sut->deleteFeatureFlag('UnknownFeature');
|
|
}
|
|
|
|
public function testDeleteFeatureRemovesFlagFromConfig(): void
|
|
{
|
|
$configMock = $this->getMockBuilder(FakeConfig::class)
|
|
->setMethodsExcept(['__get', '__set', '__construct'])
|
|
->setConstructorArgs([
|
|
'configValues' => [
|
|
'FeatureFlags' =>
|
|
[
|
|
'TestFeature_feature' => 'enabled'
|
|
]
|
|
]
|
|
])
|
|
->getMock();
|
|
$configMock->expects($this->once())->method('forceSave');
|
|
|
|
$sut = new ConfigFeatureFlagStorage($configMock);
|
|
$sut->deleteFeatureFlag('TestFeature');
|
|
|
|
$this->assertEquals([], $configMock->FeatureFlags);
|
|
}
|
|
}
|