Skip to content

Commit 6c09a8b

Browse files
authored
various feature toggle updates (#233)
1 parent cc2d11d commit 6c09a8b

9 files changed

Lines changed: 79 additions & 16 deletions

src/SonsOfPHP/Component/FeatureToggle/Provider/InMemoryFeatureToggleProvider.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616
final class InMemoryFeatureToggleProvider implements FeatureToggleProviderInterface
1717
{
18-
public $feature;
19-
2018
private array $features = [];
2119

2220
/**
@@ -32,7 +30,7 @@ public function __construct(array $features = [])
3230
public function get(string $key): FeatureInterface
3331
{
3432
if ($this->has($key)) {
35-
return $this->feature[$key];
33+
return $this->features[$key];
3634
}
3735

3836
throw new FeatureNotFoundException(sprintf('Feature "%s" not found', $key));

src/SonsOfPHP/Component/FeatureToggle/Tests/FeatureTest.php

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PHPUnit\Framework\TestCase;
1212
use SonsOfPHP\Component\FeatureToggle\Context;
1313
use SonsOfPHP\Component\FeatureToggle\Feature;
14+
use SonsOfPHP\Contract\FeatureToggle\Exception\InvalidArgumentExceptionInterface;
1415
use SonsOfPHP\Contract\FeatureToggle\FeatureInterface;
1516
use SonsOfPHP\Contract\FeatureToggle\ToggleInterface;
1617

@@ -19,33 +20,37 @@
1920
#[UsesClass(Context::class)]
2021
final class FeatureTest extends TestCase
2122
{
23+
private Feature $feature;
24+
2225
private ToggleInterface&MockObject $toggle;
2326

2427
protected function setUp(): void
2528
{
2629
$this->toggle = $this->createMock(ToggleInterface::class);
30+
31+
$this->feature = new Feature('key', $this->toggle);
2732
}
2833

2934
public function testItHasTheCorrectInterface(): void
3035
{
31-
$feature = new Feature('example', $this->toggle);
32-
33-
$this->assertInstanceOf(FeatureInterface::class, $feature);
36+
$this->assertInstanceOf(FeatureInterface::class, $this->feature);
3437
}
3538

36-
public function testItReturnsTheCorrectKey(): void
39+
public function testItsKeyIsInmutable(): void
3740
{
38-
$feature = new Feature('example', $this->toggle);
39-
40-
$this->assertSame('example', $feature->getKey());
41+
$this->assertSame('key', $this->feature->getKey());
4142
}
4243

43-
public function testIsEnabled(): void
44+
public function testItsIsEnabledReturnsTrue(): void
4445
{
4546
$this->toggle->expects($this->once())->method('isEnabled')->willReturn(true);
4647

47-
$feature = new Feature('example', $this->toggle);
48+
$this->assertTrue($this->feature->isEnabled(new Context()));
49+
}
4850

49-
$this->assertTrue($feature->isEnabled(new Context()));
51+
public function testItWillThrowExceptionForInvalidKey(): void
52+
{
53+
$this->expectException(InvalidArgumentExceptionInterface::class);
54+
new Feature('test-key', $this->toggle);
5055
}
5156
}

src/SonsOfPHP/Component/FeatureToggle/Tests/Provider/InMemoryFeatureToggleProviderTest.php

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,74 @@
66

77
use PHPUnit\Framework\Attributes\CoversClass;
88
use PHPUnit\Framework\Attributes\Group;
9-
use PHPUnit\Framework\Attributes\UsesClass;
9+
use PHPUnit\Framework\MockObject\MockObject;
1010
use PHPUnit\Framework\TestCase;
11-
use SonsOfPHP\Component\FeatureToggle\Feature;
1211
use SonsOfPHP\Component\FeatureToggle\Provider\InMemoryFeatureToggleProvider;
12+
use SonsOfPHP\Contract\FeatureToggle\Exception\FeatureAlreadyExistsExceptionInterface;
13+
use SonsOfPHP\Contract\FeatureToggle\Exception\FeatureNotFoundExceptionInterface;
14+
use SonsOfPHP\Contract\FeatureToggle\Exception\InvalidArgumentExceptionInterface;
15+
use SonsOfPHP\Contract\FeatureToggle\FeatureInterface;
1316
use SonsOfPHP\Contract\FeatureToggle\FeatureToggleProviderInterface;
1417

1518
#[Group('feature-toggle')]
1619
#[CoversClass(InMemoryFeatureToggleProvider::class)]
17-
#[UsesClass(Feature::class)]
1820
final class InMemoryFeatureToggleProviderTest extends TestCase
1921
{
2022
private InMemoryFeatureToggleProvider $provider;
2123

24+
private FeatureInterface&MockObject $feature;
25+
2226
protected function setUp(): void
2327
{
2428
$this->provider = new InMemoryFeatureToggleProvider();
29+
30+
$this->feature = $this->createMock(FeatureInterface::class);
31+
$this->feature->method('getKey')->willReturn('test');
2532
}
2633

2734
public function testItHasTheCorrectInterface(): void
2835
{
2936
$this->assertInstanceOf(FeatureToggleProviderInterface::class, $this->provider);
3037
}
38+
39+
public function testItsAddWillAddFeature(): void
40+
{
41+
$this->assertFalse($this->provider->has('test'));
42+
$this->provider->add($this->feature);
43+
$this->assertTrue($this->provider->has('test'));
44+
}
45+
46+
public function testItsAddWillThrowExceptionIfAlreadyAdded(): void
47+
{
48+
$this->provider->add($this->feature);
49+
$this->expectException(FeatureAlreadyExistsExceptionInterface::class);
50+
$this->provider->add($this->feature);
51+
}
52+
53+
public function testItsGetCanReturnCorrectFeature(): void
54+
{
55+
$this->provider->add($this->feature);
56+
$this->assertSame($this->feature, $this->provider->get('test'));
57+
}
58+
59+
public function testItsGetWillThrowExceptionIfFeatureNotFound(): void
60+
{
61+
$this->expectException(FeatureNotFoundExceptionInterface::class);
62+
$this->provider->get('test');
63+
}
64+
65+
public function testItsHasWillThrowExceptionWhenInvalidKeyIsPassed(): void
66+
{
67+
$this->expectException(InvalidArgumentExceptionInterface::class);
68+
$this->provider->has('invalid-key');
69+
}
70+
71+
public function testItsAllWillReturnFeaturesInCorrectFormat(): void
72+
{
73+
$this->provider->add($this->feature);
74+
75+
$features = iterator_to_array($this->provider->all());
76+
$this->assertArrayHasKey('test', $features);
77+
$this->assertSame($this->feature, $features['test']);
78+
}
3179
}

src/SonsOfPHP/Component/FeatureToggle/Tests/Toggle/AffirmativeToggleTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
namespace SonsOfPHP\Component\FeatureToggle\Tests\Toggle;
66

77
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\Group;
89
use PHPUnit\Framework\Attributes\UsesClass;
910
use PHPUnit\Framework\TestCase;
1011
use SonsOfPHP\Component\FeatureToggle\Toggle\AffirmativeToggle;
1112
use SonsOfPHP\Component\FeatureToggle\Toggle\MockToggle;
1213
use SonsOfPHP\Contract\FeatureToggle\ToggleInterface;
1314

15+
#[Group('feature-toggle')]
1416
#[CoversClass(AffirmativeToggle::class)]
1517
#[UsesClass(MockToggle::class)]
1618
final class AffirmativeToggleTest extends TestCase

src/SonsOfPHP/Component/FeatureToggle/Tests/Toggle/AlwaysDisabledToggleTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
namespace SonsOfPHP\Component\FeatureToggle\Tests\Toggle;
66

77
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\Group;
89
use PHPUnit\Framework\Attributes\UsesClass;
910
use PHPUnit\Framework\TestCase;
1011
use SonsOfPHP\Component\FeatureToggle\Context;
1112
use SonsOfPHP\Component\FeatureToggle\Toggle\AlwaysDisabledToggle;
1213
use SonsOfPHP\Contract\FeatureToggle\ToggleInterface;
1314

15+
#[Group('feature-toggle')]
1416
#[CoversClass(AlwaysDisabledToggle::class)]
1517
#[UsesClass(Context::class)]
1618
final class AlwaysDisabledToggleTest extends TestCase

src/SonsOfPHP/Component/FeatureToggle/Tests/Toggle/AlwaysEnabledToggleTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
namespace SonsOfPHP\Component\FeatureToggle\Tests\Toggle;
66

77
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\Group;
89
use PHPUnit\Framework\Attributes\UsesClass;
910
use PHPUnit\Framework\TestCase;
1011
use SonsOfPHP\Component\FeatureToggle\Context;
1112
use SonsOfPHP\Component\FeatureToggle\Toggle\AlwaysEnabledToggle;
1213
use SonsOfPHP\Contract\FeatureToggle\ToggleInterface;
1314

15+
#[Group('feature-toggle')]
1416
#[CoversClass(AlwaysEnabledToggle::class)]
1517
#[UsesClass(Context::class)]
1618
final class AlwaysEnabledToggleTest extends TestCase

src/SonsOfPHP/Component/FeatureToggle/Tests/Toggle/ChainToggleTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
namespace SonsOfPHP\Component\FeatureToggle\Tests\Toggle;
66

77
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\Group;
89
use PHPUnit\Framework\Attributes\UsesClass;
910
use PHPUnit\Framework\TestCase;
1011
use SonsOfPHP\Component\FeatureToggle\Toggle\ChainToggle;
1112
use SonsOfPHP\Component\FeatureToggle\Toggle\MockToggle;
1213
use SonsOfPHP\Contract\FeatureToggle\ToggleInterface;
1314

15+
#[Group('feature-toggle')]
1416
#[CoversClass(ChainToggle::class)]
1517
#[UsesClass(MockToggle::class)]
1618
final class ChainToggleTest extends TestCase

src/SonsOfPHP/Component/FeatureToggle/Tests/Toggle/DateRangeToggleTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66

77
use DateTimeImmutable;
88
use PHPUnit\Framework\Attributes\CoversClass;
9+
use PHPUnit\Framework\Attributes\Group;
910
use PHPUnit\Framework\Attributes\UsesClass;
1011
use PHPUnit\Framework\TestCase;
1112
use SonsOfPHP\Component\FeatureToggle\Context;
1213
use SonsOfPHP\Component\FeatureToggle\Toggle\DateRangeToggle;
1314
use SonsOfPHP\Contract\FeatureToggle\ToggleInterface;
1415

16+
#[Group('feature-toggle')]
1517
#[CoversClass(DateRangeToggle::class)]
1618
#[UsesClass(DateRangeToggle::class)]
1719
#[UsesClass(Context::class)]

src/SonsOfPHP/Component/FeatureToggle/Tests/Toggle/MockToggleTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
namespace SonsOfPHP\Component\FeatureToggle\Tests\Toggle;
66

77
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\Group;
89
use PHPUnit\Framework\Attributes\UsesClass;
910
use PHPUnit\Framework\TestCase;
1011
use SonsOfPHP\Component\FeatureToggle\Context;
1112
use SonsOfPHP\Component\FeatureToggle\Toggle\MockToggle;
1213
use SonsOfPHP\Contract\FeatureToggle\ToggleInterface;
1314

15+
#[Group('feature-toggle')]
1416
#[CoversClass(MockToggle::class)]
1517
#[UsesClass(Context::class)]
1618
final class MockToggleTest extends TestCase

0 commit comments

Comments
 (0)