1import sys
2from datetime import datetime
3
4import pytest
5import sqlalchemy as sa
6
7from sqlalchemy_utils import generic_repr, Timestamp
8
9
10class TestTimestamp(object):
11    @pytest.fixture
12    def Article(self, Base):
13        class Article(Base, Timestamp):
14            __tablename__ = 'article'
15            id = sa.Column(sa.Integer, primary_key=True)
16            name = sa.Column(sa.Unicode(255), default=u'Some article')
17        return Article
18
19    def test_created(self, session, Article):
20        then = datetime.utcnow()
21        article = Article()
22
23        session.add(article)
24        session.commit()
25
26        assert article.created >= then and article.created <= datetime.utcnow()
27
28    def test_updated(self, session, Article):
29        article = Article()
30
31        session.add(article)
32        session.commit()
33
34        then = datetime.utcnow()
35        article.name = u"Something"
36
37        session.commit()
38
39        assert article.updated >= then and article.updated <= datetime.utcnow()
40
41
42class TestGenericRepr:
43    @pytest.fixture
44    def Article(self, Base):
45        class Article(Base):
46            __tablename__ = 'article'
47            id = sa.Column(sa.Integer, primary_key=True)
48            name = sa.Column(sa.Unicode(255), default=u'Some article')
49        return Article
50
51    def test_repr(self, Article):
52        """Representation of a basic model."""
53        Article = generic_repr(Article)
54        article = Article(id=1, name=u'Foo')
55        if sys.version_info[0] == 2:
56            expected_repr = u'Article(id=1, name=u\'Foo\')'
57        elif sys.version_info[0] == 3:
58            expected_repr = u'Article(id=1, name=\'Foo\')'
59        else:
60            raise AssertionError
61        actual_repr = repr(article)
62
63        assert actual_repr == expected_repr
64
65    def test_repr_partial(self, Article):
66        """Representation of a basic model with selected fields."""
67        Article = generic_repr('id')(Article)
68        article = Article(id=1, name=u'Foo')
69        expected_repr = u'Article(id=1)'
70        actual_repr = repr(article)
71
72        assert actual_repr == expected_repr
73
74    def test_not_loaded(self, session, Article):
75        """:py:func:`~sqlalchemy_utils.models.generic_repr` doesn't force
76        execution of additional queries if some fields are not loaded and
77        instead represents them as "<not loaded>".
78        """
79        Article = generic_repr(Article)
80        article = Article(name=u'Foo')
81        session.add(article)
82        session.commit()
83
84        article = session.query(Article).options(sa.orm.defer('name')).one()
85        actual_repr = repr(article)
86
87        expected_repr = u'Article(id={}, name=<not loaded>)'.format(article.id)
88        assert actual_repr == expected_repr
89