def test_deserialize_mixed_list_mismatched_length(self): class Model(psm.SchemaModel): bag = psm.ListField([psm.IntegerField(), psm.BoolField()]) m1 = Model(bag=[1, False, 'str']) with self.assertRaises(TypeError): psm.deserialize(Model, m1)
def test_deserialize_nonnullable(self): class Model(psm.SchemaModel): field = psm.FloatField(nullable=False) with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"field": null}') m1 = psm.deserialize(Model, '{"field": 12.98}') self.assertEqual(12.98, m1.field)
def test_deserialize_nonnullable_string(self): class Model(psm.SchemaModel): field = psm.StringField(nullable=False) with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"field": null}') nonempty_model = psm.deserialize(Model, '{"field": "str"}') self.assertEqual('str', nonempty_model.field) empty_model = psm.deserialize(Model, '{"field": ""}') self.assertEqual('', empty_model.field)
def test_deserialize_bool(self): class Model(psm.SchemaModel): field = psm.BoolField(nullable=False) with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"field": null}') false_model = psm.deserialize(Model, '{"field": false}') self.assertEqual(False, false_model.field) true_model = psm.deserialize(Model, '{"field": true}') self.assertEqual(True, true_model.field)
def test_deserialize_mixed_list(self): class SubModel(psm.SchemaModel): data = psm.ListField([psm.BoolField()]) class Model(psm.SchemaModel): bag = psm.ListField([ psm.IntegerField(), psm.ListField([psm.ObjectField(SubModel)]) ]) m1 = psm.deserialize( Model, '{"bag": [1, [{"data": [true, false]}, {"data": [true, true, false]}]]}' ) self.assertIsInstance(m1, Model) self.assertIsInstance(m1.bag, list) self.assertIsInstance(m1.bag[0], int) self.assertEqual(m1.bag[0], 1) self.assertIsInstance(m1.bag[1], list) self.assertEqual(len(m1.bag[1]), 2) for i in m1.bag[1]: self.assertIsInstance(i, SubModel) self.assertIsInstance(i.data, list) self.assertEqual(len(m1.bag[1][0].data), 2) self.assertEqual(m1.bag[1][0].data[0], True) self.assertEqual(m1.bag[1][0].data[1], False) self.assertEqual(len(m1.bag[1][1].data), 3) self.assertEqual(m1.bag[1][1].data[0], True) self.assertEqual(m1.bag[1][1].data[1], True) self.assertEqual(m1.bag[1][1].data[2], False)
def test_deserialize_list_of_objects_with_list(self): class Vector(psm.SchemaModel): u = psm.ListField([psm.IntegerField()], min_length=3, max_length=3) class Model(psm.SchemaModel): vectors = psm.ListField([psm.ObjectField(Vector)]) m1 = psm.deserialize( Model, '{"vectors": [{"u": [1, 0, 0]}, {"u": [0, 1, 0]}, {"u": [0, 0, 1]}]}' ) expected = Model(vectors=[ Vector(u=[1, 0, 0]), Vector(u=[0, 1, 0]), Vector(u=[0, 0, 1]) ]) self.assertIsInstance(m1, Model) self.assertIsInstance(m1.vectors, list) self.assertEqual(len(m1.vectors), len(expected.vectors)) i = 0 while i < len(m1.vectors): self.assertIsInstance(m1.vectors[i], Vector) self.assertEqual(len(m1.vectors[i].u), 3) j = 0 while j < len(m1.vectors[i].u): self.assertEqual(m1.vectors[i].u[j], expected.vectors[i].u[j]) j = j + 1 i = i + 1
def test_deserialize_list_of_objects(self): class Vector(psm.SchemaModel): x = psm.IntegerField(required=True, nullable=False) y = psm.IntegerField(required=True, nullable=False) z = psm.IntegerField(required=True, nullable=False) class Model(psm.SchemaModel): vectors = psm.ListField([psm.ObjectField(Vector)]) m1 = psm.deserialize( Model, '{"vectors": [{"x": 1, "y": 0, "z": 0}, {"x": 0, "y": 1, "z": 0}, {"x": 0, "y": 0, "z": 1}]}' ) self.assertIsInstance(m1, Model) self.assertIsInstance(m1.vectors, list) self.assertEqual(len(m1.vectors), 3) for v in m1.vectors: self.assertIsInstance(v, Vector) self.assertTrue(m1.vectors[0].x == 1 and m1.vectors[0].y == 0 and m1.vectors[0].z == 0) self.assertTrue(m1.vectors[1].x == 0 and m1.vectors[1].y == 1 and m1.vectors[1].z == 0) self.assertTrue(m1.vectors[2].x == 0 and m1.vectors[2].y == 0 and m1.vectors[2].z == 1)
def test_deserialize_obj_of_objs(self): class SubModel(psm.SchemaModel): field = psm.StringField() class Model(psm.SchemaModel): obj_field = psm.ObjectField(SubModel) m1 = psm.deserialize(Model, '{"obj_field": {"field": "greetings"}}') self.assertIsInstance(m1, Model) self.assertIsInstance(m1.obj_field, SubModel) self.assertEqual(m1.obj_field.field, 'greetings')
def test_deserialize_list_of_integers(self): class Model(psm.SchemaModel): indices = psm.ListField([psm.IntegerField()]) m1 = psm.deserialize(Model, '{"indices": [1, 8, 9, 101]}') self.assertIsInstance(m1, Model) self.assertIsInstance(m1.indices, list) expected = [1, 8, 9, 101] self.assertEqual(len(m1.indices), len(expected)) idx = 0 while idx < len(expected): self.assertEqual(m1.indices[idx], expected[idx]) idx = idx + 1
def test_deserialize_list_of_lists(self): class Transformation(psm.SchemaModel): m = psm.ListField([psm.ListField([psm.IntegerField()])]) m1 = psm.deserialize(Transformation, '{"m": [[1, 0, 0], [0, 1, 0], [0, 0, 1]]}') expected = Transformation(m=[[1, 0, 0], [0, 1, 0], [0, 0, 1]]) self.assertIsInstance(m1, Transformation) self.assertEqual(len(m1.m), len(expected.m)) i = 0 while i < len(m1.m): j = 0 while j < len(m1.m[i]): self.assertEqual(m1.m[i], expected.m[i]) j = j + 1 i = i + 1
def test_deserialize_nullable(self): class Model(psm.SchemaModel): field = psm.FloatField(nullable=True) m1 = psm.deserialize(Model, '{"field": null}') self.assertEqual(None, m1.field) m2 = psm.deserialize(Model, '{"field": 12.34}') self.assertEqual(12.34, m2.field) with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"field": "str"}') with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"field": -1.9, "greeting": "hello"}') with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"greeting": "hello"}')
def test_deserialize_nullable_bool(self): class Model(psm.SchemaModel): field = psm.BoolField(nullable=True) null_model = psm.deserialize(Model, '{"field": null}') self.assertEqual(None, null_model.field) false_model = psm.deserialize(Model, '{"field": false}') self.assertEqual(False, false_model.field) true_model = psm.deserialize(Model, '{"field": true}') self.assertEqual(True, true_model.field) # additional fields with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"field": null, "greeting": "hello"}') # missing fields with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"another_field": null}')
def test_deserialize_nullable_string(self): class Model(psm.SchemaModel): field = psm.StringField(nullable=True) null_model = psm.deserialize(Model, '{"field": null}') self.assertEqual(None, null_model.field) nonempty_model = psm.deserialize(Model, '{"field": "str"}') self.assertEqual('str', nonempty_model.field) empty_model = psm.deserialize(Model, '{"field": ""}') self.assertEqual('', empty_model.field) # additional fields with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"field": null, "greeting": "hello"}') # missing fields with self.assertRaises(psm.ValidationError): psm.deserialize(Model, '{"another_field": null}')