def test_dictify_with_null(self): """ Test SQLAlchemySchemaNode.dictify(obj) with null values and show that result is a valid appstruct for the given schema """ Base = declarative_base() class Sensor(Base): __tablename__ = 'sensor' sensor_id = Column(Integer, primary_key=True) institution_id = Column(Integer, nullable=True) sensor_label = Column(String, nullable=True) sensor = Sensor( sensor_id=3, institution_id=None, sensor_label=None, ) schema = SQLAlchemySchemaNode(Sensor) appstruct = schema.dictify(sensor) cstruct = schema.serialize(appstruct=appstruct) newappstruct = schema.deserialize(cstruct) newobj = schema.objectify(appstruct) self.assertEqual(appstruct, newappstruct) self.assertEqual(sensor.sensor_id, newobj.sensor_id) self.assertEqual(sensor.institution_id, newobj.institution_id) self.assertEqual(sensor.sensor_label, newobj.sensor_label)
def test_default_clause(self): """Test proper handling of default and server_default values """ Base = declarative_base() def give_me_three(): return 3 class Patient(Base): __tablename__ = 'patient' # default= is equivalent to ColumnDefault() # server_default= is equivalent to DefaultClause() id = Column(BigInteger(unsigned=True), default=text("uuid_short()"), primary_key=True, autoincrement=False) received_timestamp = Column(TIMESTAMP, server_default=func.now(), nullable=False) some_number = Column(Integer, DefaultClause('3'), nullable=False) scalar_number = Column(Integer, default=3, nullable=False) pyfunc_test = Column(Integer, default=give_me_three, nullable=False) schema = SQLAlchemySchemaNode(Patient) ''' Conceivably you should be able to test DefaultClause for a scalar type value and use it as a default/missing in Colander. However, the value is interpreted by the backend engine and could be a interpreted by it in an unexpected way. For this reason we drop the value and let the backend handle it. ''' # from <FORM> result into SQLA; tests missing self.assertEqual(schema['id'].missing, colander.drop) self.assertEqual(schema['received_timestamp'].missing, colander.drop) self.assertEqual(schema['some_number'].missing, colander.drop) self.assertEqual(schema['scalar_number'].missing, 3) self.assertEqual(schema['pyfunc_test'].missing, 3) deserialized = schema.deserialize({}) self.assertIn('scalar_number', deserialized) self.assertEqual(deserialized['scalar_number'], 3) self.assertIn('pyfunc_test', deserialized) self.assertEqual(deserialized['pyfunc_test'], 3) # from SQLA result into <FORM>; tests default self.assertEqual(schema['id'].default, colander.null) self.assertEqual(schema['received_timestamp'].default, colander.null) self.assertEqual(schema['some_number'].default, colander.null) self.assertEqual(schema['scalar_number'].default, 3) self.assertEqual(schema['pyfunc_test'].default, 3) serialized = schema.serialize({}) self.assertIn('id', serialized) self.assertEqual(serialized['id'], colander.null) self.assertIn('received_timestamp', serialized) self.assertEqual(serialized['received_timestamp'], colander.null) self.assertIn('some_number', serialized) self.assertEqual(serialized['some_number'], colander.null) self.assertIn('scalar_number', serialized) self.assertEqual(serialized['scalar_number'], str(3)) self.assertIn('pyfunc_test', serialized) self.assertEqual(serialized['pyfunc_test'], str(3))
def test_defaultmissing_primarykey(self): """Ensure proper handling of empty values on primary keys """ Base = declarative_base() class User(Base): __tablename__ = 'user' id = Column( Integer, primary_key=True) # is automatically made autoincrement=True schema = SQLAlchemySchemaNode(User) # from <FORM> result into SQLA; tests missing self.assertEqual(schema['id'].missing, colander.drop) deserialized = schema.deserialize({}) self.assertNotIn('id', deserialized) # from SQLA result into <FORM>; tests default self.assertEqual(schema['id'].default, colander.null) serialized = schema.serialize({}) self.assertIn('id', serialized) self.assertEqual(serialized['id'], colander.null) class Widget(Base): __tablename__ = 'widget' id = Column(String, primary_key=True) schema = SQLAlchemySchemaNode(Widget) # from <FORM> result into SQLA; tests missing self.assertEqual(schema['id'].missing, colander.required) self.assertRaises(colander.Invalid, schema.deserialize, {}) # from SQLA result into <FORM>; tests default self.assertEqual(schema['id'].default, colander.null) serialized = schema.serialize({}) self.assertIn('id', serialized) self.assertEqual(serialized['id'], colander.null)
def test_defaultmissing_primarykey(self): """Ensure proper handling of empty values on primary keys """ Base = declarative_base() class User(Base): __tablename__ = 'user' # the follwing is automatically made autoincrement=True id = Column(Integer, primary_key=True) schema = SQLAlchemySchemaNode(User) # from <FORM> result into SQLA; tests missing self.assertEqual(schema['id'].missing, colander.drop) deserialized = schema.deserialize({}) self.assertNotIn('id', deserialized) # from SQLA result into <FORM>; tests default self.assertEqual(schema['id'].default, colander.null) serialized = schema.serialize({}) self.assertIn('id', serialized) self.assertEqual(serialized['id'], colander.null) class Widget(Base): __tablename__ = 'widget' id = Column(String, primary_key=True) schema = SQLAlchemySchemaNode(Widget) # from <FORM> result into SQLA; tests missing self.assertEqual(schema['id'].missing, colander.required) self.assertRaises(colander.Invalid, schema.deserialize, {}) # from SQLA result into <FORM>; tests default self.assertEqual(schema['id'].default, colander.null) serialized = schema.serialize({}) self.assertIn('id', serialized) self.assertEqual(serialized['id'], colander.null)
def test_default_clause(self): """Test proper handling of default and server_default values """ Base = declarative_base() def give_me_three(): return 3 class Patient(Base): __tablename__ = 'patient' # default= is equivalent to ColumnDefault() # server_default= is equivalent to DefaultClause() id = Column( BigInteger(), default=text("round(3.14159)"), primary_key=True, autoincrement=False ) received_timestamp = Column( TIMESTAMP, server_default=func.now(), nullable=False ) some_number = Column( Integer, DefaultClause('3'), nullable=False ) scalar_number = Column( Integer, default=3, nullable=False ) pyfunc_test = Column( Integer, default=give_me_three, nullable=False ) schema = SQLAlchemySchemaNode(Patient) ''' Conceivably you should be able to test DefaultClause for a scalar type value and use it as a default/missing in Colander. However, the value is interpreted by the backend engine and it could be interpreted by it in an unexpected way. For this reason we drop the value and let the backend handle it. ''' # from <FORM> result into SQLA; tests missing self.assertEqual(schema['id'].missing, colander.drop) self.assertEqual(schema['received_timestamp'].missing, colander.drop) self.assertEqual(schema['some_number'].missing, colander.drop) self.assertEqual(schema['scalar_number'].missing, 3) self.assertEqual(schema['pyfunc_test'].missing, colander.drop) deserialized = schema.deserialize({}) self.assertIn('scalar_number', deserialized) self.assertEqual(deserialized['scalar_number'], 3) self.assertNotIn('pyfunc_test', deserialized) # from SQLA result into <FORM>; tests default self.assertEqual(schema['id'].default, colander.null) self.assertEqual(schema['received_timestamp'].default, colander.null) self.assertEqual(schema['some_number'].default, colander.null) self.assertEqual(schema['scalar_number'].default, 3) self.assertEqual(schema['pyfunc_test'].default, colander.null) serialized = schema.serialize({}) self.assertIn('id', serialized) self.assertEqual(serialized['id'], colander.null) self.assertIn('received_timestamp', serialized) self.assertEqual(serialized['received_timestamp'], colander.null) self.assertIn('some_number', serialized) self.assertEqual(serialized['some_number'], colander.null) self.assertIn('scalar_number', serialized) self.assertEqual(serialized['scalar_number'], str(3)) self.assertIn('pyfunc_test', serialized) self.assertEqual(serialized['pyfunc_test'], colander.null)