def test_no_redirect_history_in_exception() -> None: url = 'http://def-cl-resp.org' headers = {'Content-Type': 'application/json;charset=cp1251'} response = ClientResponse('get', URL(url), request_info=RequestInfo(url, 'get', headers), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock()) response.status = 409 response.reason = 'CONFLICT' with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert () == cm.value.history
async def test_read_and_release_connection_with_error(loop, session) -> None: response = ClientResponse('get', URL('http://def-cl-resp.org'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) content = response.content = mock.Mock() content.read.return_value = loop.create_future() content.read.return_value.set_exception(ValueError) with pytest.raises(ValueError): await response.read() assert response._closed
async def test_response_eof_after_connection_detach(loop, session) -> None: response = ClientResponse('get', URL('http://def-cl-resp.org'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) response._closed = False conn = response._connection = mock.Mock() conn.protocol = None response._response_eof() assert conn.release.called assert response._connection is None
def test_response_links_no_rel(loop, session) -> None: url = URL('http://def-cl-resp.org/') response = ClientResponse('get', url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) response._headers = CIMultiDict([("Link", '<http://example.com/>')]) assert (response.links == { 'http://example.com/': { 'url': URL('http://example.com/') } })
def test_https_connect_runtime_error(self, ClientRequestMock): proxy_req = ClientRequest('GET', URL('http://proxy.example.com'), loop=self.loop) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse('get', URL('http://proxy.example.com'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), auto_decompress=True, traces=[], loop=self.loop, session=mock.Mock()) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro(mock.Mock(status=200)) connector = aiohttp.TCPConnector(loop=self.loop) connector._resolve_host = make_mocked_coro([{ 'hostname': 'hostname', 'host': '127.0.0.1', 'port': 80, 'family': socket.AF_INET, 'proto': 0, 'flags': 0 }]) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( 'GET', URL('https://www.python.org'), proxy=URL('http://proxy.example.com'), loop=self.loop, ) with self.assertRaisesRegex( RuntimeError, "Transport does not expose socket instance"): self.loop.run_until_complete(connector._create_connection(req)) self.loop.run_until_complete(proxy_req.close()) proxy_resp.close() self.loop.run_until_complete(req.close())
def test_content_disposition_no_parameters() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response._headers = {"Content-Disposition": "attachment"} assert "attachment" == response.content_disposition.type assert response.content_disposition.filename is None assert {} == response.content_disposition.parameters
def test_response_request_info() -> None: url = "http://def-cl-resp.org" headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers, url), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) assert url == response.request_info.url assert "get" == response.request_info.method assert headers == response.request_info.headers
def test_get_encoding_unknown(loop: Any, session: Any) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "application/json"} with mock.patch("aiohttp.client_reqrep.chardet") as m_chardet: m_chardet.detect.return_value = {"encoding": None} assert response.get_encoding() == "utf-8"
async def test_json_no_content(loop: Any, session: Any) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "application/json"} response._body = b"" with pytest.raises(JSONDecodeError): await response.json(content_type=None)
async def test_json_invalid_content_type(loop, session) -> None: response = ClientResponse('get', URL('http://def-cl-resp.org'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) response._headers = {'Content-Type': 'data/octet-stream'} response._body = b'' with pytest.raises(aiohttp.ContentTypeError) as info: await response.json() assert info.value.request_info == response.request_info
async def test_release(loop, session) -> None: response = ClientResponse('get', URL('http://def-cl-resp.org'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) fut = loop.create_future() fut.set_result(b'') content = response.content = mock.Mock() content.readany.return_value = fut response.release() assert response._connection is None
async def test_response_eof_upgraded(loop, session) -> None: response = ClientResponse('get', URL('http://def-cl-resp.org'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) conn = response._connection = mock.Mock() conn.protocol.upgraded = True response._response_eof() assert not conn.release.called assert response._connection is conn
def test_close(loop: Any, session: Any) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False response._connection = mock.Mock() response.close() assert response.connection is None response.close() response.close()
async def test_json_custom_loader(loop, session): response = ClientResponse('get', URL('http://def-cl-resp.org'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) response.headers = {'Content-Type': 'application/json;charset=cp1251'} response._body = b'data' def custom(content): return content + '-custom' res = await response.json(loads=custom) assert res == 'data-custom'
def client_response(loop, session): """Fixture to return a mocked client response.""" r = aiohttp.ClientResponse( 'get', URL('http://synse-response.io'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) r.content = mock.Mock() r._headers = {'Content-Type': 'application/json'} return r
def test_raise_for_status_4xx_without_reason() -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 404 response.reason = "" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert str(cm.value.status) == "404" assert str(cm.value.message) == "" assert response.closed
async def test_json_invalid_content_type(loop: Any, session: Any) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "data/octet-stream"} response._body = b"" with pytest.raises(aiohttp.ContentTypeError) as info: await response.json() assert info.value.request_info == response.request_info
async def test_response_eof(loop: Any, session: Any) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._closed = False conn = response._connection = mock.Mock() conn.protocol.upgraded = False response._response_eof() assert conn.release.called assert response._connection is None
def test_response_links_no_rel(loop: Any, session: Any) -> None: url = URL("http://def-cl-resp.org/") response = ClientResponse( "get", url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = CIMultiDict([("Link", "<http://example.com/>")]) assert response.links == { "http://example.com/": { "url": URL("http://example.com/") } }
def cb(): fut = asyncio.Future(loop=self._loop) resp = ClientResponse('GET', yarl.URL('foo'), writer=Mock(), timer=TimerNoop(), continue100=None, request_info=Mock(), traces=[], loop=self._loop, session=Mock()) resp.status = status # setting this as aiohttp 3.5.4 is now checking if this value is not None # see aiohttp/client_reqrep.py:934 resp.reason = http.client.responses[status] fut.set_result(resp) return fut
def test_response_not_closed_after_get_ok(mocker) -> None: response = ClientResponse( "get", URL("http://del-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 400 response.reason = "Bad Request" response._closed = False spy = mocker.spy(response, "raise_for_status") assert not response.ok assert not response.closed assert spy.call_count == 0
def ClientResponse(method, url, *, writer=None, continue100=None, timer=None, request_info=None, traces=None, loop=None, session=None): return BaseClientResponse(method, url, writer=writer or Mock(), continue100=continue100, timer=timer or TimerNoop(), request_info=request_info or Mock(), traces=traces or [], loop=loop or asyncio.get_event_loop(), session=session or None)
def test_request_info_in_exception() -> None: url = "http://def-cl-resp.org" headers = {"Content-Type": "application/json;charset=cp1251"} response = ClientResponse( "get", URL(url), request_info=RequestInfo(url, "get", headers), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock(), ) response.status = 409 response.reason = "CONFLICT" with pytest.raises(aiohttp.ClientResponseError) as cm: response.raise_for_status() assert cm.value.request_info == response.request_info
def test_content_disposition_full(): response = ClientResponse('get', URL('http://def-cl-resp.org'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock()) response.headers = { 'Content-Disposition': 'attachment; filename="archive.tar.gz"; foo=bar' } assert 'attachment' == response.content_disposition.type assert 'bar' == response.content_disposition.parameters["foo"] assert 'archive.tar.gz' == response.content_disposition.filename with pytest.raises(TypeError): response.content_disposition.parameters["foo"] = "baz"
def test_https_connect_resp_start_error(self, ClientRequestMock) -> None: proxy_req = ClientRequest('GET', URL('http://proxy.example.com'), loop=self.loop) ClientRequestMock.return_value = proxy_req proxy_resp = ClientResponse('get', URL('http://proxy.example.com'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=self.loop, session=mock.Mock()) proxy_req.send = make_mocked_coro(proxy_resp) proxy_resp.start = make_mocked_coro( raise_exception=OSError("error message")) connector = aiohttp.TCPConnector(loop=self.loop) connector._resolve_host = make_mocked_coro([{ 'hostname': 'hostname', 'host': '127.0.0.1', 'port': 80, 'family': socket.AF_INET, 'proto': 0, 'flags': 0 }]) tr, proto = mock.Mock(), mock.Mock() tr.get_extra_info.return_value = None self.loop.create_connection = make_mocked_coro((tr, proto)) req = ClientRequest( 'GET', URL('https://www.python.org'), proxy=URL('http://proxy.example.com'), loop=self.loop, ) with self.assertRaisesRegex(OSError, "error message"): self.loop.run_until_complete( connector._create_connection(req, None, aiohttp.ClientTimeout()))
async def test_json_custom_loader(loop: Any, session: Any) -> None: response = ClientResponse( "get", URL("http://def-cl-resp.org"), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session, ) response._headers = {"Content-Type": "application/json;charset=cp1251"} response._body = b"data" def custom(content): return content + "-custom" res = await response.json(loads=custom) assert res == "data-custom"
def test_response_links_relative(loop, session): url = URL('http://def-cl-resp.org/') response = ClientResponse('get', url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) response.headers = CIMultiDict([ ("Link", '</relative/path>; rel=rel'), ]) assert (response.links == { 'rel': { 'url': URL('http://def-cl-resp.org/relative/path'), 'rel': 'rel' } })
def test_response_links_quoted(loop, session): url = URL('http://def-cl-resp.org/') response = ClientResponse('get', url, request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) response.headers = CIMultiDict([ ("Link", '<http://example.com/>; rel="home-page"'), ]) assert (response.links == { 'home-page': { 'url': URL('http://example.com/'), 'rel': 'home-page' } })
def test_response_request_info() -> None: url = 'http://def-cl-resp.org' headers = {'Content-Type': 'application/json;charset=cp1251'} response = ClientResponse( 'get', URL(url), request_info=RequestInfo( url, 'get', headers ), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=mock.Mock(), session=mock.Mock() ) assert url == response.request_info.url assert 'get' == response.request_info.method assert headers == response.request_info.headers
async def test_read_and_release_connection(loop, session) -> None: response = ClientResponse('get', URL('http://def-cl-resp.org'), request_info=mock.Mock(), writer=mock.Mock(), continue100=None, timer=TimerNoop(), traces=[], loop=loop, session=session) def side_effect(*args, **kwargs): fut = loop.create_future() fut.set_result(b'payload') return fut content = response.content = mock.Mock() content.read.side_effect = side_effect res = await response.read() assert res == b'payload' assert response._connection is None