Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: support both snake_case and camelCase versions of impression data #227

Closed
wants to merge 13 commits into from
12 changes: 8 additions & 4 deletions src/DTO/DefaultProxyFeature.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
* value: string
* }
* },
* impression_data: bool
* impressionData: bool
gastonfournier marked this conversation as resolved.
Show resolved Hide resolved
* } $response
*/
public function __construct(array $response)
Expand All @@ -37,12 +37,15 @@ public function __construct(array $response)
// tries to new this up manually and isn't interesting to tests

// @codeCoverageIgnoreStart
assert(isset($response['name'], $response['enabled'], $response['variant'], $response['impression_data']));
assert(
isset($response['name'], $response['enabled'], $response['variant'])
&& (isset($response['impressionData']) || isset($response['impression_data']))
);
// @codeCoverageIgnoreEnd

$this->name = $response['name'];
$this->enabled = $response['enabled'];
$this->impressionData = $response['impression_data'];
$this->impressionData = $response['impressionData'] ?? $response['impression_data'] ?? false;

$payload = null;

Expand Down Expand Up @@ -87,7 +90,8 @@ public function jsonSerialize(): array
'name' => $this->name,
'enabled' => $this->enabled,
'variant' => $this->variant,
'impression_data' => $this->impressionData,
'impression_data' => $this->impressionData, // deprecated
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We output both formats because this is public and might be in use.

'impressionData' => $this->impressionData, // if you were reading the snake then you should read the camel
];
}
}
11 changes: 8 additions & 3 deletions src/Repository/DefaultUnleashProxyRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -153,16 +153,21 @@ private function addQuery(string $url, string $query): string
* value: string
* }
* },
* impression_data: bool
* impressionData: bool
* }|null
*/
private function validateResponse(array $response): ?array
{
if (!isset($response['name'], $response['enabled'], $response['variant'], $response['impression_data'])) {
// fix impression data:
if (isset($response['impression_data'])) {
$response['impressionData'] = $response['impression_data'];
unset($response['impression_data']);
}
if (!isset($response['name'], $response['enabled'], $response['variant'], $response['impressionData'])) {
return null;
}

if (!is_string($response['name']) || !is_bool($response['enabled']) || !is_bool($response['impression_data']) || !is_array($response['variant'])) {
if (!is_string($response['name']) || !is_bool($response['enabled']) || !is_bool($response['impressionData']) || !is_array($response['variant'])) {
gastonfournier marked this conversation as resolved.
Show resolved Hide resolved
return null;
}

Expand Down
23 changes: 22 additions & 1 deletion tests/DTO/DefaultProxyFeatureTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,20 @@
final class DefaultProxyFeatureTest extends TestCase
{
public function testGetProperties()
{
$instance = new DefaultProxyFeature(['name' => 'test', 'enabled' => true, 'impressionData' => true, 'variant' => ['name' => 'someVariant', 'enabled' => true, 'payload' => ['type' => 'string', 'value' => 'test']]]);
RikudouSage marked this conversation as resolved.
Show resolved Hide resolved
self::assertIsString($instance->getName());
self::assertIsBool($instance->isEnabled());
self::assertIsBool($instance->hasImpressionData());
self::assertInstanceOf(DefaultVariant::class, $instance->getVariant());

self::assertEquals('test', $instance->getName());
self::assertTrue($instance->isEnabled());
self::assertTrue($instance->hasImpressionData());
self::assertEquals('someVariant', $instance->getVariant()->getName());
}

public function testGetPropertiesImpressionDataSnakeCaseBackwardsCompatibility()
{
$instance = new DefaultProxyFeature(['name' => 'test', 'enabled' => true, 'impression_data' => true, 'variant' => ['name' => 'someVariant', 'enabled' => true, 'payload' => ['type' => 'string', 'value' => 'test']]]);
self::assertIsString($instance->getName());
Expand All @@ -23,9 +37,16 @@ public function testGetProperties()
}

public function testToJson()
{
$instance = new DefaultProxyFeature(['name' => 'test', 'enabled' => true, 'impressionData' => true, 'variant' => ['name' => 'someVariant', 'enabled' => true, 'payload' => ['type' => 'string', 'value' => 'test']]]);
$json = json_encode($instance);
self::assertEquals('{"name":"test","enabled":true,"variant":{"name":"someVariant","enabled":true,"payload":{"type":"string","value":"test"}},"impression_data":true,"impressionData":true}', $json);
}

public function testToJsonFromSnakeCaseImpressionDataForBackwardsCompatibility()
{
$instance = new DefaultProxyFeature(['name' => 'test', 'enabled' => true, 'impression_data' => true, 'variant' => ['name' => 'someVariant', 'enabled' => true, 'payload' => ['type' => 'string', 'value' => 'test']]]);
$json = json_encode($instance);
self::assertEquals('{"name":"test","enabled":true,"variant":{"name":"someVariant","enabled":true,"payload":{"type":"string","value":"test"}},"impression_data":true}', $json);
self::assertEquals('{"name":"test","enabled":true,"variant":{"name":"someVariant","enabled":true,"payload":{"type":"string","value":"test"}},"impression_data":true,"impressionData":true}', $json);
}
}
16 changes: 8 additions & 8 deletions tests/DefaultProxyUnleashTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public function testBasicResolveFeature()
'name' => 'some-variant',
'enabled' => true,
],
'impression_data' => false,
'impressionData' => false,
]);
$unleash = $builder->build();

Expand Down Expand Up @@ -89,7 +89,7 @@ public function testBasicResolveVariant()
],
'enabled' => true,
],
'impression_data' => false,
'impressionData' => false,
]);
$unleash = $builder->build();
$variant = $unleash->getVariant('test');
Expand All @@ -107,7 +107,7 @@ public function testVariantWithoutPayload()
'name' => 'some-variant',
'enabled' => true,
],
'impression_data' => false,
'impressionData' => false,
]);
$unleash = $builder->build();
$variant = $unleash->getVariant('test');
Expand Down Expand Up @@ -138,7 +138,7 @@ public function testVariantWithNullPayload()
'payload' => null,
'enabled' => true,
],
'impression_data' => false,
'impressionData' => false,
]);
$unleash = $builder->build();
$variant = $unleash->getVariant('test');
Expand All @@ -159,7 +159,7 @@ public function testCachingIsRespected()
'name' => 'some-variant',
'enabled' => true,
],
'impression_data' => false,
'impressionData' => false,
]);

$builder = new TestBuilder();
Expand Down Expand Up @@ -236,15 +236,15 @@ public function testPoisonedResponsesReturnFalse()
'name' => 'some-variant',
'enabled' => true,
],
'impression_data' => false,
'impressionData' => false,
],
[
'name' => 'test',
'enabled' => true,
'variant' => [
'poisoned' => 'variant',
],
'impression_data' => false,
'impressionData' => false,
],
[
'name' => 'test',
Expand All @@ -257,7 +257,7 @@ public function testPoisonedResponsesReturnFalse()
'value' => 'stuff',
],
],
'impression_data' => false,
'impressionData' => false,
],
];

Expand Down
4 changes: 2 additions & 2 deletions tests/Repository/DefaultUnleashProxyRepositoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public function test200ResponseResolvesCorrectly()
],
'enabled' => true,
],
'impression_data' => false,
'impressionData' => false,
])
),
]);
Expand Down Expand Up @@ -112,7 +112,7 @@ public function testCacheTtlIsRespected()
],
'enabled' => true,
],
'impression_data' => false,
'impressionData' => false,
]);

$mock = new MockHandler([
Expand Down
Loading