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