Skip to content

Commit cecd60e

Browse files
committed
telemetry api tests
1 parent 2f89b8a commit cecd60e

File tree

1 file changed

+284
-0
lines changed

1 file changed

+284
-0
lines changed

tests/api/test_telemetry_api.py

Lines changed: 284 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,284 @@
1+
"""Impressions API tests module."""
2+
3+
import pytest
4+
import unittest.mock as mock
5+
6+
from splitio.api import telemetry, client, APIException
7+
#from splitio.models.telemetry import
8+
from splitio.client.util import get_metadata
9+
from splitio.client.config import DEFAULT_CONFIG
10+
from splitio.version import __version__
11+
from splitio.engine.telemetry import TelemetryStorageProducer, TelemetryStorageProducerAsync
12+
from splitio.storage.inmemmory import InMemoryTelemetryStorage, InMemoryTelemetryStorageAsync
13+
14+
15+
class TelemetryAPITests(object):
16+
"""Telemetry API test cases."""
17+
18+
def test_record_unique_keys(self, mocker):
19+
"""Test telemetry posting unique keys."""
20+
httpclient = mocker.Mock(spec=client.HttpClient)
21+
httpclient.post.return_value = client.HttpResponse(200, '', {})
22+
uniques = {'keys': [1, 2, 3]}
23+
cfg = DEFAULT_CONFIG.copy()
24+
cfg.update({'IPAddressesEnabled': True, 'machineName': 'some_machine_name', 'machineIp': '123.123.123.123'})
25+
sdk_metadata = get_metadata(cfg)
26+
telemetry_storage = InMemoryTelemetryStorage()
27+
telemetry_producer = TelemetryStorageProducer(telemetry_storage)
28+
telemetry_runtime_producer = telemetry_producer.get_telemetry_runtime_producer()
29+
telemetry_api = telemetry.TelemetryAPI(httpclient, 'some_api_key', sdk_metadata, telemetry_runtime_producer)
30+
response = telemetry_api.record_unique_keys(uniques)
31+
32+
call_made = httpclient.post.mock_calls[0]
33+
34+
# validate positional arguments
35+
assert call_made[1] == ('telemetry', 'v1/keys/ss', 'some_api_key')
36+
37+
# validate key-value args (headers)
38+
assert call_made[2]['extra_headers'] == {
39+
'SplitSDKVersion': 'python-%s' % __version__,
40+
'SplitSDKMachineIP': '123.123.123.123',
41+
'SplitSDKMachineName': 'some_machine_name'
42+
}
43+
44+
# validate key-value args (body)
45+
assert call_made[2]['body'] == uniques
46+
47+
httpclient.reset_mock()
48+
def raise_exception(*args, **kwargs):
49+
raise client.HttpClientException('some_message')
50+
httpclient.post.side_effect = raise_exception
51+
with pytest.raises(APIException) as exc_info:
52+
response = telemetry_api.record_unique_keys(uniques)
53+
assert exc_info.type == APIException
54+
assert exc_info.value.message == 'some_message'
55+
56+
def test_record_init(self, mocker):
57+
"""Test telemetry posting init configs."""
58+
httpclient = mocker.Mock(spec=client.HttpClient)
59+
httpclient.post.return_value = client.HttpResponse(200, '', {})
60+
uniques = {'keys': [1, 2, 3]}
61+
cfg = DEFAULT_CONFIG.copy()
62+
cfg.update({'IPAddressesEnabled': True, 'machineName': 'some_machine_name', 'machineIp': '123.123.123.123'})
63+
sdk_metadata = get_metadata(cfg)
64+
telemetry_storage = InMemoryTelemetryStorage()
65+
telemetry_producer = TelemetryStorageProducer(telemetry_storage)
66+
telemetry_runtime_producer = telemetry_producer.get_telemetry_runtime_producer()
67+
telemetry_api = telemetry.TelemetryAPI(httpclient, 'some_api_key', sdk_metadata, telemetry_runtime_producer)
68+
response = telemetry_api.record_init(uniques)
69+
70+
call_made = httpclient.post.mock_calls[0]
71+
72+
# validate positional arguments
73+
assert call_made[1] == ('telemetry', '/v1/metrics/config', 'some_api_key')
74+
75+
# validate key-value args (headers)
76+
assert call_made[2]['extra_headers'] == {
77+
'SplitSDKVersion': 'python-%s' % __version__,
78+
'SplitSDKMachineIP': '123.123.123.123',
79+
'SplitSDKMachineName': 'some_machine_name'
80+
}
81+
82+
# validate key-value args (body)
83+
assert call_made[2]['body'] == uniques
84+
85+
httpclient.reset_mock()
86+
def raise_exception(*args, **kwargs):
87+
raise client.HttpClientException('some_message')
88+
httpclient.post.side_effect = raise_exception
89+
with pytest.raises(APIException) as exc_info:
90+
response = telemetry_api.record_init(uniques)
91+
assert exc_info.type == APIException
92+
assert exc_info.value.message == 'some_message'
93+
94+
def test_record_stats(self, mocker):
95+
"""Test telemetry posting stats."""
96+
httpclient = mocker.Mock(spec=client.HttpClient)
97+
httpclient.post.return_value = client.HttpResponse(200, '', {})
98+
uniques = {'keys': [1, 2, 3]}
99+
cfg = DEFAULT_CONFIG.copy()
100+
cfg.update({'IPAddressesEnabled': True, 'machineName': 'some_machine_name', 'machineIp': '123.123.123.123'})
101+
sdk_metadata = get_metadata(cfg)
102+
telemetry_storage = InMemoryTelemetryStorage()
103+
telemetry_producer = TelemetryStorageProducer(telemetry_storage)
104+
telemetry_runtime_producer = telemetry_producer.get_telemetry_runtime_producer()
105+
telemetry_api = telemetry.TelemetryAPI(httpclient, 'some_api_key', sdk_metadata, telemetry_runtime_producer)
106+
response = telemetry_api.record_stats(uniques)
107+
108+
call_made = httpclient.post.mock_calls[0]
109+
110+
# validate positional arguments
111+
assert call_made[1] == ('telemetry', '/v1/metrics/usage', 'some_api_key')
112+
113+
# validate key-value args (headers)
114+
assert call_made[2]['extra_headers'] == {
115+
'SplitSDKVersion': 'python-%s' % __version__,
116+
'SplitSDKMachineIP': '123.123.123.123',
117+
'SplitSDKMachineName': 'some_machine_name'
118+
}
119+
120+
# validate key-value args (body)
121+
assert call_made[2]['body'] == uniques
122+
123+
httpclient.reset_mock()
124+
def raise_exception(*args, **kwargs):
125+
raise client.HttpClientException('some_message')
126+
httpclient.post.side_effect = raise_exception
127+
with pytest.raises(APIException) as exc_info:
128+
response = telemetry_api.record_stats(uniques)
129+
assert exc_info.type == APIException
130+
assert exc_info.value.message == 'some_message'
131+
132+
133+
class TelemetryAPIAsyncTests(object):
134+
"""Telemetry API test cases."""
135+
136+
@pytest.mark.asyncio
137+
async def test_record_unique_keys(self, mocker):
138+
"""Test telemetry posting unique keys."""
139+
httpclient = mocker.Mock(spec=client.HttpClientAsync)
140+
uniques = {'keys': [1, 2, 3]}
141+
cfg = DEFAULT_CONFIG.copy()
142+
cfg.update({'IPAddressesEnabled': True, 'machineName': 'some_machine_name', 'machineIp': '123.123.123.123'})
143+
sdk_metadata = get_metadata(cfg)
144+
telemetry_storage = InMemoryTelemetryStorageAsync()
145+
telemetry_producer = TelemetryStorageProducerAsync(telemetry_storage)
146+
telemetry_runtime_producer = telemetry_producer.get_telemetry_runtime_producer()
147+
telemetry_api = telemetry.TelemetryAPIAsync(httpclient, 'some_api_key', sdk_metadata, telemetry_runtime_producer)
148+
self.verb = None
149+
self.url = None
150+
self.key = None
151+
self.headers = None
152+
self.body = None
153+
async def post(verb, url, key, body, extra_headers):
154+
self.url = url
155+
self.verb = verb
156+
self.key = key
157+
self.headers = extra_headers
158+
self.body = body
159+
return client.HttpResponse(200, '', {})
160+
httpclient.post = post
161+
162+
response = await telemetry_api.record_unique_keys(uniques)
163+
assert self.verb == 'telemetry'
164+
assert self.url == 'v1/keys/ss'
165+
assert self.key == 'some_api_key'
166+
167+
# validate key-value args (headers)
168+
assert self.headers == {
169+
'SplitSDKVersion': 'python-%s' % __version__,
170+
'SplitSDKMachineIP': '123.123.123.123',
171+
'SplitSDKMachineName': 'some_machine_name'
172+
}
173+
174+
# validate key-value args (body)
175+
assert self.body == uniques
176+
177+
httpclient.reset_mock()
178+
def raise_exception(*args, **kwargs):
179+
raise client.HttpClientException('some_message')
180+
httpclient.post = raise_exception
181+
with pytest.raises(APIException) as exc_info:
182+
response = await telemetry_api.record_unique_keys(uniques)
183+
assert exc_info.type == APIException
184+
assert exc_info.value.message == 'some_message'
185+
186+
@pytest.mark.asyncio
187+
async def test_record_init(self, mocker):
188+
"""Test telemetry posting unique keys."""
189+
httpclient = mocker.Mock(spec=client.HttpClientAsync)
190+
uniques = {'keys': [1, 2, 3]}
191+
cfg = DEFAULT_CONFIG.copy()
192+
cfg.update({'IPAddressesEnabled': True, 'machineName': 'some_machine_name', 'machineIp': '123.123.123.123'})
193+
sdk_metadata = get_metadata(cfg)
194+
telemetry_storage = InMemoryTelemetryStorageAsync()
195+
telemetry_producer = TelemetryStorageProducerAsync(telemetry_storage)
196+
telemetry_runtime_producer = telemetry_producer.get_telemetry_runtime_producer()
197+
telemetry_api = telemetry.TelemetryAPIAsync(httpclient, 'some_api_key', sdk_metadata, telemetry_runtime_producer)
198+
self.verb = None
199+
self.url = None
200+
self.key = None
201+
self.headers = None
202+
self.body = None
203+
async def post(verb, url, key, body, extra_headers):
204+
self.url = url
205+
self.verb = verb
206+
self.key = key
207+
self.headers = extra_headers
208+
self.body = body
209+
return client.HttpResponse(200, '', {})
210+
httpclient.post = post
211+
212+
response = await telemetry_api.record_init(uniques)
213+
assert self.verb == 'telemetry'
214+
assert self.url == '/v1/metrics/config'
215+
assert self.key == 'some_api_key'
216+
217+
# validate key-value args (headers)
218+
assert self.headers == {
219+
'SplitSDKVersion': 'python-%s' % __version__,
220+
'SplitSDKMachineIP': '123.123.123.123',
221+
'SplitSDKMachineName': 'some_machine_name'
222+
}
223+
224+
# validate key-value args (body)
225+
assert self.body == uniques
226+
227+
httpclient.reset_mock()
228+
def raise_exception(*args, **kwargs):
229+
raise client.HttpClientException('some_message')
230+
httpclient.post = raise_exception
231+
with pytest.raises(APIException) as exc_info:
232+
response = await telemetry_api.record_init(uniques)
233+
assert exc_info.type == APIException
234+
assert exc_info.value.message == 'some_message'
235+
236+
@pytest.mark.asyncio
237+
async def test_record_stats(self, mocker):
238+
"""Test telemetry posting unique keys."""
239+
httpclient = mocker.Mock(spec=client.HttpClientAsync)
240+
uniques = {'keys': [1, 2, 3]}
241+
cfg = DEFAULT_CONFIG.copy()
242+
cfg.update({'IPAddressesEnabled': True, 'machineName': 'some_machine_name', 'machineIp': '123.123.123.123'})
243+
sdk_metadata = get_metadata(cfg)
244+
telemetry_storage = InMemoryTelemetryStorageAsync()
245+
telemetry_producer = TelemetryStorageProducerAsync(telemetry_storage)
246+
telemetry_runtime_producer = telemetry_producer.get_telemetry_runtime_producer()
247+
telemetry_api = telemetry.TelemetryAPIAsync(httpclient, 'some_api_key', sdk_metadata, telemetry_runtime_producer)
248+
self.verb = None
249+
self.url = None
250+
self.key = None
251+
self.headers = None
252+
self.body = None
253+
async def post(verb, url, key, body, extra_headers):
254+
self.url = url
255+
self.verb = verb
256+
self.key = key
257+
self.headers = extra_headers
258+
self.body = body
259+
return client.HttpResponse(200, '', {})
260+
httpclient.post = post
261+
262+
response = await telemetry_api.record_stats(uniques)
263+
assert self.verb == 'telemetry'
264+
assert self.url == '/v1/metrics/usage'
265+
assert self.key == 'some_api_key'
266+
267+
# validate key-value args (headers)
268+
assert self.headers == {
269+
'SplitSDKVersion': 'python-%s' % __version__,
270+
'SplitSDKMachineIP': '123.123.123.123',
271+
'SplitSDKMachineName': 'some_machine_name'
272+
}
273+
274+
# validate key-value args (body)
275+
assert self.body == uniques
276+
277+
httpclient.reset_mock()
278+
def raise_exception(*args, **kwargs):
279+
raise client.HttpClientException('some_message')
280+
httpclient.post = raise_exception
281+
with pytest.raises(APIException) as exc_info:
282+
response = await telemetry_api.record_stats(uniques)
283+
assert exc_info.type == APIException
284+
assert exc_info.value.message == 'some_message'

0 commit comments

Comments
 (0)