Skip to content

Commit dce52a8

Browse files
authored
Fix - Correct retrieval of 0 feature values via DB driver (#143)
1 parent 236fdb7 commit dce52a8

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

src/Drivers/DatabaseDriver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public function getAll($features): array
158158
$filtered = $records->where('name', $feature)->where('scope', Feature::serializeScope($scope));
159159

160160
if ($filtered->isNotEmpty()) {
161-
return json_decode($filtered->value('value'), flags: JSON_OBJECT_AS_ARRAY | JSON_THROW_ON_ERROR); // @phpstan-ignore argument.type
161+
return json_decode($filtered->first()->value, flags: JSON_OBJECT_AS_ARRAY | JSON_THROW_ON_ERROR);
162162
}
163163

164164
return with($this->resolveValue($feature, $scope), function ($value) use ($feature, $scope, $inserts) {

tests/Feature/ArrayDriverTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,41 @@ public function test_it_can_resolve_feature_instance()
11781178
$this->assertInstanceOf(Lottery::class, $feature);
11791179
$this->assertSame('345', $feature());
11801180
}
1181+
1182+
public function test_can_retrieve_scalar_values_without_in_memory_cache(): void
1183+
{
1184+
$data = [
1185+
'one' => 1,
1186+
'ten' => 10,
1187+
'zero' => 0,
1188+
'minus-one' => -1,
1189+
'minus-ten' => -10,
1190+
'one-point-five' => 1.5,
1191+
'ten-point-five' => 10.5,
1192+
'zero-point-five' => 0.5,
1193+
'minus-one-point-five' => -1.5,
1194+
'minus-ten-point-five' => -10.5,
1195+
'bool-true' => true,
1196+
'bool-false' => false,
1197+
'null' => null,
1198+
];
1199+
1200+
$user = new User;
1201+
1202+
foreach ($data as $name => $expectedValue) {
1203+
$feature = 'scalar-feature:'.$name;
1204+
Feature::define($feature, fn(User $user) => $expectedValue);
1205+
1206+
$generated = Feature::for($user)->value($feature);
1207+
1208+
Feature::flushCache();
1209+
1210+
$retrieved = Feature::for($user)->value($feature);
1211+
1212+
$this->assertEquals($expectedValue, $generated);
1213+
$this->assertEquals($expectedValue, $retrieved);
1214+
}
1215+
}
11811216
}
11821217

11831218
class MyFeature

tests/Feature/DatabaseDriverTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,6 +1708,41 @@ public function test_can_retrieve_all_features_for_differing_scope_types(): void
17081708
$this->assertCount(8, DB::getQueryLog());
17091709
$this->assertCount(13, DB::table('features')->get());
17101710
}
1711+
1712+
public function test_can_retrieve_scalar_values_without_in_memory_cache(): void
1713+
{
1714+
$data = [
1715+
'one' => 1,
1716+
'ten' => 10,
1717+
'zero' => 0,
1718+
'minus-one' => -1,
1719+
'minus-ten' => -10,
1720+
'one-point-five' => 1.5,
1721+
'ten-point-five' => 10.5,
1722+
'zero-point-five' => 0.5,
1723+
'minus-one-point-five' => -1.5,
1724+
'minus-ten-point-five' => -10.5,
1725+
'bool-true' => true,
1726+
'bool-false' => false,
1727+
'null' => null,
1728+
];
1729+
1730+
$user = new User;
1731+
1732+
foreach ($data as $name => $expectedValue) {
1733+
$feature = 'scalar-feature:'.$name;
1734+
Feature::define($feature, fn(User $user) => $expectedValue);
1735+
1736+
$generated = Feature::for($user)->value($feature);
1737+
1738+
Feature::flushCache();
1739+
1740+
$retrieved = Feature::for($user)->value($feature);
1741+
1742+
$this->assertEquals($expectedValue, $generated);
1743+
$this->assertEquals($expectedValue, $retrieved);
1744+
}
1745+
}
17111746
}
17121747

17131748
class UnregisteredFeature

0 commit comments

Comments
 (0)