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