mirror of
https://github.com/yweber/lodel2.git
synced 2025-10-25 18:29:02 +02:00
Adds tests for LeGetQuery + bugfixes
- separates LeGetQuery tests and LeFilteredQuery tests - small bugfixes associated to tests
This commit is contained in:
parent
9781577cb6
commit
bf879a833c
3 changed files with 117 additions and 37 deletions
|
|
@ -195,7 +195,7 @@ class LeFilteredQuery(LeQuery):
|
||||||
field name" % fieldname)
|
field name" % fieldname)
|
||||||
continue
|
continue
|
||||||
# Checking field against target_class
|
# Checking field against target_class
|
||||||
ret = self.__check_field(self._target_class, field)
|
ret = self._check_field(self._target_class, field)
|
||||||
if isinstance(ret, Exception):
|
if isinstance(ret, Exception):
|
||||||
err_l[field] = ret
|
err_l[field] = ret
|
||||||
continue
|
continue
|
||||||
|
|
@ -292,7 +292,7 @@ a relational field, but %s.%s was present in the filter"
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def __check_field(cls, target_class, fieldname):
|
def _check_field(cls, target_class, fieldname):
|
||||||
try:
|
try:
|
||||||
target_class.field(fieldname)
|
target_class.field(fieldname)
|
||||||
except NameError:
|
except NameError:
|
||||||
|
|
@ -463,15 +463,14 @@ class LeGetQuery(LeFilteredQuery):
|
||||||
|
|
||||||
# Checking kwargs and assigning default values if there is some
|
# Checking kwargs and assigning default values if there is some
|
||||||
for argname in kwargs:
|
for argname in kwargs:
|
||||||
if argname not in ('order', 'group', 'limit', 'offset'):
|
if argname not in ('field_list', 'order', 'group', 'limit', 'offset'):
|
||||||
raise TypeError("Unexpected argument '%s'" % argname)
|
raise TypeError("Unexpected argument '%s'" % argname)
|
||||||
|
|
||||||
if 'field_list' not in kwargs:
|
if 'field_list' not in kwargs:
|
||||||
#field_list = target_class.get_field_list
|
self.set_field_list(target_class.fieldnames(include_ro = True))
|
||||||
self.__field_list = target_class.fieldnames(include_ro = True)
|
|
||||||
else:
|
else:
|
||||||
#target_class.check_fields(kwargs['field_list'])
|
self.set_field_list(kwargs['field_list'])
|
||||||
self.__field_list = kwargs['field_list']
|
|
||||||
if 'order' in kwargs:
|
if 'order' in kwargs:
|
||||||
#check kwargs['order']
|
#check kwargs['order']
|
||||||
self.__order = kwargs['order']
|
self.__order = kwargs['order']
|
||||||
|
|
@ -493,6 +492,23 @@ class LeGetQuery(LeFilteredQuery):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise ValueError("offset argument expected to be an integer >= 0")
|
raise ValueError("offset argument expected to be an integer >= 0")
|
||||||
|
|
||||||
|
##@brief Set the field list
|
||||||
|
# @param field_list list | None : If None use all fields
|
||||||
|
# @return None
|
||||||
|
# @throw LeQueryError if unknown field given
|
||||||
|
def set_field_list(self, field_list):
|
||||||
|
err_l = dict()
|
||||||
|
for fieldname in field_list:
|
||||||
|
ret = self._check_field(self._target_class, fieldname)
|
||||||
|
if isinstance(ret, Exception):
|
||||||
|
expt = NameError( "No field named '%s' in %s" % ( fieldname,
|
||||||
|
self._target_class.__name__))
|
||||||
|
err_l[fieldname] = expt
|
||||||
|
if len(err_l) > 0:
|
||||||
|
raise LeQueryError( msg = "Error while setting field_list in a get query",
|
||||||
|
exceptions = err_l)
|
||||||
|
self.__field_list = list(set(field_list))
|
||||||
|
|
||||||
##@brief Execute the get query
|
##@brief Execute the get query
|
||||||
def execute(self, datasource):
|
def execute(self, datasource):
|
||||||
super().execute(datasource)
|
super().execute(datasource)
|
||||||
|
|
|
||||||
|
|
@ -6,36 +6,6 @@ from tests.leapi.query.utils import dyncode_module as dyncode
|
||||||
from lodel.leapi.leobject import LeApiDataCheckError
|
from lodel.leapi.leobject import LeApiDataCheckError
|
||||||
from lodel.leapi.query import LeDeleteQuery, LeUpdateQuery, LeGetQuery
|
from lodel.leapi.query import LeDeleteQuery, LeUpdateQuery, LeGetQuery
|
||||||
|
|
||||||
class LeGetQueryTestCase(unittest.TestCase):
|
|
||||||
|
|
||||||
def test_init_default(self):
|
|
||||||
""" Testing GetQuery instanciation default values"""
|
|
||||||
tclass_list = [ dyncode.Object,
|
|
||||||
dyncode.Entry,
|
|
||||||
dyncode.Person,
|
|
||||||
dyncode.Text,
|
|
||||||
dyncode.Section,
|
|
||||||
dyncode.Publication,
|
|
||||||
dyncode.Text_Person,
|
|
||||||
]
|
|
||||||
for tclass in tclass_list:
|
|
||||||
get_q = LeGetQuery(tclass, [])
|
|
||||||
qinfos = get_q.dump_infos()
|
|
||||||
self.assertEqual( set(qinfos['field_list']),
|
|
||||||
set(tclass.fieldnames(True)))
|
|
||||||
self.assertEqual( qinfos['limit'],
|
|
||||||
None)
|
|
||||||
self.assertEqual( qinfos['offset'],
|
|
||||||
0)
|
|
||||||
self.assertEqual( qinfos['group'],
|
|
||||||
None)
|
|
||||||
self.assertEqual( qinfos['order'],
|
|
||||||
None)
|
|
||||||
self.assertEqual( qinfos['query_filter'],
|
|
||||||
([],[]))
|
|
||||||
self.assertEqual( qinfos['target_class'],
|
|
||||||
tclass)
|
|
||||||
|
|
||||||
class LeFilteredQueryTestCase(unittest.TestCase):
|
class LeFilteredQueryTestCase(unittest.TestCase):
|
||||||
|
|
||||||
q_classes = [ LeDeleteQuery, LeUpdateQuery, LeGetQuery ]
|
q_classes = [ LeDeleteQuery, LeUpdateQuery, LeGetQuery ]
|
||||||
|
|
|
||||||
94
tests/leapi/query/test_get.py
Normal file
94
tests/leapi/query/test_get.py
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
import itertools
|
||||||
|
|
||||||
|
import tests.loader_utils
|
||||||
|
from tests.leapi.query.utils import dyncode_module as dyncode
|
||||||
|
|
||||||
|
from lodel.leapi.leobject import LeApiDataCheckError
|
||||||
|
from lodel.leapi.query import LeDeleteQuery, LeUpdateQuery, LeGetQuery, LeQueryError
|
||||||
|
|
||||||
|
class LeGetQueryTestCase(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_init_default(self):
|
||||||
|
""" Testing GetQuery instanciation arguments default value """
|
||||||
|
tclass_list = [ dyncode.Object,
|
||||||
|
dyncode.Entry,
|
||||||
|
dyncode.Person,
|
||||||
|
dyncode.Text,
|
||||||
|
dyncode.Section,
|
||||||
|
dyncode.Publication,
|
||||||
|
dyncode.Text_Person ]
|
||||||
|
|
||||||
|
for tclass in tclass_list:
|
||||||
|
get_q = LeGetQuery(tclass, [])
|
||||||
|
qinfos = get_q.dump_infos()
|
||||||
|
self.assertEqual( set(qinfos['field_list']),
|
||||||
|
set(tclass.fieldnames(True)))
|
||||||
|
self.assertEqual( qinfos['limit'],
|
||||||
|
None)
|
||||||
|
self.assertEqual( qinfos['offset'],
|
||||||
|
0)
|
||||||
|
self.assertEqual( qinfos['group'],
|
||||||
|
None)
|
||||||
|
self.assertEqual( qinfos['order'],
|
||||||
|
None)
|
||||||
|
self.assertEqual( qinfos['query_filter'],
|
||||||
|
([],[]))
|
||||||
|
self.assertEqual( qinfos['target_class'],
|
||||||
|
tclass)
|
||||||
|
|
||||||
|
def test_field_list(self):
|
||||||
|
""" Testing GetQuery field list argument processing """
|
||||||
|
tclass_list = [ dyncode.Object,
|
||||||
|
dyncode.Entry,
|
||||||
|
dyncode.Person,
|
||||||
|
dyncode.Text,
|
||||||
|
dyncode.Section,
|
||||||
|
dyncode.Publication,
|
||||||
|
dyncode.Text_Person ]
|
||||||
|
|
||||||
|
for tclass in tclass_list:
|
||||||
|
# testing all field list possible combinations
|
||||||
|
field_list = tclass.fieldnames(True)
|
||||||
|
for r in range(1, len(field_list) + 1):
|
||||||
|
combinations = [ list(c) for c in itertools.combinations(field_list, r)]
|
||||||
|
for test_flist in combinations:
|
||||||
|
expected = set(test_flist)
|
||||||
|
get_q = LeGetQuery(tclass, [], field_list = test_flist)
|
||||||
|
qinfos = get_q.dump_infos()
|
||||||
|
self.assertEqual( sorted(qinfos['field_list']),
|
||||||
|
sorted(test_flist))
|
||||||
|
|
||||||
|
def test_field_list_duplicated(self):
|
||||||
|
""" Testing GetQuery field list argument deduplication """
|
||||||
|
tclass_list = [ dyncode.Object,
|
||||||
|
dyncode.Text,
|
||||||
|
dyncode.Section,
|
||||||
|
dyncode.Publication,
|
||||||
|
dyncode.Text_Person ]
|
||||||
|
for tclass in tclass_list:
|
||||||
|
fl = [ 'lodel_id',
|
||||||
|
'lodel_id',
|
||||||
|
'help_text',
|
||||||
|
'help_text',
|
||||||
|
'help_text']
|
||||||
|
get_q = LeGetQuery(tclass, [], field_list = fl)
|
||||||
|
self.assertEqual( sorted(list(set(fl))),
|
||||||
|
sorted(get_q.dump_infos()['field_list']))
|
||||||
|
|
||||||
|
def test_field_list_invalid(self):
|
||||||
|
""" Testing GetQuery invalid field name detection in field list """
|
||||||
|
bad_field_lists = ( ('non-existing',),
|
||||||
|
(1,),
|
||||||
|
(True,),
|
||||||
|
(None,),
|
||||||
|
('lodel_id', 'non-existing',),
|
||||||
|
('lodel_id', 1,),
|
||||||
|
('lodel_id', True,),
|
||||||
|
('lodel_id', None,) )
|
||||||
|
|
||||||
|
for bad_field_list in bad_field_lists:
|
||||||
|
with self.assertRaises(LeQueryError):
|
||||||
|
LeGetQuery(dyncode.Object, [], field_list = bad_field_list)
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue