コード例 #1
0
class CreateBlockTestCase(unittest.TestCase):
    def setUp(self):
        self.client = QualtricsAPIClient('http://qualtrics.com/api',
                                         'token-456')
        self.question_payload = {
            'QuestionText': 'What is love?',
            'DataExportTag': 'Q1',
            'QuestionType': 'MC',
            'Selector': 'SAVR',
            'SubSelector': 'TX',
            'Configuration': {
                'QuestionDescriptionOption': 'UseText'
            },
            'QuestionDescription': 'respondent_what_is_love_mc',
            'Choices': {
                '1': 'Baby don\'t hurt me',
                '2': 'Don\'t hurt me',
                '3': 'No more'
            },
            'ChoiceOrder': ['1', '2', '3'],
            'Validation': {
                'Settings': {
                    'ForceResponse': 'OFF',
                    'ForceResponseType': 'OFF',
                    'Type': 'None'
                }
            },
            'Language': []
        }

    def test_create_question_asserts_survey_id_parameter(self):
        with self.assertRaises(AssertionError):
            _ = self.client.create_question(None, self.question_payload)

        with self.assertRaises(AssertionError):
            _ = self.client.create_question('', self.question_payload)

        with self.assertRaises(AssertionError):
            _ = self.client.create_question(1, self.question_payload)

    def test_create_question_validates_survey_id(self):
        with self.assertRaises(AssertionError):
            self.client.create_question('invalid_survey_id',
                                        self.question_payload)

    def test_create_question_asserts_question_payload_parameter(self):
        with self.assertRaises(AssertionError):
            _ = self.client.create_question('SV_abcdefghijk', None)

        with self.assertRaises(AssertionError):
            _ = self.client.create_question('SV_abcdefghijk',
                                            datetime(2019, 8, 16))

        with self.assertRaises(AssertionError):
            _ = self.client.create_question('SV_abcdefghijk', ['a', 'b'])

    def test_create_question_validates_question_payload_parameter(self):
        payload_without_question_text_key = self.question_payload
        payload_without_question_text_key.pop('QuestionText')

        with self.assertRaises(AssertionError):
            _ = self.client.create_question('SV_abcdefghijk',
                                            payload_without_question_text_key)

        with self.assertRaises(AssertionError):
            _ = self.client.create_question('SV_abcdefghijk', {})

    def test_create_question_asserts_optional_block_id_is_string_if_supplied(
            self):
        with self.assertRaises(AssertionError):
            self.client.create_question('SV_1234567890a',
                                        self.question_payload,
                                        block_id=123)

    def test_create_question_validates_optional_block_id_if_supplied(self):
        with self.assertRaises(AssertionError):
            self.client.create_question('SV_1234567890a',
                                        self.question_payload,
                                        block_id='invalid_block_id')

    @responses.activate
    def test_makes_request_as_expected(self):
        create_question_json = {
            'result': {
                'QuestionID': 'QID1'
            },
            'meta': {
                'requestId': 'be14851c-7d92-4b1c-a541-a9e03228b15e',
                'httpStatus': '200 - OK'
            }
        }

        responses.add(
            responses.POST,
            'http://qualtrics.com/api/survey-definitions/SV_abcdefghijk/questions?blockId=BL_1234567890a',
            json=create_question_json)

        result, question_id = self.client.create_question(
            'SV_abcdefghijk', self.question_payload, block_id='BL_1234567890a')

        self.assertEqual(result, create_question_json)
        self.assertEqual(question_id,
                         create_question_json['result']['QuestionID'])

    @responses.activate
    def test_raises_http_error_for_failed_requests(self):
        responses.add(
            responses.POST,
            'http://qualtrics.com/api/survey-definitions/SV_abcdefghijk/questions',
            json={},
            status=404)
        with self.assertRaises(requests.HTTPError):
            _, _ = self.client.create_question('SV_abcdefghijk',
                                               self.question_payload)

        responses.replace(
            responses.POST,
            'http://qualtrics.com/api/survey-definitions/SV_abcdefghijk/questions',
            json={},
            status=500)
        with self.assertRaises(requests.HTTPError):
            _, _ = self.client.create_question('SV_abcdefghijk',
                                               self.question_payload)
コード例 #2
0
def create_survey(name, blocks, questions, language_code='EN'):
    '''
    Create a new survey with the specified blocks and questions

    1. create survey
    2. update default block (depends on questions supplied)
    3. create additional blocks as required (again depends on questions supplied)
    4. create questions, per question: build payloads (inc. display logic), assign to blocks, call api
    5. return survey_id
    '''
    assert blocks and questions, "You must provide lists of blocks and questions for the survey"

    base_url, auth_token = get_details_for_client()
    api = QualtricsAPIClient(base_url, auth_token)

    survey_id = default_block_id = None

    try:
        survey_id, default_block_id = api.create_survey(name, language_code)
    except (QualtricsAPIException, AssertionError, HTTPError) as ex:
        raise QualtricsAPIException(ex)

    if not survey_id:
        raise QualtricsAPIException(
            'API call create_survey failed to return survey_id')

    if not default_block_id:
        raise QualtricsAPIException(
            'API call create_survey failed to return default_block_id')

    block_ids_dict = {1: default_block_id}

    blockBar = Bar('Creating Blocks', max=len(blocks))

    for index, block in enumerate(blocks):
        blockBar.next()

        if index == 0:
            try:
                api.update_block(survey_id, default_block_id,
                                 block['description'],
                                 QUALTRICS_API_BLOCK_TYPE_DEFAULT)
            except (AssertionError, HTTPError) as ex:
                raise QualtricsAPIException(ex)
        else:
            try:
                _, new_block_id = api.create_block(
                    survey_id, block['description'],
                    QUALTRICS_API_BLOCK_TYPE_STANDARD)

                block_ids_dict[index + 1] = new_block_id
            except (AssertionError, HTTPError) as ex:
                raise QualtricsAPIException(ex)

    blockBar.finish()

    questionBar = Bar('Creating Questions', max=len(questions))

    for question in questions:
        questionBar.next()

        question_payload = api.build_question_payload(
            question, survey_id, include_display_logic=True)

        try:
            block_id = block_ids_dict[question['block_number']]
        except KeyError:
            block_id = block_ids_dict[1]

        try:
            api.create_question(survey_id, question_payload, block_id)
        except (AssertionError, HTTPError) as ex:
            raise QualtricsAPIException(ex)

    questionBar.finish()

    return survey_id