2021-03-06 16:21:28 +01:00
|
|
|
import os
|
|
|
|
from typing import Optional
|
|
|
|
|
2023-03-27 22:54:13 +02:00
|
|
|
import requests
|
|
|
|
|
2021-03-06 16:21:28 +01:00
|
|
|
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
|
2021-03-06 16:25:37 +01:00
|
|
|
base_url = None
|
2021-03-06 16:21:28 +01:00
|
|
|
|
|
|
|
|
|
|
|
def set_base_url(url: str):
|
|
|
|
global base_url
|
|
|
|
base_url = url
|
|
|
|
|
|
|
|
|
|
|
|
class TimeoutException(RuntimeError):
|
|
|
|
"""
|
|
|
|
Exception raised in case of timeout.
|
|
|
|
"""
|
2023-03-27 22:54:13 +02:00
|
|
|
|
2021-03-06 16:21:28 +01:00
|
|
|
def __init__(self, msg: str = 'Timeout'):
|
|
|
|
self.msg = msg
|
|
|
|
|
|
|
|
|
2023-03-27 22:54:13 +02:00
|
|
|
def send_request(
|
|
|
|
action: str,
|
|
|
|
timeout: Optional[float] = None,
|
|
|
|
args: Optional[dict] = None,
|
|
|
|
parse_json: bool = True,
|
|
|
|
authenticate: bool = True,
|
2024-07-24 21:34:30 +02:00
|
|
|
**kwargs,
|
2023-03-27 22:54:13 +02:00
|
|
|
):
|
2021-03-06 16:21:28 +01:00
|
|
|
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(
|
2024-07-24 21:34:30 +02:00
|
|
|
f'{base_url}/execute',
|
2021-03-06 16:21:28 +01:00
|
|
|
auth=auth,
|
2024-07-24 21:34:30 +02:00
|
|
|
timeout=10,
|
2021-03-06 16:21:28 +01:00
|
|
|
json={
|
|
|
|
'type': 'request',
|
|
|
|
'action': action,
|
|
|
|
'args': args,
|
2023-03-27 22:54:13 +02:00
|
|
|
},
|
2024-07-24 21:34:30 +02:00
|
|
|
**kwargs,
|
2021-03-06 16:21:28 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
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
|
|
|
|
|
2023-03-27 22:54:13 +02:00
|
|
|
set_timeout(
|
|
|
|
seconds=request_timeout,
|
|
|
|
on_timeout=on_timeout('User registration response timed out'),
|
|
|
|
)
|
|
|
|
response = requests.post(
|
2024-07-24 21:34:30 +02:00
|
|
|
f'{base_url}/auth?type=register&redirect={base_url}/',
|
2023-03-27 22:54:13 +02:00
|
|
|
data={
|
|
|
|
'username': username,
|
|
|
|
'password': password,
|
|
|
|
'confirm_password': password,
|
|
|
|
},
|
|
|
|
)
|
2021-03-06 16:21:28 +01:00
|
|
|
|
|
|
|
clear_timeout()
|
|
|
|
return response
|
|
|
|
|
|
|
|
|
|
|
|
def on_timeout(msg):
|
2023-03-27 22:54:13 +02:00
|
|
|
def _f():
|
|
|
|
raise TimeoutException(msg)
|
|
|
|
|
2021-03-06 16:21:28 +01:00
|
|
|
return _f
|
|
|
|
|
|
|
|
|
|
|
|
def parse_response(response):
|
|
|
|
response = Message.build(response.json())
|
2024-07-24 21:34:30 +02:00
|
|
|
assert isinstance(
|
|
|
|
response, Response
|
|
|
|
), f'Expected Response type, got {response.__class__.__name__}'
|
2021-03-06 16:21:28 +01:00
|
|
|
return response
|