55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
import sqlalchemy as sa
|
|
from sqlalchemy_utils import MetaType, MetaValue
|
|
from tests import TestCase
|
|
|
|
|
|
class TestMetaModel(TestCase):
|
|
def create_models(self):
|
|
class Question(self.Base):
|
|
__tablename__ = 'question'
|
|
id = sa.Column(sa.Integer, primary_key=True)
|
|
data_type = sa.Column(
|
|
MetaType({
|
|
'str': sa.String,
|
|
'unicode': sa.UnicodeText,
|
|
'int': sa.Integer,
|
|
'datetime': sa.DateTime
|
|
})
|
|
)
|
|
|
|
class Answer(self.Base):
|
|
__tablename__ = 'answer'
|
|
id = sa.Column(sa.Integer, primary_key=True)
|
|
value = MetaValue('question', 'data_type')
|
|
|
|
question_id = sa.Column(sa.Integer, sa.ForeignKey(Question.id))
|
|
question = sa.orm.relationship(Question)
|
|
|
|
self.Question = Question
|
|
self.Answer = Answer
|
|
|
|
def test_meta_type_conversion(self):
|
|
question = self.Question(data_type=sa.String(200))
|
|
self.session.add(question)
|
|
self.session.commit()
|
|
|
|
self.session.refresh(question)
|
|
assert question.data_type.__name__ == 'String'
|
|
|
|
def test_auto_generates_meta_value_columns(self):
|
|
assert hasattr(self.Answer, 'value_str')
|
|
assert hasattr(self.Answer, 'value_int')
|
|
assert hasattr(self.Answer, 'value_datetime')
|
|
|
|
def test_meta_value_setting(self):
|
|
question = self.Question(data_type=sa.String)
|
|
answer = self.Answer(question=question)
|
|
answer.value = 'some answer'
|
|
assert answer.value == answer.value_str
|
|
|
|
def test_meta_value_as_expression(self):
|
|
assert str(self.Answer.value) == (
|
|
'coalesce(answer.value_int, answer.value_unicode'
|
|
', answer.value_str, answer.value_datetime)'
|
|
)
|