Example #1
0
def publish_survey(survey_id, survey_name):
    '''
    Activate and publish the specified survey so it's available to take online
    '''
    try:
        assert survey_id.strip()
        assert survey_name.strip()
    except (AssertionError, AttributeError):
        raise AssertionError(
            'You must provide string values for survey_id and survey_name')

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

    survey_description = '{}_{}'.format(
        survey_name,
        datetime.now().strftime("%Y-%m-%d_%H.%M.%S%p"))

    try:
        api.update_survey(survey_id, True)

        version_id, version_number, creation_date = api.publish_survey(
            survey_id, survey_description)
    except (AssertionError, HTTPError) as ex:
        raise QualtricsAPIException(ex)

    survey_url = QUALTRICS_API_PUBLISHED_SURVEY_URL_PATTERN.format(survey_id)

    return survey_url, version_id, version_number, creation_date
class PublishSurveyTestCase(unittest.TestCase):
    def setUp(self):
        self.client = QualtricsAPIClient('http://qualtrics.com/api',
                                         'token-456')

    def test_publish_survey_asserts_survey_id_parameter(self):
        with self.assertRaises(AssertionError):
            _ = self.client.publish_survey(None, 'description')

        with self.assertRaises(AssertionError):
            _ = self.client.publish_survey('', 'description')

        with self.assertRaises(AssertionError):
            _ = self.client.publish_survey(1.23, 'description')

    def test_publish_survey_asserts_description_parameter(self):
        with self.assertRaises(AssertionError):
            _ = self.client.publish_survey('SV_51PEzLvt33771Mp', '')

        with self.assertRaises(AssertionError):
            _ = self.client.publish_survey('SV_51PEzLvt33771Mp', {})

    def test_publish_survey_validates_survey_id(self):
        with self.assertRaises(AssertionError):
            _ = self.client.publish_survey('invalid-format-survey-id',
                                           'description')

    @responses.activate
    def test_makes_request_as_expected(self):
        publish_survey_json = {
            "meta": {
                "httpStatus": "200 - OK",
                "requestId": "7999edd9-a232-4735-ae70-1c8cc7e30e09"
            },
            "result": {
                "metadata": {
                    "surveyID":
                    "SV_51PEzLvt33771Mp",
                    "versionID":
                    "9223370492291465912",
                    "versionNumber":
                    2,
                    "description":
                    "2019 New Survey Version",
                    "userID":
                    "UR_3fIVFlGaWYcfVml",
                    "creationDate":
                    "2019-27-09T07:48:49Z",
                    "published":
                    True,
                    "wasPublished":
                    True,
                    "publishEvents": [{
                        "date": "2019-26-09T21:21:50Z",
                        "userID": "UR_3fIVFlGaWYcfVml"
                    }]
                }
            }
        }

        responses.add(
            responses.POST,
            'http://qualtrics.com/api/survey-definitions/SV_51PEzLvt33771Mp/versions',
            json=publish_survey_json)

        version_id, version_number, creation_date = self.client.publish_survey(
            'SV_51PEzLvt33771Mp', '2019 v2 of My Survey')

        self.assertEqual(
            version_id, publish_survey_json['result']['metadata']['versionID'])
        self.assertEqual(
            version_number,
            publish_survey_json['result']['metadata']['versionNumber'])
        self.assertEqual(
            creation_date,
            publish_survey_json['result']['metadata']['creationDate'])

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

        responses.replace(responses.POST,
                          'http://qualtrics.com/api/survey-definitions',
                          json={},
                          status=500)
        with self.assertRaises(requests.HTTPError):
            _, _ = self.client.create_survey('500 Survey Name')