forked from platypush/platypush
93 lines
2.3 KiB
Python
93 lines
2.3 KiB
Python
import os
|
|
import requests
|
|
from typing import Optional
|
|
|
|
from platypush.message import Message
|
|
from platypush.message.response import Response
|
|
from platypush.utils import set_timeout, clear_timeout
|
|
|
|
from . import test_dir
|
|
|
|
# Default configuration folder for tests
|
|
conf_dir = os.path.join(test_dir, 'etc')
|
|
|
|
# Default configuration file for tests
|
|
config_file = os.path.join(conf_dir, 'config_test.yaml')
|
|
|
|
# Default request timeout in seconds
|
|
request_timeout = 10
|
|
|
|
# Default test user
|
|
test_user = 'platypush'
|
|
|
|
# Default test password
|
|
test_pass = 'test'
|
|
|
|
# Base URL
|
|
base_url = 'http://localhost:8123'
|
|
|
|
|
|
def set_base_url(url: str):
|
|
global base_url
|
|
base_url = url
|
|
|
|
|
|
class TimeoutException(RuntimeError):
|
|
"""
|
|
Exception raised in case of timeout.
|
|
"""
|
|
def __init__(self, msg: str = 'Timeout'):
|
|
self.msg = msg
|
|
|
|
|
|
def send_request(action: str, timeout: Optional[float] = None, args: Optional[dict] = None,
|
|
parse_json: bool = True, authenticate: bool = True, **kwargs):
|
|
if not timeout:
|
|
timeout = request_timeout
|
|
if not args:
|
|
args = {}
|
|
|
|
auth = (test_user, test_pass) if authenticate else kwargs.pop('auth', ())
|
|
set_timeout(seconds=timeout, on_timeout=on_timeout('Receiver response timed out'))
|
|
response = requests.post(
|
|
'{}/execute'.format(base_url),
|
|
auth=auth,
|
|
json={
|
|
'type': 'request',
|
|
'action': action,
|
|
'args': args,
|
|
}, **kwargs
|
|
)
|
|
|
|
clear_timeout()
|
|
|
|
if parse_json:
|
|
response = parse_response(response)
|
|
return response
|
|
|
|
|
|
def register_user(username: Optional[str] = None, password: Optional[str] = None):
|
|
if not username:
|
|
username = test_user
|
|
password = test_pass
|
|
|
|
set_timeout(seconds=request_timeout, on_timeout=on_timeout('User registration response timed out'))
|
|
response = requests.post('{base_url}/register?redirect={base_url}/'.format(base_url=base_url), data={
|
|
'username': username,
|
|
'password': password,
|
|
'confirm_password': password,
|
|
})
|
|
|
|
clear_timeout()
|
|
return response
|
|
|
|
|
|
def on_timeout(msg):
|
|
def _f(): raise TimeoutException(msg)
|
|
return _f
|
|
|
|
|
|
def parse_response(response):
|
|
response = Message.build(response.json())
|
|
assert isinstance(response, Response), 'Expected Response type, got {}'.format(response.__class__.__name__)
|
|
return response
|