Skip to content

Commit 39d5105

Browse files
committed
fix for ch22995 - include prereq value in event even if prereq is off
1 parent 07eb1a7 commit 39d5105

File tree

2 files changed

+63
-14
lines changed

2 files changed

+63
-14
lines changed

src/LaunchDarkly/FeatureFlag.php

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,9 @@ public function isOn()
109109
*/
110110
public function evaluate($user, $featureRequester, $includeReasonsInEvents = false)
111111
{
112-
if ($this->isOn()) {
113-
$prereqEvents = array();
114-
$detail = $this->evaluateInternal($user, $featureRequester, $prereqEvents, $includeReasonsInEvents);
115-
return new EvalResult($detail, $prereqEvents);
116-
}
117-
return new EvalResult($this->getOffValue(EvaluationReason::off()), array());
112+
$prereqEvents = array();
113+
$detail = $this->evaluateInternal($user, $featureRequester, $prereqEvents, $includeReasonsInEvents);
114+
return new EvalResult($detail, $prereqEvents);
118115
}
119116

120117
/**
@@ -126,6 +123,10 @@ public function evaluate($user, $featureRequester, $includeReasonsInEvents = fal
126123
*/
127124
private function evaluateInternal($user, $featureRequester, &$events, $includeReasonsInEvents)
128125
{
126+
if (!$this->isOn()) {
127+
return $this->getOffValue(EvaluationReason::off());
128+
}
129+
129130
$prereqFailureReason = $this->checkPrerequisites($user, $featureRequester, $events, $includeReasonsInEvents);
130131
if ($prereqFailureReason !== null) {
131132
return $this->getOffValue($prereqFailureReason);
@@ -170,19 +171,14 @@ private function checkPrerequisites($user, $featureRequester, &$events, $include
170171
$prereqFeatureFlag = $featureRequester->getFeature($prereq->getKey());
171172
if ($prereqFeatureFlag == null) {
172173
$prereqOk = false;
173-
} elseif ($prereqFeatureFlag->isOn()) {
174+
} else {
174175
$prereqEvalResult = $prereqFeatureFlag->evaluateInternal($user, $featureRequester, $events, $includeReasonsInEvents);
175176
$variation = $prereq->getVariation();
176-
if ($prereqEvalResult->getVariationIndex() !== $variation) {
177+
if (!$prereqFeatureFlag->isOn() || $prereqEvalResult->getVariationIndex() !== $variation) {
177178
$prereqOk = false;
178179
}
179-
} else {
180-
$prereqOk = false;
181-
}
182-
if ($prereqFeatureFlag) {
183180
array_push($events, Util::newFeatureRequestEvent($prereq->getKey(), $user,
184-
$prereqEvalResult ? $prereqEvalResult->getVariationIndex() : null,
185-
$prereqEvalResult ? $prereqEvalResult->getValue() : null,
181+
$prereqEvalResult->getVariationIndex(), $prereqEvalResult->getValue(),
186182
null, $prereqFeatureFlag->getVersion(), $this->_key,
187183
($includeReasonsInEvents && $prereqEvalResult) ? $prereqEvalResult->getReason() : null
188184
));

tests/FeatureFlagTest.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,59 @@ public function testFlagReturnsOffVariationIfPrerequisiteIsNotFound()
314314
self::assertEquals(array(), $result->getPrerequisiteEvents());
315315
}
316316

317+
public function testFlagReturnsOffVariationAndEventIfPrerequisiteIsOff()
318+
{
319+
$flag0Json = array(
320+
'key' => 'feature0',
321+
'version' => 1,
322+
'deleted' => false,
323+
'on' => true,
324+
'targets' => array(),
325+
'prerequisites' => array(
326+
array('key' => 'feature1', 'variation' => 1)
327+
),
328+
'rules' => array(),
329+
'offVariation' => 1,
330+
'fallthrough' => array('variation' => 0),
331+
'variations' => array('fall', 'off', 'on'),
332+
'salt' => ''
333+
);
334+
$flag1Json = array(
335+
'key' => 'feature1',
336+
'version' => 2,
337+
'deleted' => false,
338+
'on' => false,
339+
'targets' => array(),
340+
'prerequisites' => array(),
341+
'rules' => array(),
342+
'offVariation' => 1,
343+
// note that even though it returns the desired variation, it is still off and therefore not a match
344+
'fallthrough' => array('variation' => 0),
345+
'variations' => array('nogo', 'go'),
346+
'salt' => ''
347+
);
348+
$flag0 = FeatureFlag::decode($flag0Json);
349+
$flag1 = FeatureFlag::decode($flag1Json);
350+
$ub = new LDUserBuilder('x');
351+
$user = $ub->build();
352+
$requester = new MockFeatureRequesterForFeature();
353+
$requester->key = $flag1->getKey();
354+
$requester->val = $flag1;
355+
356+
$result = $flag0->evaluate($user, $requester);
357+
$detail = new EvaluationDetail('off', 1, EvaluationReason::prerequisiteFailed('feature1'));
358+
self::assertEquals($detail, $result->getDetail());
359+
360+
$events = $result->getPrerequisiteEvents();
361+
self::assertEquals(1, count($events));
362+
$event = $events[0];
363+
self::assertEquals('feature', $event['kind']);
364+
self::assertEquals($flag1->getKey(), $event['key']);
365+
self::assertEquals('go', $event['value']);
366+
self::assertEquals($flag1->getVersion(), $event['version']);
367+
self::assertEquals($flag0->getKey(), $event['prereqOf']);
368+
}
369+
317370
public function testFlagReturnsOffVariationAndEventIfPrerequisiteIsNotMet()
318371
{
319372
$flag0Json = array(

0 commit comments

Comments
 (0)