Skip to content

Commit b51fe33

Browse files
committed
Merge pull request #41 from launchdarkly/pk/coerce-user-key
coerce user keys to strings
2 parents 92f3857 + 0269059 commit b51fe33

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

ldclient/client.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,12 @@ def _send(self, event):
196196
self._queue.put(event)
197197

198198
def track(self, event_name, user, data=None):
199+
self._sanitize_user(user)
199200
self._send({'kind': 'custom', 'key': event_name,
200201
'user': user, 'data': data})
201202

202203
def identify(self, user):
204+
self._sanitize_user(user)
203205
self._send({'kind': 'identify', 'key': user['key'], 'user': user})
204206

205207
def set_offline(self):
@@ -223,7 +225,7 @@ def get_flag(self, key, user, default=False):
223225
return self.toggle(key, user, default)
224226

225227
def toggle(self, key, user, default=False):
226-
228+
self._sanitize_user(user)
227229
default = self._config.get_default(key, default)
228230

229231
if self._offline:
@@ -251,4 +253,8 @@ def cb(feature):
251253
'Unhandled exception. Returning default value for flag.')
252254
return cb(None)
253255

256+
def _sanitize_user(self, user):
257+
if 'key' in user:
258+
user['key'] = str(user['key'])
259+
254260
__all__ = ['LDClient', 'Config']

testing/test_ldclient.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ def get(self, key, callback):
4848
}
4949
}
5050

51+
numeric_key_user = {}
52+
53+
sanitized_numeric_key_user = {
54+
u'key': '33',
55+
u'custom': {
56+
u'bizzle': u'def'
57+
}
58+
}
59+
5160

5261
class MockConsumer(object):
5362

@@ -76,6 +85,13 @@ def noop_consumer():
7685

7786

7887
def setup_function(function):
88+
global numeric_key_user
89+
numeric_key_user = {
90+
u'key': 33,
91+
u'custom': {
92+
u'bizzle': u'def'
93+
}
94+
}
7995
client.set_online()
8096
client._queue = queue.Queue(10)
8197
client._consumer = mock_consumer()
@@ -119,6 +135,18 @@ def expected_event(e):
119135

120136
assert expected_event(client._queue.get(False))
121137

138+
def test_sanitize_user():
139+
client._sanitize_user(numeric_key_user)
140+
assert numeric_key_user == sanitized_numeric_key_user
141+
142+
def test_toggle_event_numeric_user_key():
143+
client.toggle('feature.key', numeric_key_user, default=None)
144+
145+
def expected_event(e):
146+
return e['kind'] == 'feature' and e['key'] == 'feature.key' and e['user'] == sanitized_numeric_key_user and e['value'] == True and e['default'] == None
147+
148+
assert expected_event(client._queue.get(False))
149+
122150

123151
def test_toggle_event_offline():
124152
client.set_offline()
@@ -135,6 +163,15 @@ def expected_event(e):
135163
assert expected_event(client._queue.get(False))
136164

137165

166+
def test_identify_numeric_key_user():
167+
client.identify(numeric_key_user)
168+
169+
def expected_event(e):
170+
return e['kind'] == 'identify' and e['key'] == '33' and e['user'] == sanitized_numeric_key_user
171+
172+
assert expected_event(client._queue.get(False))
173+
174+
138175
def test_identify_offline():
139176
client.set_offline()
140177
client.identify(user)
@@ -150,6 +187,15 @@ def expected_event(e):
150187
assert expected_event(client._queue.get(False))
151188

152189

190+
def test_track_numeric_key_user():
191+
client.track('my_event', numeric_key_user, 42)
192+
193+
def expected_event(e):
194+
return e['kind'] == 'custom' and e['key'] == 'my_event' and e['user'] == sanitized_numeric_key_user and e['data'] == 42
195+
196+
assert expected_event(client._queue.get(False))
197+
198+
153199
def test_track_offline():
154200
client.set_offline()
155201
client.track('my_event', user, 42)

0 commit comments

Comments
 (0)