class PostMapper(Mapper): __type__ = Post title = field.String() user = field.Nested('UserMapper', required=True, allow_create=True) readers = field.Collection(field.Nested('UserMapper'), required=False)
class PostMapper(Mapper): __type__ = Post title = field.String() user = field.Nested('UserMapper', required=False, allow_updates_in_place=True) readers = field.Collection(field.Nested('PostMapper', getter=foo_getter), required=False)
def test_serialize_nested_collection(): class UserMapper(Mapper): __type__ = TestType id = field.String(required=True, read_only=True) name = field.String() users = [TestType(id='1', name='mike'), TestType(id='2', name='jack')] post = TestType(id='1', users=users) output = {} f = field.Collection(field.Nested('UserMapper'), name='users') mapper_session = get_mapper_session(obj=post, output=output) f.serialize(mapper_session) assert output == { 'users': [{ 'id': '1', 'name': 'mike' }, { 'id': '2', 'name': 'jack' }] }
def test_marshal_nested_collection_allow_updates_in_place_too_many_with_allow_create( ): # We're updating in place, there are more users in the input data # but allow_create is also enabled, so a new user should be added class UserMapper(Mapper): __type__ = TestType name = field.String() user = TestType(id='1', name='mike') data = { 'id': 2, 'name': 'bob', 'users': [{ 'name': 'name1' }, { 'name': 'name2' }] } f = field.Collection(field.Nested('UserMapper', allow_updates_in_place=True, allow_create=True), name='users') output = {'users': [user]} mapper_session = get_mapper_session(data=data, output=output) f.marshal(mapper_session) assert output == { 'users': [TestType(id='1', name='name1'), TestType(name='name2')] }
def test_marshal_nested_with_allow_create_and_allow_updates(): # Users may only be passed by id or created if they don't exist and # updated class UserMapper(Mapper): __type__ = dict id = field.String(required=True) name = field.String() user = {'id': '1', 'name': 'mike'} def getter(session): if session.data['id'] == '1': return user test_field = field.Nested('UserMapper', name='user', getter=getter, allow_create=True, allow_updates=True) data1 = {'id': 2, 'name': 'bob', 'user': {'id': '1', 'name': 'a new name'}} output = {} mapper_session = get_mapper_session(data=data1, output=output) test_field.marshal(mapper_session) assert output == {'user': {'id': '1', 'name': 'a new name'}} assert user['name'] == 'a new name' data2 = {'id': 2, 'name': 'bob', 'user': {'id': '2', 'name': 'jack'}} output = {} mapper_session = get_mapper_session(data=data2, output=output) test_field.marshal(mapper_session) assert output == {'user': {'id': '2', 'name': 'jack'}}
def test_marshal_nested_with_defaults(): # Users may only be passed by id and may not be updated class UserMapper(Mapper): __type__ = dict id = field.String(required=True) name = field.String() user = {'id': '1', 'name': 'mike'} def getter(session): return user test_field = field.Nested('UserMapper', name='user', getter=getter) data1 = { 'id': 2, 'name': 'bob', 'user': { 'id': '1', 'name': 'this should be ignored' } } output = {} mapper_session = get_mapper_session(data=data1, output=output) test_field.marshal(mapper_session) assert output == {'user': {'id': '1', 'name': 'mike'}} assert user['name'] == 'mike'
def test_marshal_nested_collection_allow_updates_in_place_too_many(): # We're updating in place, but there are more users in the input data # than already exist so an error should be raised class UserMapper(Mapper): __type__ = TestType name = field.String() user = TestType(id='1', name='mike') data = { 'id': 2, 'name': 'bob', 'users': [{ 'name': 'name1' }, { 'name': 'name2' }] } f = field.Collection(field.Nested('UserMapper', allow_updates_in_place=True), name='users') output = {'users': [user]} mapper_session = get_mapper_session(data=data, output=output) with pytest.raises(FieldInvalid): f.marshal(mapper_session)
def test_marshal_nested_with_getter(): class UserMapper(Mapper): __type__ = dict id = field.String(required=True) name = field.String() users = { '1': { 'id': '1', 'name': 'mike' }, '2': { 'id': '2', 'name': 'jack' } } def getter(session): return users[session.data['id']] test_field = field.Nested('UserMapper', name='user', getter=getter) data1 = {'id': 2, 'name': 'bob', 'user': {'id': '1'}} output = {} mapper_session = get_mapper_session(data=data1, output=output) test_field.marshal(mapper_session) assert output == {'user': {'id': '1', 'name': 'mike'}} data2 = {'id': 2, 'name': 'bob', 'user': {'id': '2'}} output = {} mapper_session = get_mapper_session(data=data2, output=output) test_field.marshal(mapper_session) assert output == {'user': {'id': '2', 'name': 'jack'}}
def test_marshal_nested_collection_default(): class UserMapper(Mapper): __type__ = TestType id = field.String(required=True) name = field.String() user = TestType(id='1', name='mike') data = { 'id': 2, 'name': 'bob', 'users': [{ 'id': '1', 'name': 'ignore this' }] } def getter(session): if session.data['id'] == '1': return user f = field.Collection(field.Nested('UserMapper', getter=getter), name='users') output = {} mapper_session = get_mapper_session(data=data, output=output) f.marshal(mapper_session) assert output == {'users': [user]} assert user.name == 'mike'
def test_get_mapper_not_a_valid_mapper(): class Foo(object): pass f = field.Nested(Foo, name='user') with pytest.raises(MapperError): f.get_mapper(data={'foo': 'id'})
class DocumentMapper(Mapper): __type__ = dict id = field.String(required=True) name = field.String() user = field.Nested('UserMapper', name='user', allow_partial_updates=True)
class PostMapper(Mapper): __type__ = Post title = field.String() user = field.Nested('UserMapper', required=True, allow_updates_in_place=True)
def test_get_mapper_mapper_type(): class UserMapper(Mapper): __type__ = dict id = field.String(required=True, read_only=True) name = field.String() f = field.Nested(UserMapper, name='user') assert isinstance(f.get_mapper(data={'foo': 'id'}), UserMapper)
class UserMapper(Mapper): __type__ = User id = field.Integer(read_only=True) name = field.String() is_admin = field.Boolean(required=False, default=False) company = field.Nested(CompanyMapper, getter=company_getter) __roles__ = { 'overview': whitelist('id', 'name') }
def test_marshal_nested(): class UserMapper(Mapper): __type__ = dict id = field.String(required=True) name = field.String() data = {'id': 2, 'name': 'bob', 'user': {'id': '1', 'name': 'mike'}} test_field = field.Nested('UserMapper', name='user', allow_create=True) output = {} mapper_session = get_mapper_session(data=data, output=output) test_field.marshal(mapper_session) assert output == {'user': {'id': '1', 'name': 'mike'}}
def test_serialise_nested(): class UserMapper(Mapper): __type__ = dict id = field.String(required=True, read_only=True) name = field.String() data = {'id': 2, 'name': 'bob', 'user': {'id': '1', 'name': 'mike'}} test_field = field.Nested('UserMapper', name='user') output = {} mapper_session = get_mapper_session(obj=data, output=output) test_field.serialize(mapper_session) assert output == {'user': {'id': '1', 'name': 'mike'}}
def test_marshal_nested_collection_allow_create(): class UserMapper(Mapper): __type__ = TestType id = field.String(required=True) name = field.String() data = {'id': 2, 'name': 'bob', 'users': [{'id': '1', 'name': 'mike'}]} f = field.Collection(field.Nested('UserMapper', allow_create=True), name='users') output = {} mapper_session = get_mapper_session(data=data, output=output) f.marshal(mapper_session) assert output == {'users': [TestType(id='1', name='mike')]}
def test_marshal_nested_with_getter_failure(): class UserMapper(Mapper): __type__ = dict id = field.String(required=True) name = field.String() def getter(session): return None test_field = field.Nested('UserMapper', name='user', getter=getter) data = {'id': 2, 'name': 'bob', 'user': {'id': '1'}} output = {} mapper_session = get_mapper_session(data=data, output=output) with pytest.raises(FieldInvalid): test_field.marshal(mapper_session)
def test_marshal_nested_collection_allow_updates_in_place(): class UserMapper(Mapper): __type__ = TestType name = field.String() user = TestType(id='1', name='mike') data = {'id': 2, 'name': 'bob', 'users': [{'name': 'new name'}]} f = field.Collection(field.Nested('UserMapper', allow_updates_in_place=True), name='users') output = {'users': [user]} mapper_session = get_mapper_session(data=data, output=output) f.marshal(mapper_session) assert output == {'users': [user]} assert user.name == 'new name'
def test_marshal_nested_with_allow_updates_in_place(): # No getter required, but the existing user object can be changed class UserMapper(Mapper): __type__ = dict name = field.String() user = {'id': '1', 'name': 'mike'} output = {'user': user} test_field = field.Nested('UserMapper', name='user', allow_updates_in_place=True) data1 = {'id': 2, 'name': 'bob', 'user': {'name': 'a new name'}} mapper_session = get_mapper_session(data=data1, output=output) test_field.marshal(mapper_session) assert output == {'user': {'id': '1', 'name': 'a new name'}} assert user['name'] == 'a new name'
def test_marshal_nested_with_allow_updates(): # Users may only be passed by id and may be updated, but not created class UserMapper(Mapper): __type__ = dict id = field.String(required=True) name = field.String() user = {'id': '1', 'name': 'mike'} def getter(session): if session.data['id'] == '1': return user test_field = field.Nested('UserMapper', name='user', getter=getter, allow_updates=True) data1 = {'id': 2, 'name': 'bob', 'user': {'id': '1', 'name': 'a new name'}} output = {} mapper_session = get_mapper_session(data=data1, output=output) test_field.marshal(mapper_session) assert output == {'user': {'id': '1', 'name': 'a new name'}} assert user['name'] == 'a new name' data2 = { 'id': 2, 'name': 'bob', 'user': { 'id': '2', 'name': 'should not allow this to be created' } } output = {} mapper_session = get_mapper_session(data=data2, output=output) with pytest.raises(FieldInvalid): test_field.marshal(mapper_session)
def test_marshal_nested_with_role(): class UserMapper(Mapper): __type__ = dict id = field.String(required=True, read_only=True) name = field.String() __roles__ = { 'public': [ 'name', ] } data = {'id': 2, 'name': 'bob', 'user': {'id': '1', 'name': 'mike'}} test_field = field.Nested('UserMapper', name='user', role='public', allow_create=True) output = {} mapper_session = get_mapper_session(data=data, output=output) test_field.marshal(mapper_session) assert output == {'user': {'name': 'mike'}}
class PostMapper(Mapper): __type__ = TestType readers = field.Collection( field.Nested(UserMapper, getter=assert_scope))
class PostMapper(Mapper): __type__ = Post title = field.String() user = field.Nested('UserMapper', required=True, getter=getter)
class PostMapper(Mapper): __type__ = TestType readers = field.Collection(field.Nested(UserMapper, allow_create=True), unique_on='id')
class ComplexMapper(Mapper): __type__ = Complex foo = field.String() bar = field.String(extra_serialize_pipes={'output': [bar_pipe]}) sub = field.Nested(SubMapper) subs = field.Collection(field.Nested(SubMapper))
class PostMapper(Mapper): __type__ = TestType readers = field.Collection(field.Nested(UserMapper, allow_create=True), required=False)
def test_nested_defers_mapper_checks(): """ensure that instantiating a nested field with an invalid mapper doesn't emit an error until the nested mapper is actually needed. """ field.Nested('IDontExist', name='user')
class Outer(Mapper): __type__ = dict user = field.Nested(Inner, source='__self__', allow_create=True) status = field.Integer()
def test_get_mapper_not_registered(): f = field.Nested('UserMapper', name='user') with pytest.raises(MapperError): f.get_mapper(data={'foo': 'id'})