def test_wait_for_report_success(self, mock_progress, mock_read, mock_sleep): token = '1234456765' response_queued = { 'status': 'queued' } response_completed = { 'status': 'completed', 'report': 'http://some.url/whatever' } response_result = { 'click_count': 10, 'install_count': 2, } ping_times = 3 # for testing purposes it should be lower than # `max_retries`, which defaults 60 in this test mock_progress.side_effect = \ [response.GetReportProgressResponse(response_queued)] * ping_times + \ [response.GetReportProgressResponse(response_completed)] mock_read.return_value = response_result result = self._make_client().wait_for_report(token) # read_report() result should be the same as wait_for_report result: self.assertEqual(result, response_result) # read_report() should be called exactly once with the returned url: mock_read.assert_called_once_with(response_completed['report']) # get_report_progress() should be called internally exactly like # specified here: just the token, (ping_times + 1) times in total, # in the specified order progress_calls = [mock.call(token)] * (ping_times + 1) self.assertEqual(progress_calls, mock_progress.call_args_list)
def test_progress_report_response(self): with self.assertRaises(ValueError): response.GetReportProgressResponse({'status': 'completed'}) report_url = 'http://test.com/whatever' r = response.GetReportProgressResponse({ 'status': 'completed', 'report': report_url }) self.assertTrue(r.is_completed()) self.assertEqual(r.get_report_url(), report_url)
def test_wait_for_report_max_retries_exceeded(self, mock_progress, mock_post, mock_sleep): response_data = { 'status': 'queued' } mock_response = mock.Mock() mock_response.json.return_value = response_data mock_post.return_value = mock_response mock_progress.return_value = response.GetReportProgressResponse( response_data) token = '12345667' retry_interval_seconds = 3 start_delay_seconds = 15 max_retries = 60 with self.assertRaises(exception.PollMaxRetryException): self._make_client().wait_for_report( token, retry_interval_seconds=retry_interval_seconds, start_delay_seconds=start_delay_seconds, max_retries=max_retries) # checking time.sleep() calls would verify that all input parameters # are used correctly: sleep_calls = [mock.call(start_delay_seconds)] + \ [mock.call(retry_interval_seconds)] * max_retries self.assertEqual(sleep_calls, mock_sleep.call_args_list) # finally, check that get_report_progress() is called # `max_retries` times with the token parameter: progress_calls = [mock.call(token)] * max_retries self.assertEqual(progress_calls, mock_progress.call_args_list)