Skip to content

Commit 0d13e2b

Browse files
Merge branch 'dev' into 6-get-sections
2 parents cfe6973 + 86805e2 commit 0d13e2b

File tree

3 files changed

+122
-14
lines changed

3 files changed

+122
-14
lines changed

CmixAPIClient/api.py

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,19 @@ def add_extra_url_params(self, url, params):
163163

164164
return url
165165

166+
def get_survey_data_layouts(self, survey_id):
167+
self.check_auth_headers()
168+
data_layouts_url = '{}/surveys/{}/data-layouts'.format(CMIX_SERVICES['survey'][self.url_type], survey_id)
169+
data_layouts_response = requests.get(data_layouts_url, headers=self._authentication_headers)
170+
if data_layouts_response.status_code != 200:
171+
raise CmixError(
172+
'CMIX returned a non-200 response code while getting data_layouts: {} and error {}'.format(
173+
data_layouts_response.status_code,
174+
data_layouts_response.text
175+
)
176+
)
177+
return data_layouts_response.json()
178+
166179
def get_survey_definition(self, survey_id):
167180
self.check_auth_headers()
168181
definition_url = '{}/surveys/{}/definition'.format(CMIX_SERVICES['survey'][self.url_type], survey_id)
@@ -222,6 +235,19 @@ def get_survey_sections(self, survey_id):
222235
)
223236
return sections_response.json()
224237

238+
def get_survey_sources(self, survey_id):
239+
self.check_auth_headers()
240+
sources_url = '{}/surveys/{}/sources'.format(CMIX_SERVICES['survey'][self.url_type], survey_id)
241+
sources_response = requests.get(sources_url, headers=self._authentication_headers)
242+
if sources_response.status_code != 200:
243+
raise CmixError(
244+
'CMIX returned a non-200 response code while getting sources: {} and error {}'.format(
245+
sources_response.status_code,
246+
sources_response.text
247+
)
248+
)
249+
return sources_response.json()
250+
225251
def get_survey_completes(self, survey_id):
226252
return self.get_survey_respondents(survey_id, "COMPLETE", True)
227253

@@ -255,25 +281,14 @@ def create_export_archive(self, survey_id, export_type):
255281
)
256282
archive_json = archive_response.json()
257283

258-
layout_url = '{}/surveys/{}/data-layouts/'.format(CMIX_SERVICES['survey']["BASE_URL"], survey_id)
259-
layout_response = requests.get(layout_url, headers=self._authentication_headers)
260-
if layout_response.status_code != 200:
261-
raise CmixError(
262-
'CMIX returned a non-200 response code: {} and error {}'.format(
263-
layout_response.status_code,
264-
layout_response.text
265-
)
266-
)
284+
layout_json = self.get_survey_data_layouts(survey_id)
267285
layout_id = None
268-
for layout in layout_response.json():
286+
for layout in layout_json:
269287
if layout.get('name') == 'Default':
270288
layout_id = layout.get('id')
271289
if layout_id is None:
272290
raise CmixError(
273-
'Layouts response did not contain a "Default" layout. Response Code: {}, Body {}'.format(
274-
layout_response.status_code,
275-
layout_response.content
276-
)
291+
'Layouts response did not contain a "Default" layout.'
277292
)
278293

279294
archive_json['dataLayoutId'] = layout_id
@@ -348,3 +363,16 @@ def create_survey(self, xml_string):
348363
response_json = response.json()
349364
self.update_project(response_json.get('projectId'), status=self.SURVEY_STATUS_DESIGN)
350365
return response_json
366+
367+
def get_survey_simulations(self, survey_id):
368+
self.check_auth_headers()
369+
simulations_url = '{}/surveys/{}/simulations'.format(CMIX_SERVICES['survey'][self.url_type], survey_id)
370+
simulations_response = requests.get(simulations_url, headers=self._authentication_headers)
371+
if simulations_response.status_code != 200:
372+
raise CmixError(
373+
'CMIX returned a non-200 response code while getting simulations: {} and error {}'.format(
374+
simulations_response.status_code,
375+
simulations_response.text
376+
)
377+
)
378+
return simulations_response.json()

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@ A Python client library for the [Dynata Cmix API](https://wiki2.criticalmix.net/
2929
fetch_banner_filter(survey_id, question_a, question_b, response_id)
3030
fetch_raw_results(survey_id, payload)
3131
get_surveys(status, *args, **kwargs)
32+
get_survey_data_layouts(survey_id)
3233
get_survey_definition(survey_id)
3334
get_survey_xml(survey_id)
35+
get_survey_simulations(survey_id)
36+
get_survey_sources(survey_id)
3437
get_survey_test_url(survey_id)
3538
get_survey_respondents(survey_id, respondent_type, live)
3639
get_survey_status(survey_id)

tests/test_api.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,32 @@ def test_create_export_archive_errors_handled(self):
116116
with self.assertRaises(CmixError):
117117
self.cmix_api.create_export_archive(self.survey_id, 'XLSX_READABLE')
118118

119+
def test_get_survey_data_layouts(self):
120+
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
121+
122+
# success case
123+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
124+
mock_get = mock.Mock()
125+
mock_get.status_code = 200
126+
mock_get.json.return_value = {}
127+
mock_request.get.return_value = mock_get
128+
129+
self.cmix_api.get_survey_data_layouts(self.survey_id)
130+
131+
base_url = CMIX_SERVICES['survey']['BASE_URL']
132+
surveys_url = '{}/surveys/{}/data-layouts'.format(base_url, self.survey_id)
133+
mock_request.get.assert_any_call(surveys_url, headers=self.cmix_api._authentication_headers)
134+
135+
# error case (survey not found)
136+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
137+
mock_get = mock.Mock()
138+
mock_get.status_code = 404
139+
mock_get.json.return_value = {}
140+
mock_request.get.return_value = mock_get
141+
142+
with self.assertRaises(CmixError):
143+
self.cmix_api.get_survey_data_layouts(self.survey_id)
144+
119145
def test_get_survey_status(self):
120146
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
121147

@@ -169,6 +195,31 @@ def test_get_survey_sections(self):
169195
with self.assertRaises(CmixError):
170196
self.cmix_api.get_survey_sections(self.survey_id)
171197

198+
def test_get_survey_sources(self):
199+
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
200+
201+
# success case
202+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
203+
mock_get = mock.Mock()
204+
mock_get.status_code = 200
205+
mock_get.json.return_value = {}
206+
mock_request.get.return_value = mock_get
207+
self.cmix_api.get_survey_sources(self.survey_id)
208+
209+
base_url = CMIX_SERVICES['survey']['BASE_URL']
210+
surveys_url = '{}/surveys/{}/sources'.format(base_url, self.survey_id)
211+
mock_request.get.assert_any_call(surveys_url, headers=self.cmix_api._authentication_headers)
212+
213+
# error case (survey not found)
214+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
215+
mock_get = mock.Mock()
216+
mock_get.status_code = 404
217+
mock_get.json.return_value = {}
218+
mock_request.get.return_value = mock_get
219+
220+
with self.assertRaises(CmixError):
221+
self.cmix_api.get_survey_sources(self.survey_id)
222+
172223
def test_get_survey_test_url(self):
173224
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
174225
correct_test_link = '{}/#/?cmixSvy={}&cmixTest={}'.format(
@@ -296,3 +347,29 @@ def test_add_extra_url_params(self):
296347
extra_params_formatted = '&{}&{}'.format(extra_params[0], extra_params[1])
297348
expected = '{}{}'.format(url, extra_params_formatted)
298349
self.assertEqual(result, expected)
350+
351+
def test_get_survey_simulations(self):
352+
self.cmix_api._authentication_headers = {'Authentication': 'Bearer test'}
353+
354+
# success case
355+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
356+
mock_get = mock.Mock()
357+
mock_get.status_code = 200
358+
mock_get.json.return_value = {}
359+
mock_request.get.return_value = mock_get
360+
361+
self.cmix_api.get_survey_simulations(self.survey_id)
362+
363+
base_url = CMIX_SERVICES['survey']['BASE_URL']
364+
surveys_url = '{}/surveys/{}/simulations'.format(base_url, self.survey_id)
365+
mock_request.get.assert_any_call(surveys_url, headers=self.cmix_api._authentication_headers)
366+
367+
# error case (survey not found)
368+
with mock.patch('CmixAPIClient.api.requests') as mock_request:
369+
mock_get = mock.Mock()
370+
mock_get.status_code = 404
371+
mock_get.json.return_value = {}
372+
mock_request.get.return_value = mock_get
373+
374+
with self.assertRaises(CmixError):
375+
self.cmix_api.get_survey_simulations(self.survey_id)

0 commit comments

Comments
 (0)