File size: 4,290 Bytes
b2f8af3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | <?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;
use PHPUnit\Framework\TestCase;
use Piwik\Log\LoggerInterface;
use Piwik\Plugins\FeatureFlags\FeatureFlagInterface;
use Piwik\Plugins\FeatureFlags\FeatureFlagManager;
use Piwik\Plugins\FeatureFlags\FeatureFlagStorageInterface;
use Piwik\Plugins\FeatureFlags\ForcedFeatureFlagStateInterface;
class FeatureFlagManagerTest extends TestCase
{
public function testIsFeatureActiveReturnsFalseIfUnknownFeaturePassed()
{
$logger = $this->createMock(LoggerInterface::class);
$sut = new FeatureFlagManager([], $logger);
$this->assertFalse($sut->isFeatureActive('UnknownFeature'));
}
public function testIsFeatureActiveLogsDebugMessageIfFeatureNotFound()
{
$logger = $this->createMock(LoggerInterface::class);
$logger->expects($this->once())
->method('debug')
->with('isFeatureActive failed due to class not implementing FeatureFlagInterface', [
'featureFlag' => 'UnknownFeature',
]);
$sut = new FeatureFlagManager([], $logger);
$sut->isFeatureActive('UnknownFeature');
}
/**
* @dataProvider listOfStorages
*/
public function testIsFeatureActiveOverridesBasedOnOrderOfStorage(array $storageResponses, bool $expectedOutcome): void
{
$storages = [];
$logger = $this->createMock(LoggerInterface::class);
foreach ($storageResponses as $storageResponse) {
$mock = $this->createMock(FeatureFlagStorageInterface::class);
$mock->method('isFeatureActive')->willReturn($storageResponse);
$storages[] = $mock;
}
$mockFeature = $this->createMock(FeatureFlagInterface::class);
$sut = new FeatureFlagManager(
$storages,
$logger
);
$this->assertEquals($expectedOutcome, $sut->isFeatureActive(get_class($mockFeature)));
}
public function testIsFeatureActiveReturnsForcedStateWithoutConsultingStorages(): void
{
$storage = $this->createMock(FeatureFlagStorageInterface::class);
$storage->expects($this->never())->method('isFeatureActive');
$logger = $this->createMock(LoggerInterface::class);
$sut = new FeatureFlagManager([$storage], $logger);
$featureFlag = new class () implements FeatureFlagInterface, ForcedFeatureFlagStateInterface {
public function getName(): string
{
return 'ForcedEnabledFeature';
}
public function getForcedFeatureFlagState(): bool
{
return true;
}
};
$this->assertTrue($sut->isFeatureActive(get_class($featureFlag)));
}
public function listOfStorages(): \Generator
{
yield [
[
// The return values for isFeatureActive on the storage
true,
false,
true,
],
// Expected outcome
true,
];
yield [
[
// The return values for isFeatureActive on the storage
false,
null,
false,
],
// Expected outcome
false,
];
yield [
[
// The return values for isFeatureActive on the storage
null,
null,
true,
],
// Expected outcome
true,
];
yield [
[
// The return values for isFeatureActive on the storage
true,
true,
false,
],
// Expected outcome
false,
];
yield [
[
// The return values for isFeatureActive on the storage
true,
true,
null,
],
// Expected outcome
true,
];
yield [
[],
// Expected outcome
false,
];
}
}
|