def test_reschedule_campaign_with_valid_data( self, token_first, campaign_in_db, talent_pool, candidate_first, smartlist_first, schedule_a_campaign, candidate_device_first): """ Reschedule a campaign with valid data and it should return 200 response. """ sleep(15) data = generate_campaign_schedule_data(frequency_id=Frequency.DAILY) response = send_request( 'put', PushCampaignApiUrl.SCHEDULE % campaign_in_db['id'], token_first, data) assert response.status_code == codes.OK response = response.json() assert 'task_id' in response assert 'message' in response task_id = response['task_id'] assert task_id # campaign = get_campaign(campaign_in_db['id'], token_first)['campaign'] # match_schedule_data(data, campaign) retry(get_blasts, attempts=30, sleepscale=1, sleeptime=3, retry_exceptions=(AssertionError, ), args=(campaign_in_db['id'], token_first), kwargs={'count': 2})
def test_get_with_deleted_url_conversion(self, url_conversion, token_first): """ Here we first delete the url_conversion object. which internally deletes the sms_campaign_send record as it uses url_conversion as primary key. We then test functionality of process_url_redirect by making HTTP GET call to endpoint /v1/redirect. It should get ResourceNotFound Error. But candidate should only get internal server error. So this test asserts we get internal server error. """ source_url = url_conversion['source_url'] response = send_request( 'delete', PushCampaignApiUrl.URL_CONVERSION % url_conversion['id'], token_first) assert response.status_code == codes.OK response = send_request('get', source_url, '', verify=False) assert response.status_code == codes.INTERNAL_SERVER_ERROR
def test_get_with_no_signature(self, url_conversion): """ Removing signature of signed redirect URL. It should get internal server error. """ url_without_signature = url_conversion['source_url'].split('?')[0] response = send_request('get', url_without_signature, '', verify=False) assert response.status_code == codes.INTERNAL_SERVER_ERROR
def test_get_with_invalid_signature(self, url_conversion): source_url = url_conversion['source_url'] url_wit_invalid_signature = source_url.split( 'signature=')[0] + 'signature=invalid_signature' response = send_request('get', url_wit_invalid_signature, '', verify=False) assert response.status_code == codes.INTERNAL_SERVER_ERROR
def test_for_get(self, token_first, user_first, campaign_in_db, url_conversion): """ GET method should give OK response. We check the "hit_count" and "clicks" before hitting the endpoint and after hitting the endpoint. Then we assert that both "hit_count" and "clicks" have been successfully updated by '1' in database. """ # stats before making HTTP GET request to source URL response = get_blasts(campaign_in_db['id'], token_first, expected_status=(codes.OK, )) blasts = response['blasts'] assert len(blasts) == 1 blast = blasts[0] hit_count, clicks = url_conversion['hit_count'], blast['clicks'] response = send_request('get', url_conversion['source_url'], '', verify=False) assert response.status_code == codes.OK, 'Response should be ok' response = send_request('get', PushCampaignApiUrl.BLASTS % campaign_in_db['id'], token_first, verify=False) assert response.status_code == codes.OK blasts = response.json()['blasts'] assert len(blasts) == 1 blast = blasts[0] response = send_request('get', PushCampaignApiUrl.URL_CONVERSION % url_conversion['id'], token_first, verify=False) assert response.status_code == codes.OK url_conversion = response.json()['url_conversion'] updated_hit_counts, updated_clicks = url_conversion[ 'hit_count'], blast['clicks'] assert updated_hit_counts == hit_count + 1 assert updated_clicks == clicks + 1
def get_campaign(campaign_id, token, expected_status=(200,)): """ Get a push campaign from API given by campaign id. :type campaign_id: int | long :type token: string :type expected_status: tuple[int] :rtype dict """ response = send_request('get', PushCampaignApiUrl.CAMPAIGN % campaign_id, token) logger.info('tests : get_campaign: %s', response.content) print('tests : get_campaign: %s', response.content) assert response.status_code in expected_status return response.json()
def unschedule_campaign(campaign_id, token, expected_status=(200,)): """ This method sends a DELETE request to Push Campaign API to unschedule a push campaign. :type campaign_id: int | long :type token: string :type expected_status: tuple[int] :rtype dict """ response = send_request('delete', PushCampaignApiUrl.SCHEDULE % campaign_id, token) logger.info('tests : unschedule_campaign: %s', response.content) print('tests : unschedule_campaign: %s', response.content) assert response.status_code in expected_status return response.json()
def delete_campaigns(data, token, expected_status=(200,)): """ This method sends a DELETE request to Push Campaign API to delete multiple campaigns. :type data: dict :type token: string :type expected_status: tuple[int] :rtype dict """ response = send_request('delete', PushCampaignApiUrl.CAMPAIGNS, token, data=data) logger.info('tests : delete_campaigns: %s', response.content) print('tests : delete_campaigns: %s', response.content) assert response.status_code in expected_status return response.json()
def delete_campaign(campaign_id, token, expected_status=(200,)): """ This method sends a DELETE request to Push Campaign API to delete a campaign given by campaign_id. :type campaign_id: int | long :type token: string :type expected_status: tuple[int] :rtype dict """ response = send_request('delete', PushCampaignApiUrl.CAMPAIGN % campaign_id, token) logger.info('tests : delete_campaign: %s', response.content) print('tests : delete_campaign: %s', response.content) assert response.status_code in expected_status return response.json()
def reschedule_campaign(campaign_id, data, token, expected_status=(200,)): """ This method sends a PUT request to Push Campaign API to reschedule a push campaign with given schedule data. :type campaign_id: int | long :type data: dict :type token: string :type expected_status: tuple[int] :rtype dict """ response = send_request('put', PushCampaignApiUrl.SCHEDULE % campaign_id, token, data) logger.info('tests: reschedule_campaign: %s', response.content) print('tests: reschedule_campaign: %s', response.content) assert response.status_code in expected_status return response.json()
def send_campaign(campaign_id, token, expected_status=(200,)): """ This method sends a POST request to Push Campaign API to send a campaign to associated candidates. :type campaign_id: int | long :type token: string :type expected_status: tuple[int] :rtype dict """ url = PushCampaignApiUrl.SEND % campaign_id response = send_request('post', url, token) logger.info('tests : send_campaign: %s', response.content) print('tests : send_campaign: %s', response.content) assert response.status_code in expected_status return response.json()
def test_campaigns_delete_authorized_and_unauthorized_ids(self, token_first, campaign_in_db, campaign_in_db_second): """ Test with one authorized and one unauthorized push campaign. It should get 403 status code. :param token_first: auth token :param campaign_in_db: campaign created by user_first :param campaign_in_db_second: campaign created by user_second """ response = send_request('delete', URL, token_first, data={'ids': [campaign_in_db['id'], campaign_in_db_second['id']]}) assert response.status_code == codes.FORBIDDEN data = {'ids': [campaign_in_db['id'], campaign_in_db_second['id']]} delete_campaigns(data, token_first, expected_status=(codes.FORBIDDEN,))
def get_campaigns(token, page=DEFAULT_PAGE, per_page=DEFAULT_PAGE_SIZE, expected_status=(200,)): """ Get campaign of a specific user. Default page number is 1 and per_page (page size) is 10 :type page: int | long :type per_page: int | long :type token: string :type expected_status: tuple[int] """ query = '?page=%s&per_page=%s' % (page, per_page) response = send_request('get', PushCampaignApiUrl.CAMPAIGNS + query, token) logger.info('tests : get_campaigns: %s', response.content) print('tests : get_campaigns: %s', response.content) assert response.status_code in expected_status return response.json()
def test_get_with_deleted_campaign(self, token_first, campaign_in_db, url_conversion): """ Here we first delete the campaign, and then test functionality of process_url_redirect by making HTTP GET call to endpoint /v1/redirect. It should give ResourceNotFound Error. But candidate should get Internal server error. Hence this test should get internal server error. """ delete_campaign(campaign_in_db['id'], token_first, expected_status=(codes.OK, )) response = send_request('get', url_conversion['source_url'], '', verify=False) assert response.status_code == codes.INTERNAL_SERVER_ERROR
def create_campaign(data, token, expected_status=(201,)): """ Send a POST request to Push Campaign API with campaign data to create a new Push Campaign. :type data: dict :type token: string :type expected_status: tuple[int] :rtype dict """ response = send_request('post', PushCampaignApiUrl.CAMPAIGNS, token, data) logger.info('tests : create_campaign: %s', response.content) print('tests : create_campaign: %s', response.content) assert response.status_code in expected_status headers = response.headers response = response.json() response['headers'] = headers return response
def get_blast(blast_id, campaign_id, token, expected_status=(200,), sends=None): """ This method sends a GET request to Push Campaign API to get a specific blast associated with a campaign given by campaign_id. :type blast_id: int | long :type campaign_id: int | long :type token: string :type expected_status: tuple[int] :type sends: int | None :rtype dict """ response = send_request('get', PushCampaignApiUrl.BLAST % (campaign_id, blast_id), token) assert response.status_code in expected_status response = response.json() if sends: assert response['blast']['sends'] == sends return response
def get_blasts(campaign_id, token, page=DEFAULT_PAGE, per_page=DEFAULT_PAGE_SIZE, expected_status=(200,), count=None): """ This method sends a GET request to Push Campaign API to get a list of blasts associated with a campaign given by campaign_id. :type campaign_id: int | long :type token: string :type page: int | long :type per_page: int | long :type expected_status: tuple[int] :type count: int | None :rtype dict """ query = '?page=%s&per_page=%s' % (page, per_page) response = send_request('get', PushCampaignApiUrl.BLASTS % campaign_id + query, token) logger.info('tests : get_blasts: %s', response.content) print('tests : get_blasts: %s', response.content) assert response.status_code in expected_status response = response.json() if count: assert len(response['blasts']) == count return response
def get_blast_sends(blast_id, campaign_id, token, page=DEFAULT_PAGE, per_page=DEFAULT_PAGE_SIZE, expected_status=(200,), count=None): """ This method sends a GET request to Push Campaign API to get a list of sends associated to a specific blast. :type blast_id: int | long :type campaign_id: int | long :type token: string :type page: int | long :type per_page: int | long :type expected_status: tuple[int] :type count: int | None :rtype dict """ query = '?page=%s&per_page=%s' % (page, per_page) response = send_request('get', PushCampaignApiUrl.BLAST_SENDS % (campaign_id, blast_id) + query, token) assert response.status_code in expected_status response = response.json() if count: assert len(response['sends']) == count return response
def test_campaigns_delete_with_non_json_data(self, token_first): """ User auth token is valid, but non JSON data provided. It should get bad request error. """ response = send_request('delete', URL, token_first, data={'ids': [1, 2, 3]}, is_json=False) assert response.status_code == codes.BAD_REQUEST