Spaces:
Sleeping
Sleeping
import json | |
import time | |
from contextlib import contextmanager | |
from multiprocessing import Process | |
import pytest | |
import requests | |
import responses | |
from flask import Flask, request | |
from requests import HTTPError | |
from urlobject import URLObject | |
from ..test_utils import silence | |
from ...base import get_host_ip, success_response, get_values_from_response, split_http_address, HttpEngine, \ | |
get_http_engine_class | |
app = Flask('_test_get_host_ip') | |
def ping_method(): | |
return success_response(message='PONG!') | |
def shutdown_method(): | |
_shutdown_func = request.environ.get('werkzeug.server.shutdown') | |
if _shutdown_func is None: | |
raise RuntimeError('Not running with the Werkzeug Server') | |
_shutdown_func() | |
return success_response(message='Shutdown request received, this server will be down later.') | |
_APP_PORT = 17503 | |
def run_test_app(): | |
with silence(): | |
app.run(host='0.0.0.0', port=_APP_PORT) | |
class TestInteractionBaseNetwork: | |
def test_get_host_ip(self): | |
app_process = Process(target=run_test_app) | |
app_process.start() | |
_local_ip = get_host_ip() | |
_local_server_host = URLObject().with_scheme('http').with_hostname(_local_ip).with_port(_APP_PORT) | |
try: | |
_start_time = time.time() | |
_start_complete = False | |
while not _start_complete and time.time() - _start_time < 5.0: | |
try: | |
response = requests.get(_local_server_host.add_path('/ping')) | |
if response.ok: | |
_start_complete = True | |
break | |
time.sleep(0.2) | |
except (requests.exceptions.BaseHTTPError, requests.exceptions.RequestException): | |
time.sleep(0.2) | |
if not _start_complete: | |
pytest.fail('Test server start failed.') | |
assert get_values_from_response(response) == ( | |
200, | |
True, | |
0, | |
'PONG!', | |
None, | |
) | |
finally: | |
try: | |
requests.delete(_local_server_host.add_path('/shutdown')) | |
finally: | |
app_process.join() | |
def test_split_http_address(self): | |
assert split_http_address('http://1.2.3.4') == ('1.2.3.4', 80, False, '') | |
assert split_http_address('https://1.2.3.4') == ('1.2.3.4', 443, True, '') | |
assert split_http_address('http://1.2.3.4:8888') == ('1.2.3.4', 8888, False, '') | |
assert split_http_address('https://1.2.3.4:8787/this/is/path') == ('1.2.3.4', 8787, True, '/this/is/path') | |
class TestInteractionBaseHttpEngine: | |
def __yield_http_engine(self): | |
with responses.RequestsMock(assert_all_requests_are_fired=False) as rsp: | |
rsp.add( | |
**{ | |
'method': responses.GET, | |
'url': 'http://example.com:7777/this/is/404', | |
'body': json.dumps({"exception": "reason"}), | |
'status': 404, | |
'content_type': 'application/json', | |
} | |
) | |
rsp.add( | |
**{ | |
'method': responses.GET, | |
'url': 'http://example.com:7777/this/is/200', | |
'body': json.dumps({"success": True}), | |
'status': 200, | |
'content_type': 'application/json', | |
} | |
) | |
yield | |
def test_http_engine_basic(self): | |
with self.__yield_http_engine(): | |
engine = HttpEngine(host='example.com', port=7777) | |
response = engine.request('GET', '/this/is/200') | |
assert response.status_code == 200 | |
assert json.loads(response.content.decode()) == {"success": True} | |
with pytest.raises(HTTPError) as ei: | |
engine.request('GET', '/this/is/404') | |
err = ei.value | |
assert err.response.status_code == 404 | |
assert json.loads(err.response.content.decode()) == {'exception': 'reason'} | |
def test_http_engine_with_path(self): | |
with self.__yield_http_engine(): | |
engine = HttpEngine(host='example.com', port=7777, path='/this/is') | |
response = engine.request('GET', '200') | |
assert response.status_code == 200 | |
assert json.loads(response.content.decode()) == {"success": True} | |
with pytest.raises(HTTPError) as ei: | |
engine.request('GET', '404') | |
err = ei.value | |
assert err.response.status_code == 404 | |
assert json.loads(err.response.content.decode()) == {'exception': 'reason'} | |
def test_get_http_engine_class(self): | |
with self.__yield_http_engine(): | |
_token = '233' | |
_http_engine_class = get_http_engine_class( | |
headers={'Token': lambda: _token}, | |
data_processor=(lambda d: { | |
'data': json.dumps(d) | |
}), | |
http_error_gene=lambda e: RuntimeError('This is {status}'.format(status=e.response.status_code)) | |
)() | |
engine = _http_engine_class(host='example.com', port=7777, path='/this/is') | |
response = engine.request('GET', '200', {'a': 'skdjgflksdj'}) | |
assert response.status_code == 200 | |
assert json.loads(response.content.decode()) == {"success": True} | |
assert response.request.headers['Token'] == '233' | |
assert json.loads(response.request.body) == {'data': json.dumps({'a': 'skdjgflksdj'})} | |
with pytest.raises(RuntimeError) as ei: | |
engine.request('GET', '404', {'a': 'skdjgflksdj'}) | |
err = ei.value | |
assert 'This is 404' in str(err) | |