'How mock requests exception using Pytest fixture for mock_requests?

So I was using the requests-mock library to mock the HTTP requests that I do with the requests library and everything went fine until I had to do a test to catch the exception.

Example of my function to be tested

def get_wordpress_installed_plugins(url: str, user: str, password: str) -> bytes:
    try:
        credentials = user + ':' + password
        token = base64.b64encode(credentials.encode())
        header = {'Authorization': 'Basic ' + token.decode('utf-8')}
        response = requests.get(url, headers=header, verify=False)
        response.raise_for_status()
    except requests.exceptions.HTTPError as err:
        logger.exception(f"Got response from {url} correctly with error {err}.")
        raise CouldNotConnectWithApi(f"Problem retrieving information.")
    logger.info(f"Got response from {url} correctly.")
    return response.content

And the test to assert function did ok

@mock.patch("checkpluginsversion.logging.Logger.info")
def test_api_wordpress_list_plugins(logger_mock, requests_mock):
    user = "user"
    password = "password"
    url = "https://www.example.com"
    expected_result = b'[{"plugin": "akismet\\/akismet", "status": "active", "name": "Akismet Anti-Spam","version": "4.2.2"}]'

    requests_mock.get(url,
                      content=b'[{"plugin": "akismet\\/akismet", "status": "active", "name": "Akismet Anti-Spam","version": "4.2.2"}]')

    result = get_wordpress_installed_plugins(url, user, password)

    assert result == expected_result
    logger_mock.assert_called_with(f"Got response from {url} correctly.")

To be honest, I don't know if using pytest fixture mode of this library is the best way, but ok it is working for me. So the problem I have is when I have to test the function and raise the exception. Eventually, I did a workaround with @mock.patch, and worked for me.

@mock.patch("checkpluginsversion.requests.get")
@mock.patch("checkpluginsversion.logging.Logger.exception")
def test_api_should_return_an_exception(logger_mock,my_request_mock):
    user = "user"
    password = "password"
    url = "https://www.example.com"
    expected_result = b'[{"plugin": "akismet\\/akismet", "status": "active", "name": "Akismet Anti-Spam","version": "4.2.2"}]'

    my_request_mock.side_effect = requests.exceptions.HTTPError

    with pytest.raises(CouldNotConnectWithApi):
        result = get_wordpress_installed_plugins(url, user, password)

    #assert result == expected_result
    logger_mock.assert_called_with(f"Got response from {url} correctly with error .")

But I would know and I will really appreciate it if someone could explain to me how to do a test to raise an exception using the pytest fixture of requests_mock library, thanks!



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source