def test_polymorph_field_not_required(self): parent = self.api.model('Person', { 'name': fields.String, }) child1 = self.api.inherit('Child1', parent, { 'extra1': fields.String, }) child2 = self.api.inherit('Child2', parent, { 'extra2': fields.String, }) class Child1(object): name = 'child1' extra1 = 'extra1' class Child2(object): name = 'child2' extra2 = 'extra2' mapping = {Child1: child1, Child2: child2} thing = self.api.model('Thing', { 'owner': fields.Polymorph(mapping), }) data = self.api.marshal({}, thing) self.assertEqual(data, {'owner': None})
def test_polymorph_field_unknown_class(self): parent = self.api.model('Person', { 'name': fields.String, }) child1 = self.api.inherit('Child1', parent, { 'extra1': fields.String, }) child2 = self.api.inherit('Child2', parent, { 'extra2': fields.String, }) class Child1(object): name = 'child1' extra1 = 'extra1' class Child2(object): name = 'child2' extra2 = 'extra2' mapping = {Child1: child1, Child2: child2} thing = self.api.model('Thing', { 'owner': fields.Polymorph(mapping), }) with self.assertRaises(ValueError): self.api.marshal({'owner': object()}, thing)
def test_polymorph_inherit_common_ancestor(self): class Child1: pass class Child2: pass parent = self.api.model('Person', { 'name': fields.String, 'age': fields.Integer, }) child1 = self.api.inherit('Child1', parent, { 'extra1': fields.String, }) child2 = self.api.inherit('Child2', parent, { 'extra2': fields.String, }) mapping = { Child1: child1, Child2: child2, } output = self.api.model('Output', {'child': fields.Polymorph(mapping)}) # Should use the common ancestor self.assertEqual( output.__schema__, {'properties': { 'child': { '$ref': '#/definitions/Person' }, }})
def test_polymorph_with_discriminator(self): parent = self.api.model('Person', { 'name': fields.String, 'model': fields.String(discriminator=True), }) child1 = self.api.inherit('Child1', parent, { 'extra1': fields.String, }) child2 = self.api.inherit('Child2', parent, { 'extra2': fields.String, }) class Child1(object): name = 'child1' extra1 = 'extra1' class Child2(object): name = 'child2' extra2 = 'extra2' mapping = {Child1: child1, Child2: child2} thing = self.api.model('Thing', { 'owner': fields.Polymorph(mapping), }) def data(cls): return self.api.marshal({'owner': cls()}, thing) self.assertEqual(data(Child1), { 'owner': { 'name': 'child1', 'model': 'Child1', 'extra1': 'extra1' } }) self.assertEqual(data(Child2), { 'owner': { 'name': 'child2', 'model': 'Child2', 'extra2': 'extra2' } })
def test_polymorph_field_no_common_ancestor(self): child1 = self.api.model('Child1', { 'extra1': fields.String, }) child2 = self.api.model('Child2', { 'extra2': fields.String, }) class Child1(object): pass class Child2(object): pass mapping = {Child1: child1, Child2: child2} with self.assertRaises(ValueError): fields.Polymorph(mapping)
def test_polymorph_field_ambiguous_mapping(self): parent = self.api.model('Parent', { 'name': fields.String, }) child = self.api.inherit('Child', parent, { 'extra': fields.String, }) class Parent(object): name = 'parent' class Child(Parent): extra = 'extra' mapping = {Parent: parent, Child: child} thing = self.api.model('Thing', { 'owner': fields.Polymorph(mapping), }) with self.assertRaises(ValueError): self.api.marshal({'owner': Child()}, thing)