Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SVCS-421] Remove unsizable response reader flag #309

51 changes: 51 additions & 0 deletions tests/core/streams/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import pytest

from tests.utils import MockCoroutine
from waterbutler.core.streams.http import ResponseStreamReader


@pytest.fixture
def mock_content():
return type('mock_content', (object,), {'read': MockCoroutine(return_value=b'data')})


@pytest.fixture
def mock_content_eof():
return type('mock_content_eof', (object,), {'read': MockCoroutine(return_value=None)})


class MockResponse:
status = 200
headers = {'Content-Length' : 100,
'Content-Range': '0-100'}
content = mock_content()
release = MockCoroutine()


class MockResponseNoContentLength:
status = 200
headers = {'Content-Range': '0-0'}
content = mock_content()
release = MockCoroutine()


class MockResponseNoContent:
status = 200
headers = {'Content-Range': '0-0'}
content = mock_content_eof()
release = MockCoroutine()


@pytest.fixture
def mock_response_stream_reader():
return ResponseStreamReader(MockResponse(), size=None, name='test stream')


@pytest.fixture
def mock_response_stream_reader_no_size():
return ResponseStreamReader(MockResponseNoContentLength(), size=None, name='test stream')


@pytest.fixture
def mock_response_stream_reader_no_content():
return ResponseStreamReader(MockResponseNoContent(), size=None, name='test stream')
43 changes: 43 additions & 0 deletions tests/core/streams/test_http.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from unittest import mock

import pytest

from tests.core.streams.fixtures import (
mock_content,
mock_content_eof,
MockResponse,
MockResponseNoContentLength,
MockResponseNoContent,
mock_response_stream_reader,
mock_response_stream_reader_no_size,
mock_response_stream_reader_no_content
)

class TestResponseStreamReader:

@pytest.mark.asyncio
async def test_response_stream_reader(self, mock_response_stream_reader):
assert mock_response_stream_reader.name == 'test stream'
assert mock_response_stream_reader.size == 100
assert not mock_response_stream_reader.partial
assert mock_response_stream_reader.content_type == 'application/octet-stream'
assert mock_response_stream_reader.content_range == '0-100'
assert (await mock_response_stream_reader.read()) == b'data'

@pytest.mark.asyncio
async def test_response_stream_reader_no_size(self, mock_response_stream_reader_no_size):
assert mock_response_stream_reader_no_size.name == 'test stream'
assert mock_response_stream_reader_no_size.size is None
assert not mock_response_stream_reader_no_size.partial
assert mock_response_stream_reader_no_size.content_type == 'application/octet-stream'
assert mock_response_stream_reader_no_size.content_range == '0-0'
assert (await mock_response_stream_reader_no_size.read()) == b'data'

@pytest.mark.asyncio
async def test_response_stream_reader_eof(self, mock_response_stream_reader_no_content):

mock_response_stream_reader_no_content.feed_eof = mock.Mock()

assert (await mock_response_stream_reader_no_content.read()) is None
mock_response_stream_reader_no_content.feed_eof.assert_called_once_with()
MockResponseNoContent.release.assert_called_once_with()
6 changes: 2 additions & 4 deletions waterbutler/core/streams/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,14 +140,12 @@ def _make_boundary_stream(self):

class ResponseStreamReader(BaseStream):

def __init__(self, response, size=None, name=None, unsizable=False):
def __init__(self, response, size=None, name=None):
super().__init__()
if 'Content-Length' in response.headers:
self._size = int(response.headers['Content-Length'])
elif not unsizable:
self._size = int(size)
else:
self._size = None
self._size = size

self._name = name
self.response = response
Expand Down