File: test_make_order_by_deterministic.py

package info (click to toggle)
python-sqlalchemy-utils 0.41.2-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 1,252 kB
  • sloc: python: 13,566; makefile: 141
file content (106 lines) | stat: -rw-r--r-- 3,622 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import pytest
import sqlalchemy as sa
import sqlalchemy.orm

from sqlalchemy_utils.compat import _select_args
from sqlalchemy_utils.functions.sort_query import make_order_by_deterministic

from .. import assert_contains


@pytest.fixture
def Article(Base):
    class Article(Base):
        __tablename__ = 'article'
        id = sa.Column(sa.Integer, primary_key=True)
        author_id = sa.Column(sa.Integer, sa.ForeignKey('user.id'))
        author = sa.orm.relationship('User')
    return Article


@pytest.fixture
def User(Base, Article):
    class User(Base):
        __tablename__ = 'user'
        id = sa.Column(sa.Integer, primary_key=True)
        name = sa.Column(sa.Unicode)
        email = sa.Column(sa.Unicode, unique=True)

        email_lower = sa.orm.column_property(
            sa.func.lower(name)
        )

    User.article_count = sa.orm.column_property(
        sa.select(*_select_args(sa.func.count()))
        .select_from(Article)
        .where(Article.author_id == User.id)
        .label('article_count')
    )
    return User


@pytest.fixture
def init_models(Article, User):
    pass


class TestMakeOrderByDeterministic:

    def test_column_property(self, session, User):
        query = session.query(User).order_by(User.email_lower)
        query = make_order_by_deterministic(query)
        assert_contains('lower(user.name) AS lower_1', query)
        assert_contains('lower_1, user.id ASC', query)

    def test_unique_column(self, session, User):
        query = session.query(User).order_by(User.email)
        query = make_order_by_deterministic(query)

        assert str(query).endswith('ORDER BY user.email')

    def test_non_unique_column(self, session, User):
        query = session.query(User).order_by(User.name)
        query = make_order_by_deterministic(query)
        assert_contains('ORDER BY user.name, user.id ASC', query)

    def test_descending_order_by(self, session, User):
        query = session.query(User).order_by(
            sa.desc(User.name)
        )
        query = make_order_by_deterministic(query)
        assert_contains('ORDER BY user.name DESC, user.id DESC', query)

    def test_ascending_order_by(self, session, User):
        query = session.query(User).order_by(
            sa.asc(User.name)
        )
        query = make_order_by_deterministic(query)
        assert_contains('ORDER BY user.name ASC, user.id ASC', query)

    def test_string_order_by(self, session, User):
        query = session.query(User).order_by('name')
        query = make_order_by_deterministic(query)
        assert_contains('ORDER BY user.name, user.id ASC', query)

    def test_annotated_label(self, session, User):
        query = session.query(User).order_by(User.article_count)
        query = make_order_by_deterministic(query)
        assert_contains('article_count, user.id ASC', query)

    def test_annotated_label_with_descending_order(self, session, User):
        query = session.query(User).order_by(
            sa.desc(User.article_count)
        )
        query = make_order_by_deterministic(query)
        assert_contains('ORDER BY article_count DESC, user.id DESC', query)

    def test_query_without_order_by(self, session, User):
        query = session.query(User)
        query = make_order_by_deterministic(query)
        assert 'ORDER BY user.id' in str(query)

    def test_alias(self, session, User):
        alias = sa.orm.aliased(User.__table__)
        query = session.query(alias).order_by(alias.c.name)
        query = make_order_by_deterministic(query)
        assert str(query).endswith('ORDER BY user_1.name, user.id ASC')