Как эмулировать HTTP-ответ из метода requests_mock post

#python #json #http #rpc #http-status-codes

Вопрос:

Я пытаюсь проверить, как работает @retry.retry декоратор для моего пользовательского метода. Для этого мне нужно эмулировать ситуацию, когда ответ имеет статусы HTTP в диапазонах 2xx, 3xx, 4xx. Прямо сейчас у меня есть пример с requests_mock:

 def some_method(request, *_):
    ...
    return {'jsonrpc': '2.0', 'id': 1, 'result': True}

with requests_mock.Mocker() as mock:
    mock.post('mock://test', json=some_method)
    ...
    ...
    my_sender.send(...) # <- tinyrpc.RPCClient.get_proxy somewhere inside
 

Какой метод some_method должен вернуться, например, для эмуляции 404, если это возможно?

В общем, ситуация выглядит следующим образом: mocker возвращает j son rpc 2.0 сейчас. Я хотел бы проверить случай, когда статус http имеет определенные коды, для некоторых из которых мне нужно сделать повторный запрос. Как я могу выполнить эту эмуляцию?

Ответ №1:

Если кому-то интересно, как это имитировать, это очень легко сделать:

 import requests
import requests_mock

session = requests.Session()

with requests_mock.Mocker() as adapter:
    adapter.post('mock://test.com/4', [
        {'text': '{"jsonrpc": "2.0", "id": 1, "body": {"verdicts": [], "errors": {"some_service": "server_error"}}}', 'status_code': 500},
    ] * 3   [
        {'text': '{"jsonrpc": "2.0", "id": 1, "body": {"verdicts": []}}', 'status_code': 200},
    ])

    data = '{"jsonrpc": "2.0", "id": 1, "body": {"text": "hi"}}'
    resp = session.post('mock://test.com/4', data=data)
    print(resp.status_code, resp.text)
    resp = session.post('mock://test.com/4', data=data)
    print(resp.status_code, resp.text)
    resp = session.post('mock://test.com/4', data=data)
    print(resp.status_code, resp.text)
    resp = session.post('mock://test.com/4', data=data)
    print(resp.status_code, resp.text)
    resp = session.post('mock://test.com/4', data=data)
    print(resp.status_code, resp.text)
    resp = session.post('mock://test.com/4', data=data)
    print(resp.status_code, resp.text)
    resp = session.post('mock://test.com/4', data=data)
    print(resp.status_code, resp.text)