Skip to content

Commit 38aa905

Browse files
committed
Merge pull request #18 from hipchat/master
Ability to pass in defaults and turn off events
2 parents af761fd + 1d25e5f commit 38aa905

File tree

2 files changed

+99
-4
lines changed

2 files changed

+99
-4
lines changed

src/LaunchDarkly/LDClient.php

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class LDClient {
1515
protected $_client;
1616
protected $_eventProcessor;
1717
protected $_offline;
18+
protected $_events = true;
19+
protected $_defaults = array();
1820

1921
/** @var FeatureRequester */
2022
protected $_featureRequester;
@@ -37,6 +39,13 @@ public function __construct($apiKey, $options = array()) {
3739
else {
3840
$this->_baseUri = rtrim($options['base_uri'], '/');
3941
}
42+
if (isset($options['events'])) {
43+
$this->_events = $options['events'];
44+
}
45+
if (isset($options['defaults'])) {
46+
$this->_defaults = $options['defaults'];
47+
}
48+
4049
if (!isset($options['timeout'])) {
4150
$options['timeout'] = 3;
4251
}
@@ -77,7 +86,8 @@ public function toggle($key, $user, $default = false) {
7786
}
7887

7988
try {
80-
$flag = $this->_toggle($key, $user, $default);
89+
$default = $this->_get_default($key, $default);
90+
$flag = $this->_toggle($key, $user);
8191

8292
if (is_null($flag)) {
8393
$this->_sendFlagRequestEvent($key, $user, $default);
@@ -169,7 +179,7 @@ public function identify($user) {
169179
* @param $value mixed
170180
*/
171181
protected function _sendFlagRequestEvent($key, $user, $value) {
172-
if ($this->isOffline()) {
182+
if ($this->isOffline() || !$this->_events) {
173183
return;
174184
}
175185

@@ -182,17 +192,25 @@ protected function _sendFlagRequestEvent($key, $user, $value) {
182192
$this->_eventProcessor->enqueue($event);
183193
}
184194

185-
protected function _toggle($key, $user, $default) {
195+
protected function _toggle($key, $user) {
186196
try {
187197
$data = $this->_featureRequester->get($key);
188198
if ($data == null) {
189199
error_log("LDClient::_toggle received null from retriever, using default");
190-
return $default;
200+
return null;
191201
}
192202
return self::_decode($data, $user);
193203
} catch (Exception $e) {
194204
$msg = $e->getMessage();
195205
error_log("LDClient::_toggle received error $msg, using default");
206+
return null;
207+
}
208+
}
209+
210+
protected function _get_default($key, $default) {
211+
if (array_key_exists($key, $this->_defaults)) {
212+
return $this->_defaults[$key];
213+
} else {
196214
return $default;
197215
}
198216
}

tests/LDClientTest.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,89 @@
11
<?php
22
namespace LaunchDarkly\Tests;
33

4+
use LaunchDarkly\FeatureRequester;
45
use LaunchDarkly\LDClient;
6+
use LaunchDarkly\LDUserBuilder;
7+
58

69
class LDClientTest extends \PHPUnit_Framework_TestCase {
710

811
public function testDefaultCtor() {
912
new LDClient("BOGUS_API_KEY");
1013
}
14+
15+
public function testToggleDefault() {
16+
MockFeatureRequester::$val = null;
17+
$client = new LDClient("someKey", array(
18+
'feature_requester_class' => '\\LaunchDarkly\Tests\\MockFeatureRequester',
19+
'events' => false
20+
));
21+
22+
$builder = new LDUserBuilder(3);
23+
$user = $builder->build();
24+
$this->assertEquals('argdef', $client->toggle('foo', $user, 'argdef'));
25+
}
26+
27+
public function testToggleFromArray() {
28+
MockFeatureRequester::$val = null;
29+
$client = new LDClient("someKey", array(
30+
'feature_requester_class' => '\\LaunchDarkly\Tests\\MockFeatureRequester',
31+
'events' => false,
32+
'defaults' => array('foo' => 'fromarray')
33+
));
34+
35+
$builder = new LDUserBuilder(3);
36+
$user = $builder->build();
37+
$this->assertEquals('fromarray', $client->toggle('foo', $user, 'argdef'));
38+
}
39+
40+
public function testToggleEvent() {
41+
MockFeatureRequester::$val = null;
42+
$client = new LDClient("someKey", array(
43+
'feature_requester_class' => '\\LaunchDarkly\Tests\\MockFeatureRequester',
44+
'events' => true
45+
));
46+
47+
$builder = new LDUserBuilder(3);
48+
$user = $builder->build();
49+
$client->toggle('foo', $user, 'argdef');
50+
$proc = getPrivateField($client, '_eventProcessor');
51+
$queue = getPrivateField($proc, '_queue');
52+
$this->assertEquals(1, sizeof($queue));
53+
}
54+
55+
public function testToggleEventsOff() {
56+
MockFeatureRequester::$val = null;
57+
$client = new LDClient("someKey", array(
58+
'feature_requester_class' => '\\LaunchDarkly\Tests\\MockFeatureRequester',
59+
'events' => false
60+
));
61+
62+
$builder = new LDUserBuilder(3);
63+
$user = $builder->build();
64+
$client->toggle('foo', $user, 'argdef');
65+
$proc = getPrivateField($client, '_eventProcessor');
66+
$queue = getPrivateField($proc, '_queue');
67+
$this->assertEquals(0, sizeof($queue));
68+
}
69+
}
70+
71+
72+
function getPrivateField(&$object, $fieldName)
73+
{
74+
$reflection = new \ReflectionClass(get_class($object));
75+
$field = $reflection->getProperty($fieldName);
76+
$field->setAccessible(true);
77+
78+
return $field->getValue($object);
1179
}
1280

81+
82+
class MockFeatureRequester implements FeatureRequester {
83+
public static $val = null;
84+
function __construct($baseurl, $key, $options) {
85+
}
86+
public function get($key) {
87+
return self::$val;
88+
}
89+
}

0 commit comments

Comments
 (0)