def test_subschema_serialization(self): class SomeSchema(Schema): great = ArrayField(int, required=False) field = Subschema(SomeSchema) self.assertEqual({}, field.serialize(None)) self.assertEqual([], field.serialize([])) self.assertEqual("wow", field.serialize("wow")) source = SomeSchema(great=[1, 2, 3]) self.assertEqual({"great": [1, 2, 3]}, field.serialize(source)) source = SomeSchema(great=None) self.assertEqual({}, field.serialize(source)) field = Subschema(SomeSchema, required=False) source = SomeSchema(great=[1, 2, 3]) self.assertEqual({"great": [1, 2, 3]}, field.serialize(source)) source = SomeSchema(great=None) self.assertEqual({}, field.serialize(source)) self.assertEqual({"great": None}, field.serialize(source, implicit_nulls=False))
class Outer(Schema): inner = Subschema(Inner)
class Inner(Schema): maybe = Subschema(MostIn, required=True)
class Outer(Schema): maybe = Subschema(Inner, required=False)
class Target(Schema): inner = Subschema(TargetSub, required=False)
def test_subschema_validation(self): class SomeSchema(Schema): inner = IntegerField() field = Subschema(SomeSchema) assert field.validate(SomeSchema(inner=1)) with self.assertRaises(Invalid): field.validate(SomeSchema(inner="wow")) with self.assertRaises(Invalid): field.validate(SomeSchema(inner=None)) with self.assertRaises(Invalid): field.validate(None) with self.assertRaises(Invalid): field.validate(SomeSchema()) with self.assertRaises(Invalid): field.validate({}) field = Subschema(SomeSchema, required=False) assert field.validate(SomeSchema(inner=1)) assert field.validate(None) assert field.validate({}) assert field.validate(SomeSchema()) assert field.validate(SomeSchema(inner=None)) with self.assertRaises(Invalid): field.validate(SomeSchema(inner="wow"))
class OuterTarget(Schema): inner = Subschema(InnerTarget)
class Source(Schema): inner = Subschema(SourceSub, required=False)
class Target(Schema): inner = Subschema(TargetInner)
class OuterSource(Schema): nested = Subschema(InnerSource)
class First(GenericSchema): second = Subschema(Second)
class First(Schema): second = Subschema(Second)
class FirstSchema(Schema): that = Subschema(SecondSchema)
class Conversation(Schema): numbers = ArrayField(IntegerField()) conversants = ArrayField(Subschema(Person))
class Ship(Schema): name = UnicodeField() captain = Subschema(Person)