jsonalchemy: add tests for using the json types in an sqlalchemy

context and make sure that the values returned are correctly
returned and stored in the database
This commit is contained in:
Daniel Dourvaris 2016-09-28 06:37:50 +03:00
parent 0e71efebfd
commit f10e21cde9

View file

@ -21,7 +21,22 @@
import pickle
import pytest
from rhodecode.lib.jsonalchemy import MutationDict, MutationList
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from rhodecode.lib.jsonalchemy import (
MutationDict, MutationList, MutationObj, JsonType)
@pytest.fixture
def engine():
return create_engine('sqlite://')
@pytest.fixture
def session(engine):
return sessionmaker(bind=engine)()
def test_mutation_dict_is_picklable():
@ -30,12 +45,14 @@ def test_mutation_dict_is_picklable():
loaded = pickle.loads(dumped)
assert loaded == mutation_dict
def test_mutation_list_is_picklable():
mutation_list = MutationList(['a', 'b', 'c'])
dumped = pickle.dumps(mutation_list)
loaded = pickle.loads(dumped)
assert loaded == mutation_list
def test_mutation_dict_with_lists_is_picklable():
mutation_dict = MutationDict({
'key': MutationList(['values', MutationDict({'key': 'value'})])
@ -43,3 +60,48 @@ def test_mutation_dict_with_lists_is_picklable():
dumped = pickle.dumps(mutation_dict)
loaded = pickle.loads(dumped)
assert loaded == mutation_dict
def test_mutation_types_with_nullable(engine, session):
# TODO: dan: ideally want to make this parametrized python => sql tests eg:
# (MutationObj, 5) => '5'
# (MutationObj, {'a': 5}) => '{"a": 5}'
# (MutationObj, None) => 'null' <- think about if None is 'null' or NULL
Base = declarative_base()
class DummyModel(Base):
__tablename__ = 'some_table'
name = Column(String, primary_key=True)
json_list = Column(MutationList.as_mutable(JsonType('list')))
json_dict = Column(MutationDict.as_mutable(JsonType('dict')))
json_obj = Column(MutationObj.as_mutable(JsonType()))
Base.metadata.create_all(engine)
obj_nulls = DummyModel(name='nulls')
obj_stuff = DummyModel(
name='stuff', json_list=[1,2,3], json_dict={'a': 5}, json_obj=9)
session.add(obj_nulls)
session.add(obj_stuff)
session.commit()
session.expire_all()
assert engine.execute(
"select * from some_table where name = 'nulls';").first() == (
(u'nulls', None, None, None)
)
ret_nulls = session.query(DummyModel).get('nulls')
assert ret_nulls.json_list == []
assert ret_nulls.json_dict == {}
assert ret_nulls.json_obj is None
assert engine.execute(
"select * from some_table where name = 'stuff';").first() == (
(u'stuff', u'[1, 2, 3]', u'{"a": 5}', u'9')
)
ret_stuff = session.query(DummyModel).get('stuff')
assert ret_stuff.json_list == [1, 2, 3]
assert ret_stuff.json_dict == {'a': 5}
assert ret_stuff.json_obj == 9