import json from contextlib import contextmanager from typing import Optional, Mapping, Any import pytest import requests import responses from requests import HTTPError class _HTTPErrorGenerator: @classmethod def _generate_exception( cls, code: int, message: str, data: Optional[Mapping[str, Any]] = None, success: bool = False ): @contextmanager def _yield_func(): with responses.RequestsMock(assert_all_requests_are_fired=False) as rsp: rsp.add( **{ 'method': responses.GET, 'url': 'http://example.com/path', 'body': json.dumps( { "success": not not success, "code": int(code), "message": str(message), "data": data or {}, } ), 'status': 400, 'content_type': 'application/json', } ) yield @responses.activate def _get_exception(): try: with _yield_func(): response = requests.get('http://example.com/path') response.raise_for_status() except HTTPError as err: return err else: pytest.fail('Should not reach here.') return _get_exception()