File: test_translation_hybrid.py

package info (click to toggle)
python-sqlalchemy-utils 0.30.12-2~bpo8%2B1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-backports
  • size: 1,056 kB
  • sloc: python: 10,350; makefile: 160
file content (107 lines) | stat: -rw-r--r-- 3,564 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
107
import sqlalchemy as sa
from flexmock import flexmock
from pytest import mark
from sqlalchemy.dialects.postgresql import HSTORE

from sqlalchemy_utils import i18n, TranslationHybrid  # noqa
from tests import TestCase


@mark.skipif('i18n.babel is None')
class TestTranslationHybrid(TestCase):
    dns = 'postgres://postgres@localhost/sqlalchemy_utils_test'

    def create_models(self):
        class City(self.Base):
            __tablename__ = 'city'
            id = sa.Column(sa.Integer, primary_key=True)
            name_translations = sa.Column(HSTORE)
            name = self.translation_hybrid(name_translations)
            locale = 'en'

        self.City = City

    def setup_method(self, method):
        self.translation_hybrid = TranslationHybrid('fi', 'en')
        TestCase.setup_method(self, method)

    def test_using_hybrid_as_constructor(self):
        city = self.City(name='Helsinki')
        assert city.name_translations['fi'] == 'Helsinki'

    def test_if_no_translation_exists_returns_none(self):
        city = self.City()
        assert city.name is None

    def test_custom_default_value(self):
        self.translation_hybrid.default_value = 'Some value'
        city = self.City()
        assert city.name is 'Some value'

    def test_fall_back_to_default_translation(self):
        city = self.City(name_translations={'en': 'Helsinki'})
        self.translation_hybrid.current_locale = 'sv'
        assert city.name == 'Helsinki'

    def test_fallback_to_dynamic_locale(self):
        self.translation_hybrid.current_locale = 'en'
        self.translation_hybrid.default_locale = lambda self: self.locale
        city = self.City(name_translations={})
        city.locale = 'fi'
        city.name_translations['fi'] = 'Helsinki'

        assert city.name == 'Helsinki'

    @mark.parametrize(
        ('name_translations', 'name'),
        (
            ({'fi': 'Helsinki', 'en': 'Helsing'}, 'Helsinki'),
            ({'en': 'Helsinki'}, 'Helsinki'),
            ({'fi': 'Helsinki'}, 'Helsinki'),
            ({}, None),
        )
    )
    def test_hybrid_as_an_expression(self, name_translations, name):
        city = self.City(name_translations=name_translations)
        self.session.add(city)
        self.session.commit()

        assert self.session.query(self.City.name).scalar() == name

    def test_dynamic_locale(self):
        translation_hybrid = TranslationHybrid(
            lambda obj: obj.locale,
            'fi'
        )

        class Article(self.Base):
            __tablename__ = 'article'
            id = sa.Column(sa.Integer, primary_key=True)
            name_translations = sa.Column(HSTORE)
            name = translation_hybrid(name_translations)
            locale = sa.Column(sa.String)

        assert (
            'coalesce(article.name_translations -> article.locale'
            in str(Article.name)
        )

    def test_locales_casted_only_in_compilation_phase(self):
        class LocaleGetter(object):
            def current_locale(self):
                return lambda obj: obj.locale

        flexmock(LocaleGetter).should_receive('current_locale').never()
        translation_hybrid = TranslationHybrid(
            LocaleGetter().current_locale,
            'fi'
        )

        class Article(self.Base):
            __tablename__ = 'article'
            id = sa.Column(sa.Integer, primary_key=True)
            name_translations = sa.Column(HSTORE)
            name = translation_hybrid(name_translations)
            locale = sa.Column(sa.String)

        Article.name