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
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'}, ]