diff --git a/ldclient/client.py b/ldclient/client.py index 1e757739..3f5c6da6 100644 --- a/ldclient/client.py +++ b/ldclient/client.py @@ -196,10 +196,12 @@ def _send(self, event): self._queue.put(event) def track(self, event_name, user, data=None): + self._sanitize_user(user) self._send({'kind': 'custom', 'key': event_name, 'user': user, 'data': data}) def identify(self, user): + self._sanitize_user(user) self._send({'kind': 'identify', 'key': user['key'], 'user': user}) def set_offline(self): @@ -223,7 +225,7 @@ def get_flag(self, key, user, default=False): return self.toggle(key, user, default) def toggle(self, key, user, default=False): - + self._sanitize_user(user) default = self._config.get_default(key, default) if self._offline: @@ -251,4 +253,8 @@ def cb(feature): 'Unhandled exception. Returning default value for flag.') return cb(None) + def _sanitize_user(self, user): + if 'key' in user: + user['key'] = str(user['key']) + __all__ = ['LDClient', 'Config'] diff --git a/testing/test_ldclient.py b/testing/test_ldclient.py index 438e63d2..1c8c0b31 100644 --- a/testing/test_ldclient.py +++ b/testing/test_ldclient.py @@ -48,6 +48,15 @@ def get(self, key, callback): } } +numeric_key_user = {} + +sanitized_numeric_key_user = { + u'key': '33', + u'custom': { + u'bizzle': u'def' + } +} + class MockConsumer(object): @@ -76,6 +85,13 @@ def noop_consumer(): def setup_function(function): + global numeric_key_user + numeric_key_user = { + u'key': 33, + u'custom': { + u'bizzle': u'def' + } + } client.set_online() client._queue = queue.Queue(10) client._consumer = mock_consumer() @@ -119,6 +135,18 @@ def expected_event(e): assert expected_event(client._queue.get(False)) +def test_sanitize_user(): + client._sanitize_user(numeric_key_user) + assert numeric_key_user == sanitized_numeric_key_user + +def test_toggle_event_numeric_user_key(): + client.toggle('feature.key', numeric_key_user, default=None) + + def expected_event(e): + return e['kind'] == 'feature' and e['key'] == 'feature.key' and e['user'] == sanitized_numeric_key_user and e['value'] == True and e['default'] == None + + assert expected_event(client._queue.get(False)) + def test_toggle_event_offline(): client.set_offline() @@ -135,6 +163,15 @@ def expected_event(e): assert expected_event(client._queue.get(False)) +def test_identify_numeric_key_user(): + client.identify(numeric_key_user) + + def expected_event(e): + return e['kind'] == 'identify' and e['key'] == '33' and e['user'] == sanitized_numeric_key_user + + assert expected_event(client._queue.get(False)) + + def test_identify_offline(): client.set_offline() client.identify(user) @@ -150,6 +187,15 @@ def expected_event(e): assert expected_event(client._queue.get(False)) +def test_track_numeric_key_user(): + client.track('my_event', numeric_key_user, 42) + + def expected_event(e): + return e['kind'] == 'custom' and e['key'] == 'my_event' and e['user'] == sanitized_numeric_key_user and e['data'] == 42 + + assert expected_event(client._queue.get(False)) + + def test_track_offline(): client.set_offline() client.track('my_event', user, 42)