def test_session_headers_and_request_headers_combine(): """Should merge headers directly specified over any headers in a specified Session""" session = requests.Session() session.headers = { 'session-header': 'mySession', 'conflict-header': 'session-loses' } resp = Response() resp.status_code = 200 httsleep = HttSleeper(URL, {'status_code': 200}, session=session, headers={ 'req-header': 'myRequest', 'conflict-header': 'req-wins' }) with mock.patch('requests.adapters.HTTPAdapter.send') as mock_adapter_send: mock_adapter_send.return_value = resp httsleep.run() assert mock_adapter_send.called args, kwargs = mock_adapter_send.call_args assert args[0].headers == { 'conflict-header': 'req-wins', 'req-header': 'myRequest', 'session-header': 'mySession' }
def test_empty_until(): with pytest.raises(ValueError): HttSleeper(URL) with pytest.raises(ValueError): HttSleeper(URL, {}) with pytest.raises(ValueError): HttSleeper(URL, [{}])
def test_multiple_alarms(): error_msg = {'status': 'ERROR'} responses = [ httpretty.Response(body=json.dumps(error_msg), status=500), httpretty.Response(body='Internal Server Error', status=500), httpretty.Response(body='success', status=200) ] httpretty.register_uri(httpretty.GET, URL, responses=responses) alarms = [{ 'text': 'Internal Server Error', 'status_code': 500 }, { 'json': error_msg, 'status_code': 500 }] with mock.patch('httsleep.main.sleep'): httsleep = HttSleeper(URL, {'status_code': 200}, alarms=alarms) try: httsleep.run() except Alarm as e: assert e.response.status_code == 500 assert e.response.json() == error_msg assert e.alarm == {'json': error_msg, 'status_code': 500} else: pytest.fail("No exception raised!")
def test_run_success(): """Should return response when a success criteria has been reached""" httpretty.register_uri(httpretty.GET, URL, body='<html></html>', status=200) with mock.patch('httsleep.main.sleep') as mock_sleep: httsleep = HttSleeper(URL, {'status_code': 200}) resp = httsleep.run() assert resp.status_code == 200 assert not mock_sleep.called
def test_jsonpath_condition(): payload = {'status': 'SUCCESS'} responses = [httpretty.Response(body=json.dumps(payload), status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep'): httsleep = HttSleeper(URL, {'jsonpath': [{'expression': 'status', 'value': 'SUCCESS'}]}) resp = httsleep.run() assert resp.status_code == 200 assert resp.json() == payload
def test_jsonpath_condition_multiple_values(): payload = {'foo': [{'bar': 1}, {'bar': 2}]} responses = [httpretty.Response(body=json.dumps(payload), status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep'): httsleep = HttSleeper(URL, {'jsonpath': [{'expression': 'foo[*].bar', 'value': [1, 2]}]}) resp = httsleep.run() assert resp.status_code == 200 assert resp.json() == payload
def test_ignore_exceptions(): responses = [httpretty.Response(body=ConnectionError), httpretty.Response(body="{}", status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep'): httsleep = HttSleeper(URL, {'json': {}}, ignore_exceptions=[ConnectionError]) resp = httsleep.run() assert resp.status_code == 200 assert resp.text == "{}"
def test_json_condition(): expected = {'my_key': 'my_value'} responses = [httpretty.Response(body=json.dumps({'error': 'not found'}), status=404), httpretty.Response(body=json.dumps(expected), status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep'): httsleep = HttSleeper(URL, {'json': expected}) resp = httsleep.run() assert resp.status_code == 200 assert resp.json() == expected
def test_text_condition(): expected = 'you got it!' responses = [httpretty.Response(body='not found', status=404), httpretty.Response(body=expected, status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep'): httsleep = HttSleeper(URL, {'text': expected}) resp = httsleep.run() assert resp.status_code == 200 assert resp.text == expected
def test_invalid_alarms(): with pytest.raises(ValueError): HttSleeper(URL, CONDITION, alarms={'lol': 'invalid'}) with pytest.raises(ValueError): HttSleeper(URL, CONDITION, alarms={ 'status_code': 500, 'lol': 'invalid' })
def test_run_alarm(): """Should raise an Alarm when a failure criteria has been reached""" httpretty.register_uri(httpretty.GET, URL, body='<html></html>', status=400) httsleep = HttSleeper(URL, {'status_code': 200}, alarms={'status_code': 400}) with pytest.raises(Alarm): httsleep.run()
def test_run_max_retries(): """Should raise an exception when max_retries is reached""" responses = [httpretty.Response(body="Internal Server Error", status=500), httpretty.Response(body="Internal Server Error", status=500), httpretty.Response(body="Internal Server Error", status=500)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep'): httsleep = HttSleeper(URL, {'status_code': 200}, max_retries=2) with pytest.raises(StopIteration): httsleep.run()
def test_max_retries(): obj = HttSleeper(URL, CONDITION) assert obj.max_retries == DEFAULT_MAX_RETRIES obj = HttSleeper(URL, CONDITION, max_retries=123) assert obj.max_retries == 123 obj = HttSleeper(URL, CONDITION, max_retries=None) assert obj.max_retries == None with pytest.raises(ValueError): HttSleeper(URL, CONDITION, max_retries='five')
def test_propagate_verify(): """Should tell requests to skip SSL verification if verify==False""" resp = Response() resp.status_code = 200 httsleep = HttSleeper(URL, {'status_code': 200}, verify=False) with mock.patch('requests.adapters.HTTPAdapter.send') as mock_adapter_send: mock_adapter_send.return_value = resp httsleep.run() assert mock_adapter_send.called args, kwargs = mock_adapter_send.call_args assert 'verify' in kwargs assert kwargs['verify'] == False
def test_multiple_success_conditions(): responses = [httpretty.Response(body='first response', status=200), httpretty.Response(body='second response', status=200), httpretty.Response(body='third response', status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) conditions = [{'text': 'third response', 'status_code': 200}, {'text': 'second response', 'status_code': 200}] with mock.patch('httsleep.main.sleep'): httsleep = HttSleeper(URL, conditions) resp = httsleep.run() assert resp.status_code == 200 assert resp.text == 'second response'
def test_default_sends_verify_true(): """Should not send a value for 'verify' to requests by default""" resp = Response() resp.status_code = 200 httsleep = HttSleeper(URL, {'status_code': 200}) with mock.patch('requests.adapters.HTTPAdapter.send') as mock_adapter_send: mock_adapter_send.return_value = resp httsleep.run() assert mock_adapter_send.called args, kwargs = mock_adapter_send.call_args assert 'verify' in kwargs assert kwargs['verify'] == True
def test_default_uses_default_session(): """Should use a default Session object unless one is specified""" resp = Response() resp.status_code = 200 httsleep = HttSleeper(URL, {'status_code': 200}) with mock.patch('requests.adapters.HTTPAdapter.send') as mock_adapter_send: mock_adapter_send.return_value = resp httsleep.run() assert mock_adapter_send.called args, kwargs = mock_adapter_send.call_args assert args[0].headers == requests.utils.default_headers() assert 'verify' in kwargs assert kwargs['verify'] == True
def test_request_verify_overrules_session_verify(): """Should give precedence to the 'verify' setting in the request, over that in a specified Session""" session = requests.Session() session.verify = '/path/to/ca/bundle' resp = Response() resp.status_code = 200 httsleep = HttSleeper(URL, {'status_code': 200}, session=session, verify='/override/path') with mock.patch('requests.adapters.HTTPAdapter.send') as mock_adapter_send: mock_adapter_send.return_value = resp httsleep.run() assert mock_adapter_send.called args, kwargs = mock_adapter_send.call_args assert 'verify' in kwargs assert kwargs['verify'] == '/override/path'
def test_run_sleep_custom_interval(): responses = [httpretty.Response(body="Internal Server Error", status=500), httpretty.Response(body="<html></html>", status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep') as mock_sleep: resp = HttSleeper(URL, {'status_code': 200}, polling_interval=6).run() assert mock_sleep.called_once_with(6)
def test_run_sleep_default_interval(): responses = [httpretty.Response(body="Internal Server Error", status=500), httpretty.Response(body="<html></html>", status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep') as mock_sleep: resp = HttSleeper(URL, {'status_code': 200}).run() assert mock_sleep.called_once_with(DEFAULT_POLLING_INTERVAL)
def test_session(): session = requests.Session() session.headers = {'Content-Type': 'test/type'} session.verify = False obj = HttSleeper(URL, CONDITION, session=session) assert obj.session.headers == session.headers assert obj.session.verify == session.verify
def test_propagate_session(): """Should propagate a Session's headers, verify setting, cookies etc. when specified""" session = requests.Session() session.cookies = {'tasty-cookie': 'chocolate'} session.headers = {'Content-Type': 'test/type'} session.verify = '/session/verify' resp = Response() resp.status_code = 200 httsleep = HttSleeper(URL, {'status_code': 200}, session=session) with mock.patch('requests.adapters.HTTPAdapter.send') as mock_adapter_send: mock_adapter_send.return_value = resp httsleep.run() assert mock_adapter_send.called args, kwargs = mock_adapter_send.call_args assert args[0].headers == { 'Content-Type': 'test/type', 'Cookie': 'tasty-cookie=chocolate' } assert 'verify' in kwargs assert kwargs['verify'] == '/session/verify'
def test_run_retries(): """Should retry until a success condition is reached""" responses = [httpretty.Response(body="Internal Server Error", status=500), httpretty.Response(body="Internal Server Error", status=500), httpretty.Response(body="<html></html>", status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep') as mock_sleep: resp = HttSleeper(URL, {'status_code': 200}).run() assert mock_sleep.called assert mock_sleep.call_count == 2 assert resp.status_code == 200 assert resp.text == '<html></html>'
def test_kwarg_condition(): def myfunc(*args): return obj = HttSleeper(URL, status_code=200) assert obj.until == [{'status_code': 200}] obj = HttSleeper(URL, json={'status': 'SUCCESS'}) assert obj.until == [{'json': {'status': 'SUCCESS'}}] obj = HttSleeper(URL, jsonpath={ 'expression': 'status', 'value': 'SUCCESS' }) assert obj.until == [{ 'jsonpath': { 'expression': 'status', 'value': 'SUCCESS' } }] obj = HttSleeper(URL, text='done') assert obj.until == [{'text': 'done'}] obj = HttSleeper(URL, callback=myfunc) assert obj.until == [{'callback': myfunc}] obj = HttSleeper(URL, status_code=200, callback=myfunc, json={'status': 'success'}) assert obj.until == [{ 'status_code': 200, 'callback': myfunc, 'json': { 'status': 'success' } }]
def test_callback_condition(): def my_func(req): if 'very very' in req.text: return True return False text = "Some very very long text here with <b>maybe</b> some html too" responses = [httpretty.Response(body='not found', status=404), httpretty.Response(body=text, status=200)] httpretty.register_uri(httpretty.GET, URL, responses=responses) with mock.patch('httsleep.main.sleep'): resp = HttSleeper(URL, {'callback': my_func}).run() assert resp.status_code == 200 assert resp.text == text
def test_invalid_until(): with pytest.raises(ValueError): HttSleeper(URL, {'lol': 'invalid'}) with pytest.raises(ValueError): HttSleeper(URL, {'status_code': 200, 'lol': 'invalid'})
def test_until(): obj = HttSleeper(URL, CONDITION) assert obj.until == [CONDITION]
def test_ignore_exceptions_default_value(): obj = HttSleeper(URL, CONDITION) assert obj.ignore_exceptions == tuple() obj = HttSleeper(URL, CONDITION, ignore_exceptions=[ValueError, Exception]) assert obj.ignore_exceptions == (ValueError, Exception)
def test_verify(): obj = HttSleeper(URL, CONDITION, verify=False) assert obj.kwargs == {'verify': False}
def test_default_session(): obj = HttSleeper(URL, CONDITION) assert obj.session.headers == requests.utils.default_headers()