1import pytest 2import sqlalchemy as sa 3 4from sqlalchemy_utils import EmailType 5 6 7@pytest.fixture 8def User(Base): 9 class User(Base): 10 __tablename__ = 'user' 11 id = sa.Column(sa.Integer, primary_key=True) 12 email = sa.Column(EmailType) 13 short_email = sa.Column(EmailType(length=70)) 14 15 def __repr__(self): 16 return 'User(%r)' % self.id 17 return User 18 19 20class TestEmailType(object): 21 def test_saves_email_as_lowercased(self, session, User): 22 user = User(email=u'Someone@example.com') 23 24 session.add(user) 25 session.commit() 26 27 user = session.query(User).first() 28 assert user.email == u'someone@example.com' 29 30 def test_literal_param(self, session, User): 31 clause = User.email == 'Someone@example.com' 32 compiled = str(clause.compile(compile_kwargs={'literal_binds': True})) 33 assert compiled == '"user".email = lower(\'Someone@example.com\')' 34 35 def test_custom_length(self, session, User): 36 assert User.short_email.type.impl.length == 70 37 38 def test_compilation(self, User, session): 39 query = sa.select([User.email]) 40 # the type should be cacheable and not throw exception 41 session.execute(query) 42