def test_check_request(master):
    """
    Должен проверить запрос
    """
    requests = [form_request(method='func_1', a=1, b=2, secret_key='xxx')]
    requests_before = requests.copy()
    errors = []
    master.check_request_conveyor(requests, errors)
    assert requests == requests_before

    requests = [None]
    errors = []
    master.check_request_conveyor(requests, errors)
    assert errors == [
        {'error': {'code': -32600, 'message': 'Неправильный формат запроса: NoneType.'},
         'id': None,
         'jsonrpc': '2.0'}]

    errors = []
    req_1 = form_request(method='func_1', a=1, b=2, secret_key='xxx')
    req_2 = form_request(method='func_1', a=1, z=2, secret_key='xxx')
    req_3 = form_request(method='func_2', c=1, d=2, secret_key='xxx')
    requests = [req_1, req_2, req_3]
    requests_before = requests.copy()
    master.check_request_conveyor(requests, errors)
    assert requests == requests_before
def test_async_execute(master):
    """
    Должен исполнить запрос
    """
    request = form_request(method='func_3', e=4, f=5)
    result = asyncio.run(master.async_execute(request))
    assert result == 1024

    request = form_request(method='func_3', e=5, f=6)
    result = asyncio.run(master.async_execute(request))
    assert result == 15625
def test_execute(master):
    """
    Должен исполнить запрос
    """
    request = form_request(method='func_1', a=1, b=2)
    result = master.execute(request)
    assert result == 3

    request = form_request(method='func_2', c=1, d=2)
    result = master.execute(request)
    assert result == 2
def test_authorize_conveyor(master):
    """
    Должен проверить авторизацию
    """
    errors = []
    req_1 = form_request(method='func_1', a=1, b=2, secret_key='xxx')
    req_2 = form_request(method='func_1', a=1, z=2, secret_key='xxx')
    req_3 = form_request(method='func_2', c=1, d=2, secret_key='xxx')
    requests = [req_1, req_2, req_3]
    requests_before = requests.copy()
    master.check_auth_conveyor(requests, errors)
    assert requests == requests_before
def test_check_dict(master):
    """
    Должен проверить что запрос это правильный словарь
    """
    requests = [form_request(method='func_1', a=1, b=2)]
    errors = []
    master.check_request_conveyor(requests, errors)
    assert errors == [{'error': {'code': -32607, 'message': 'Не предоставлен ключ авторизации.'},
                       'jsonrpc': '2.0'}]

    request = {}
    result = master.check_dict(request)
    assert result == {'error': {'code': -32601, 'message': 'Получен пустой запрос.'},
                      'id': None,
                      'jsonrpc': '2.0'}

    request = {'jsonrpc': '1.2'}
    result = master.check_dict(request)
    assert result == {'error': {'code': -32602, 'message': 'Поддерживается только JSON-RPC 2.0.'},
                      'jsonrpc': '2.0'}

    request = {'jsonrpc': '2.0'}
    result = master.check_dict(request)
    assert result == {'error': {'code': -32603, 'message': 'Не указан метод запроса.'},
                      'jsonrpc': '2.0'}

    request = {'jsonrpc': '2.0', 'method': 'zo'}
    result = master.check_dict(request)
    assert result == {'error': {'code': -32604, 'message': 'Неизвестный метод: "zo".'},
                      'jsonrpc': '2.0'}

    request = {'jsonrpc': '2.0', 'method': 'func_1'}
    result = master.check_dict(request)
    assert result == {'error': {'code': -32605, 'message': 'Не указаны аргументы вызова.'},
                      'jsonrpc': '2.0'}

    request = {'jsonrpc': '2.0', 'method': 'func_1', 'params': {}}
    result = master.check_dict(request)
    assert result == {'error': {'code': -32607, 'message': 'Не предоставлен ключ авторизации.'},
                      'jsonrpc': '2.0'}

    request = {'jsonrpc': '2.0', 'method': 'func_1', 'params': False}
    result = master.check_dict(request)
    assert result == {'error': {'code': -32606,
                                'message': 'Неправильно оформлены аргументы вызова метода.'},
                      'jsonrpc': '2.0'}

    request = form_request(method='func_1', a=1, b=2, secret_key='xxx')
    result = master.check_dict(request)
    assert result == request
예제 #6
0
def call_api(url: str, *, method: str, error_msg: str, debug: bool,
             **kwargs) -> Optional[Any]:
    """
    Выполнить POST запрос
    """
    payload = form_request(method=method, **kwargs)

    if debug:
        # запомнить, что мы запросили, скрыть секреты
        if 'secret_key' in kwargs:
            kwargs['secret_key'] = '***'
        logger.debug(f'---> {method}({dict_as_args(kwargs)})')

    r = requests.post(url, json=payload)

    if r.status_code == 200:
        body = r.json()

        if 'result' in body:
            result = body['result']

            if debug:
                # запомнить, что мы получили
                logger.debug(f'<--- {method}: <' + str(result)[0:100] + '>')

            return result

        else:
            post_mortem = body['error']
    else:
        post_mortem = r.content.decode('utf-8')

    logger.critical(post_mortem)
    fail(error_msg, reason=ConnectionError)
    return None
def test_authorize(master):
    """
    Должен проверить авторизацию
    """
    request = form_request(method='func_1', a=1, b=2, id=825)
    assert authorize(request, lambda x: False) == {
        'error': {'code': -32602, 'message': 'Отказано в доступе.'},
        'id': 825,
        'jsonrpc': '2.0'}
    assert authorize(request, lambda x: True) == request
def test_check_signature(master):
    """
    Должен проверить сигнатуры списка запросов или одного запроса
    """
    requests = [form_request(method='func_1', msg_id=1)]
    errors = []
    master.check_signature_conveyor(requests, errors)
    assert errors == [{
        'error': {
            'code': -32602,
            'message': 'Расхождение в аргументах метода: не хватает аргументов a, b'},
        'id': 1,
        'jsonrpc': '2.0'}]

    requests = [form_request(method='func_1', a=1, z=2, msg_id=1)]
    errors = []
    master.check_signature_conveyor(requests, errors)
    assert errors == [
        {'error': {
            'code': -32602,
            'message':
                'Расхождение в аргументах метода: не хватает аргументов b, лишние аргументы z'},
            'id': 1,
            'jsonrpc': '2.0'}]

    requests = [
        form_request(method='func_1', a=1, b=2, msg_id=1),
        form_request(method='func_1', c=1, d=2, id=2),
        form_request(method='func_2', c=1, d=2, id=3),
    ]
    errors = []
    master.check_signature_conveyor(requests, errors)
    assert requests == [{'id': 1, 'jsonrpc': '2.0', 'method': 'func_1', 'params': {'a': 1, 'b': 2}},
                        {'id': 3, 'jsonrpc': '2.0', 'method': 'func_2', 'params': {'c': 1, 'd': 2}}]
    assert errors == [
        {'error': {'code': -32602,
                   'message': 'Расхождение в аргументах метода: не хватает аргументов '
                              'a, b, лишние аргументы c, d'},
         'id': 2,
         'jsonrpc': '2.0'},
    ]