-
Notifications
You must be signed in to change notification settings - Fork 61
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
17 changed files
with
379 additions
and
176 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,195 @@ | ||
# Third party imports | ||
import marshmallow | ||
import pytest | ||
|
||
# Local imports | ||
from uplink import converters | ||
|
||
|
||
class TestCast(object): | ||
def test_converter_without_caster(self, converter_mock): | ||
converter_mock.convert.return_value = 2 | ||
cast = converters.Cast(None, converter_mock) | ||
return_value = cast.convert(1) | ||
converter_mock.convert.assert_called_with(1) | ||
assert return_value == 2 | ||
|
||
def test_convert_with_caster(self, mocker, converter_mock): | ||
caster = mocker.Mock(return_value=2) | ||
converter_mock.convert.return_value = 3 | ||
cast = converters.Cast(caster, converter_mock) | ||
return_value = cast.convert(1) | ||
caster.assert_called_with(1) | ||
converter_mock.convert.assert_called_with(2) | ||
assert return_value == 3 | ||
|
||
|
||
class TestResponseBodyConverter(object): | ||
def test_convert(self): | ||
converter_ = converters.ResponseBodyConverter() | ||
response = "json response" | ||
converted = converter_.convert(response) | ||
assert converted == response | ||
|
||
|
||
class TestRequestBodyConverter(object): | ||
def test_convert_str(self): | ||
converter_ = converters.RequestBodyConverter() | ||
assert converter_.convert("example") == "example" | ||
|
||
def test_convert_obj(self): | ||
converter_ = converters.RequestBodyConverter() | ||
example = {"hello": "2"} | ||
assert converter_.convert(example) == example | ||
|
||
|
||
class TestStringConverter(object): | ||
def test_convert(self): | ||
converter_ = converters.StringConverter() | ||
assert converter_.convert(2) == "2" | ||
|
||
|
||
class TestMappingConverterDecorator(object): | ||
def test_convert(self, mocker, converter_mock): | ||
mapping = {"key1": "value1", "key2": "value2"} | ||
converter_mock.convert.return_value = "converted" | ||
mapping_converter = converters.MappingConverterDecorator(converter_mock) | ||
converted_value = mapping_converter.convert(mapping) | ||
calls = map(mocker.call, mapping.values()) | ||
assert converter_mock.convert.mock_calls == list(calls) | ||
assert converted_value == {"key1": "converted", "key2": "converted"} | ||
|
||
|
||
class TestConverterFactoryRegistry(object): | ||
backend = converters.ConverterFactoryRegistry._converter_factory_registry | ||
|
||
def test_init_args_are_passed_to_factory(self, converter_factory_mock): | ||
args = ("arg1", "arg2") | ||
kwargs = {"arg3": "arg3"} | ||
converter_factory_mock.make_string_converter.return_value = "test" | ||
registry = converters.ConverterFactoryRegistry( | ||
(converter_factory_mock,), *args, **kwargs) | ||
return_value = registry[converters.CONVERT_TO_STRING]() | ||
converter_factory_mock.make_string_converter.assert_called_with( | ||
*args, **kwargs | ||
) | ||
assert return_value == "test" | ||
|
||
def test_with_converter_map(self, converter_factory_mock): | ||
registry = converters.ConverterFactoryRegistry( | ||
(converter_factory_mock,)) | ||
converter_ = registry[converters.Map(converters.CONVERT_TO_STRING)]() | ||
assert isinstance(converter_, converters.MappingConverterDecorator) | ||
|
||
def test_len(self): | ||
registry = converters.ConverterFactoryRegistry(()) | ||
assert len(registry) == len(self.backend) | ||
|
||
def test_iter(self): | ||
registry = converters.ConverterFactoryRegistry(()) | ||
assert list(iter(registry)) == list(iter(self.backend)) | ||
|
||
|
||
def test_make_request_body_converter(converter_factory_mock): | ||
method = converters.make_request_body_converter(converter_factory_mock) | ||
assert method is converter_factory_mock.make_request_body_converter | ||
|
||
|
||
def test_make_response_body_converter(converter_factory_mock): | ||
method = converters.make_response_body_converter(converter_factory_mock) | ||
assert method is converter_factory_mock.make_response_body_converter | ||
|
||
|
||
def test_make_string_converter(converter_factory_mock): | ||
method = converters.make_string_converter(converter_factory_mock) | ||
assert method is converter_factory_mock.make_string_converter | ||
|
||
|
||
@pytest.fixture(params=["class", "instance"]) | ||
def schema_mock_and_argument(request, mocker): | ||
class Schema(marshmallow.Schema): | ||
def __new__(cls, *args, **kwargs): | ||
return schema | ||
|
||
schema = mocker.Mock(spec=marshmallow.Schema) | ||
if request.param == "class": | ||
return schema, Schema | ||
else: | ||
return schema, schema | ||
|
||
|
||
class TestMarshmallowConverter(object): | ||
def test_init_without_marshmallow(self): | ||
old_marshmallow = converters.MarshmallowConverter.marshmallow | ||
converters.MarshmallowConverter.marshmallow = None | ||
with pytest.raises(ImportError): | ||
converters.MarshmallowConverter() | ||
converters.MarshmallowConverter.marshmallow = old_marshmallow | ||
|
||
def test_make_request_body_converter(self, mocker, schema_mock_and_argument): | ||
# Setup | ||
schema_mock, argument = schema_mock_and_argument | ||
expected_result = "data" | ||
dump_result = mocker.Mock() | ||
dump_result.data = expected_result | ||
schema_mock.dump.return_value = dump_result | ||
converter = converters.MarshmallowConverter() | ||
request_body = {"id": 0} | ||
|
||
# Run | ||
c = converter.make_request_body_converter(argument) | ||
result = c.convert(request_body) | ||
|
||
# Verify | ||
schema_mock.dump.assert_called_with(request_body) | ||
assert expected_result == result | ||
|
||
def test_make_request_body_converter_without_schema(self): | ||
# Setup | ||
converter = converters.MarshmallowConverter() | ||
|
||
# Run | ||
c = converter.make_request_body_converter("not a schema") | ||
|
||
# Verify | ||
assert c is None | ||
|
||
def test_make_response_body_converter(self, mocker, schema_mock_and_argument): | ||
# Setup | ||
schema_mock, argument = schema_mock_and_argument | ||
expected_result = "data" | ||
load_result = mocker.Mock() | ||
load_result.data = expected_result | ||
schema_mock.load.return_value = load_result | ||
converter = converters.MarshmallowConverter() | ||
response = mocker.Mock() | ||
|
||
# Run | ||
c = converter.make_response_body_converter(argument) | ||
result = c.convert(response) | ||
|
||
# Verify | ||
response.json.assert_called_with() | ||
schema_mock.load.assert_called_with(response.json()) | ||
assert expected_result == result | ||
|
||
def test_make_response_body_converter_without_schema(self): | ||
# Setup | ||
converter = converters.MarshmallowConverter() | ||
|
||
# Run | ||
c = converter.make_response_body_converter("not a schema") | ||
|
||
# Verify | ||
assert c is None | ||
|
||
def test_make_string_converter(self, schema_mock_and_argument): | ||
# Setup | ||
_, argument = schema_mock_and_argument | ||
converter = converters.MarshmallowConverter() | ||
|
||
# Run | ||
c = converter.make_string_converter(argument) | ||
|
||
# Verify | ||
assert c is None |
Oops, something went wrong.