def test_get_request_exception_and_retry_four_times(self, Session): request_exception = RequestException('I raise RequestException!') def exception_raiser(method, url, data, params, headers=None, allow_redirects=None): raise request_exception Session.return_value = MagicMock(request=exception_raiser) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) def try_four_times(retries, status): return retries <= 3 ShouldRetry = MagicMock() ShouldRetry.side_effect = try_four_times with patch('stormpath.http.HttpExecutor.should_retry', ShouldRetry): with self.assertRaises(Error): ex.get('/test') should_retry_calls = [ call(0, request_exception), call(1, request_exception), call(2, request_exception), call(3, request_exception), call(4, request_exception) ] ShouldRetry.assert_has_calls(should_retry_calls)
def test_get_request_exception_and_retry_and_success(self, Session): self.count = 0 request_exception = RequestException('I raise RequestException!') def exception_raiser(method, url, data, params, headers=None, allow_redirects=None): if self.count < 4: self.count += 1 raise request_exception return MagicMock( status_code=200, json=MagicMock(return_value={'success': 'True'})) Session.return_value = MagicMock(request=exception_raiser) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) ShouldRetry = MagicMock(return_value=True) with patch('stormpath.http.HttpExecutor.should_retry', ShouldRetry): with self.assertRaises(Error): ex.get('/test') should_retry_calls = [ call(0, request_exception), call(1, request_exception), call(2, request_exception), call(3, request_exception), ] ShouldRetry.assert_has_calls(should_retry_calls)
def test_get_request_exception_and_retry_and_success(self, Session): self.count = 0 request_exception = RequestException('I raise RequestException!') def exception_raiser(method, url, data, params, headers=None, allow_redirects=None): if self.count < 4: self.count += 1 raise request_exception return MagicMock(status_code=200, json=MagicMock(return_value={'success': 'True'})) Session.return_value = MagicMock(request=exception_raiser) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) ShouldRetry = MagicMock(return_value=True) with patch('stormpath.http.HttpExecutor.should_retry', ShouldRetry): with self.assertRaises(Error): ex.get('/test') should_retry_calls = [ call(0, request_exception), call(1, request_exception), call(2, request_exception), call(3, request_exception), ] ShouldRetry.assert_has_calls(should_retry_calls)
def test_get_request_exception_and_retry_and_success(self, Session): self.count = 0 request_exception = RequestException('mocked error') successful_response = MagicMock( status_code=200, json=MagicMock(return_value={'success': 'True'})) def faker(*args, **kwargs): if self.count < 3: self.count += 1 raise request_exception return successful_response Session.return_value = MagicMock(request=faker) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) should_retry = MagicMock(return_value=True) with patch('stormpath.http.HttpExecutor.should_retry', should_retry): resp = ex.get('/test') self.assertEqual(resp['sp_http_status'], 200) should_retry.assert_has_calls([ call(0, request_exception), call(1, request_exception), call(2, request_exception), ])
def test_get_request_exception_and_retry_and_success(self, Session): self.count = 0 request_exception = RequestException('mocked error') successful_response = MagicMock(status_code=200, json=MagicMock(return_value={'success': 'True'})) def faker(*args, **kwargs): if self.count < 3: self.count += 1 raise request_exception return successful_response Session.return_value = MagicMock(request=faker) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) should_retry = MagicMock(return_value=True) with patch('stormpath.http.HttpExecutor.should_retry', should_retry): resp = ex.get('/test') self.assertEqual(resp['sp_http_status'], 200) should_retry.assert_has_calls([ call(0, request_exception), call(1, request_exception), call(2, request_exception), ])
def test_get_request_error(self, Session): s = Session.return_value s.request.return_value.status_code = 400 s.request.return_value.json.return_value = None ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) with self.assertRaises(Error): ex.get('/test')
def test_get_request(self, Session): s = Session.return_value s.request.return_value.status_code = 200 ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) data = ex.get('/test', {'q': 'foo'}) s.request.assert_called_once_with('GET', 'http://api.stormpath.com/v1/test', data=None, params={'q': 'foo'}, allow_redirects=False) self.assertEqual(data, s.request.return_value.json.return_value)
def test_get_request(self, Session): s = Session.return_value s.request.return_value.status_code = 200 ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) data = ex.get('/test', {'q': 'foo'}) s.request.assert_called_once_with( 'GET', 'http://api.stormpath.com/v1/test', data=None, params={'q': 'foo'}, headers=None, allow_redirects=False) self.assertEqual(data, s.request.return_value.json.return_value)
def test_get_binary_request(self, Session): s = Session.return_value s.request.return_value.json.side_effect = ValueError s.request.return_value.status_code = 200 s.request.return_value.content = 'some content' s.request.return_value.headers = { 'Content-Disposition': 'attachment; filename="some_archive.zip"'} ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) data = ex.get('/test') self.assertEqual( data, {'content': 'some content', 'filename': 'some_archive.zip'})
def test_get_binary_request(self, Session): s = Session.return_value s.request.return_value.json.side_effect = ValueError s.request.return_value.status_code = 200 s.request.return_value.content = 'some content' s.request.return_value.headers = { 'Content-Disposition': 'attachment; filename="some_archive.zip"' } ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) data = ex.get('/test') self.assertEqual(data, { 'content': 'some content', 'filename': 'some_archive.zip' })
def test_follow_redirects(self, Session): def redirector(method, url, data, params, allow_redirects=None): if url.endswith('/first'): return MagicMock(status_code=302, headers={ 'location': '/second'}) elif url.endswith('/second'): return MagicMock(status_code=200, json=MagicMock(return_value={'hello': 'World'})) Session.return_value = MagicMock(request=redirector) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) data = ex.get('/first') self.assertEqual(data, {'hello': 'World'})
def setUp(self, Session): # Set mock. self.request_mock = Session.return_value.request self.request_mock.return_value = MagicMock(status_code=200) ex = HttpExecutor('https://api.stormpath.com/v1', ('user', 'pass')) self.client = MagicMock(BASE_URL='http://example.com') self.data_store = DataStore(ex) self.client.data_store = self.data_store self.account = Account(self.client, properties={ 'href': 'http://example.com/account', 'username': '******', 'given_name': 'given_name', 'surname': 'surname', 'email': '*****@*****.**', 'password': '******' }) self.factor = Factor(self.client, properties={ 'href': '/factors/factor_id', 'name': 'factor' }) self.challenge = Challenge(self.client, properties={ 'href': '/challenges/challenge_id', 'factor': self.factor, 'account': self.account })
def test_follow_redirects(self, Session): def redirector(method, url, data, params, allow_redirects=None): if url.endswith('/first'): return MagicMock(status_code=302, headers={ 'location': 'http://api.stormpath.com/v1/second'}) elif url.endswith('/second'): return MagicMock(status_code=200, json=MagicMock(return_value={'hello': 'World'})) Session.return_value = MagicMock(request=redirector) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) data = ex.get('/first') self.assertEqual(data, {'hello': 'World', 'sp_http_status': 200})
def test_get_request_error_without_dict(self, Session): s = Session.return_value s.request.return_value.status_code = 400 s.request.return_value.json.return_value = 'Not a dict' ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) error = None try: ex.get('/test') except Error as e: error = e self.assertIsNotNone(error) self.assertIsInstance(error, Error) self.assertEqual(error.developer_message, 'Not a dict') self.assertEqual(error.status, 400)
def test_sauthc1_dict(self, Session): Session.return_value.request.return_value = \ MagicMock(status_code=200, json=MagicMock(return_value={'hello': 'World'})) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) params = OrderedDict([('username', 'username'), ('email', 'email'), ('password', 'password')]) ex.get('/resource', params=params) Session.return_value.request.assert_called_once_with( 'GET', 'http://api.stormpath.com/v1/resource', params=OrderedDict([('email', 'email'), ('password', 'password'), ('username', 'username')]), allow_redirects=False, data=None)
def test_sauthc1_dict(self, Session): Session.return_value.request.return_value = \ MagicMock(status_code=200, json=MagicMock(return_value={'hello': 'World'})) ex = HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) params = OrderedDict([('username', 'username'), ('email', 'email'), ('password', 'password')]) ex.get('/resource', params=params) Session.return_value.request.assert_called_once_with('GET', 'http://api.stormpath.com/v1/resource', params=OrderedDict([ ('email', 'email'), ('password', 'password'), ('username', 'username')]), headers=None, allow_redirects=False, data=None)
def test_session_init(self, Session): s = Session.return_value s.headers = {} HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) self.assertEqual(s.auth, ('user', 'pass')) self.assertEqual(s.headers['Content-Type'], 'application/json') self.assertEqual(s.headers['User-Agent'], HttpExecutor.USER_AGENT)
def test_session_init(self, Session): s = Session.return_value s.headers = {} HttpExecutor('http://api.stormpath.com/v1', ('user', 'pass')) self.assertEqual(s.auth, ('user', 'pass')) self.assertEqual(s.headers['Content-Type'], 'application/json') self.assertEqual(s.headers['User-Agent'], 'Stormpath-PythonSDK/' + STORMPATH_VERSION)
def setUp(self): super(TestLiveDataStore, self).setUp() self.executor = HttpExecutor( base_url = 'https://api.stormpath.com/v1', auth = (self.api_key_id, self.api_key_secret), )