Skip to content

Commit c32aa1d

Browse files
committed
fix expr determination way; remove an unnessary limit(); add 7 test cases
1 parent d960506 commit c32aa1d

File tree

3 files changed

+172
-7
lines changed

3 files changed

+172
-7
lines changed

tests/test.py

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,146 @@ def test_apijson_get():
567567
>>> print(d)
568568
{'code': 200, 'msg': 'success', '[]': [{'user': {'username': 'userc', 'nickname': 'User C', 'email': 'userc@localhost', 'id': 4}}, {'user': {'username': 'userb', 'nickname': 'User B', 'email': 'userb@localhost', 'id': 3}}]}
569569
570+
>>> #query array with @expr, bad param which is not list
571+
>>> data ='''{
572+
... "[]":{
573+
... "@count":4,
574+
... "@page":0,
575+
... "user":{
576+
... "@column":"id,username,nickname,email",
577+
... "@order":"id-",
578+
... "@role":"ADMIN",
579+
... "@expr":{},
580+
... "username$":"%b%",
581+
... "nickname$":"%c%"
582+
... }
583+
... }
584+
... }'''
585+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
586+
>>> d = json_loads(r.data)
587+
>>> print(d)
588+
{'code': 400, 'msg': "only accept array in @expr, but get 'OrderedDict()'"}
589+
590+
>>> #query array with @expr, bad param which is an empty list
591+
>>> data ='''{
592+
... "[]":{
593+
... "@count":4,
594+
... "@page":0,
595+
... "user":{
596+
... "@column":"id,username,nickname,email",
597+
... "@order":"id-",
598+
... "@role":"ADMIN",
599+
... "@expr":[],
600+
... "username$":"%b%",
601+
... "nickname$":"%c%"
602+
... }
603+
... }
604+
... }'''
605+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
606+
>>> d = json_loads(r.data)
607+
>>> print(d)
608+
{'code': 400, 'msg': "only accept 2 or 3 items in @expr, but get '[]'"}
609+
610+
>>> #query array with @expr, bad param which is >3 items list
611+
>>> data ='''{
612+
... "[]":{
613+
... "@count":4,
614+
... "@page":0,
615+
... "user":{
616+
... "@column":"id,username,nickname,email",
617+
... "@order":"id-",
618+
... "@role":"ADMIN",
619+
... "@expr":["username$","|","username$","|","nickname$"],
620+
... "username$":"%b%",
621+
... "nickname$":"%c%"
622+
... }
623+
... }
624+
... }'''
625+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
626+
>>> d = json_loads(r.data)
627+
>>> print(d)
628+
{'code': 400, 'msg': "only accept 2 or 3 items in @expr, but get '['username$', '|', 'username$', '|', 'nickname$']'"}
629+
630+
>>> #query array with @expr, bad param which have bad operator
631+
>>> data ='''{
632+
... "[]":{
633+
... "@count":4,
634+
... "@page":0,
635+
... "user":{
636+
... "@column":"id,username,nickname,email",
637+
... "@order":"id-",
638+
... "@role":"ADMIN",
639+
... "@expr":["username$","*","nickname$"],
640+
... "username$":"%b%",
641+
... "nickname$":"%c%"
642+
... }
643+
... }
644+
... }'''
645+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
646+
>>> d = json_loads(r.data)
647+
>>> print(d)
648+
{'code': 400, 'msg': "unknown operator: '*'"}
649+
650+
>>> #query array with @expr, bad expr: & only 1 parameter
651+
>>> data ='''{
652+
... "[]":{
653+
... "@count":4,
654+
... "@page":0,
655+
... "user":{
656+
... "@column":"id,username,nickname,email",
657+
... "@order":"id-",
658+
... "@role":"ADMIN",
659+
... "@expr":["&","nickname$"],
660+
... "username$":"%b%",
661+
... "nickname$":"%c%"
662+
... }
663+
... }
664+
... }'''
665+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
666+
>>> d = json_loads(r.data)
667+
>>> print(d)
668+
{'code': 400, 'msg': "'&'(and) expression need 3 items, but get '['&', 'nickname$']'"}
669+
670+
>>> #query array with @expr, bad expr: | only 1 parameter
671+
>>> data ='''{
672+
... "[]":{
673+
... "@count":4,
674+
... "@page":0,
675+
... "user":{
676+
... "@column":"id,username,nickname,email",
677+
... "@order":"id-",
678+
... "@role":"ADMIN",
679+
... "@expr":["|","nickname$"],
680+
... "username$":"%b%",
681+
... "nickname$":"%c%"
682+
... }
683+
... }
684+
... }'''
685+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
686+
>>> d = json_loads(r.data)
687+
>>> print(d)
688+
{'code': 400, 'msg': "'|'(or) expression need 3 items, but get '['|', 'nickname$']'"}
689+
690+
>>> #query array with @expr, bad expr: | only 1 parameter
691+
>>> data ='''{
692+
... "[]":{
693+
... "@count":4,
694+
... "@page":0,
695+
... "user":{
696+
... "@column":"id,username,nickname,email",
697+
... "@order":"id-",
698+
... "@role":"ADMIN",
699+
... "@expr":["username$","!","nickname$"],
700+
... "username$":"%b%",
701+
... "nickname$":"%c%"
702+
... }
703+
... }
704+
... }'''
705+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
706+
>>> d = json_loads(r.data)
707+
>>> print(d)
708+
{'code': 400, 'msg': "'!'(not) expression need 2 items, but get '['username$', '!', 'nickname$']'"}
709+
570710
>>> #Association query: Two tables, one to one,ref path is absolute path
571711
>>> data ='''{
572712
... "moment":{},
@@ -580,6 +720,32 @@ def test_apijson_get():
580720
>>> print(d)
581721
{'code': 200, 'msg': 'success', 'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}, 'user': {'username': 'usera', 'email': 'usera@localhost', 'id': 2}}
582722
723+
>>> #Association query: Two tables, one is array, one is single, there is a abs reference to array
724+
>>> data ='''{
725+
... "moment[]":{"moment":{"@count":3}},
726+
... "user":{
727+
... "@column": "id,username,email",
728+
... "id@": "moment[]/1/moment/user_id"
729+
... }
730+
... }'''
731+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
732+
>>> d = json_loads(r.data)
733+
>>> print(d)
734+
{'code': 200, 'msg': 'success', 'moment[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}], 'user': {'username': 'userb', 'email': 'userb@localhost', 'id': 3}}
735+
736+
>>> #Association query: Two tables, one is array, one is single, there is a rel reference to array
737+
>>> data ='''{
738+
... "moment[]":{"moment":{"@count":3}},
739+
... "user":{
740+
... "@column": "id,username,email",
741+
... "id@": "/moment[]/1/moment/user_id"
742+
... }
743+
... }'''
744+
>>> r = handler.post('/apijson/get', data=data, pre_call=pre_call_as("admin"), middlewares=[])
745+
>>> d = json_loads(r.data)
746+
>>> print(d)
747+
{'code': 200, 'msg': 'success', 'moment[]': [{'moment': {'user_id': 2, 'date': '2018-11-01 00:00:00', 'content': 'test moment', 'picture_list': '[]', 'id': 1}}, {'moment': {'user_id': 3, 'date': '2018-11-02 00:00:00', 'content': 'test moment from b', 'picture_list': '[]', 'id': 2}}, {'moment': {'user_id': 4, 'date': '2018-11-06 00:00:00', 'content': 'test moment from c', 'picture_list': '[]', 'id': 3}}], 'user': {'username': 'userb', 'email': 'userb@localhost', 'id': 3}}
748+
583749
>>> #Association query: Two tables, one to one,ref path is relative path
584750
>>> data ='''{
585751
... "moment":{},

uliweb_apijson/apijson/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def _get_array_q(self,params):
163163

164164
#@expr
165165
model_expr = params.get("@expr")
166-
if model_expr:
166+
if model_expr!=None:
167167
c = self.parent._expr(self.model,params,model_expr)
168168
q = q.filter(c)
169169
else:
@@ -258,5 +258,4 @@ def associated_query_array(self):
258258
del params[i]
259259
params.update(refs)
260260
q = self._get_array_q(params)
261-
q = q.limit(1)
262261
item[self.name] = self._get_info(q.one())

uliweb_apijson/apijson/views.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,26 +200,26 @@ def _filter_owner(self,model,model_setting,q):
200200

201201
def _expr(self,model,model_param,model_expr):
202202
if not isinstance(model_expr,list):
203-
raise UliwebError("only accept array in @expr: '%s'"%(model_expr))
203+
raise UliwebError("only accept array in @expr, but get '%s'"%(model_expr))
204204
num = len(model_expr)
205205
if (num<2 or num>3):
206-
raise UliwebError("only accept 2 or 3 items in @expr: '%s'"%(model_expr))
206+
raise UliwebError("only accept 2 or 3 items in @expr, but get '%s'"%(model_expr))
207207
op = model_expr[-2]
208208
if op=='&':
209209
if num!=3:
210-
raise UliwebError("'&'(and) expression need 3 items: '%s'"%(model_expr))
210+
raise UliwebError("'&'(and) expression need 3 items, but get '%s'"%(model_expr))
211211
c1 = self._get_filter_condition(model,model_param,model_expr[0],expr=True)
212212
c2 = self._get_filter_condition(model,model_param,model_expr[2],expr=True)
213213
return and_(c1,c2)
214214
elif op=='|':
215215
if num!=3:
216-
raise UliwebError("'|'(or) expression need 3 items: '%s'"%(model_expr))
216+
raise UliwebError("'|'(or) expression need 3 items, but get '%s'"%(model_expr))
217217
c1 = self._get_filter_condition(model,model_param,model_expr[0],expr=True)
218218
c2 = self._get_filter_condition(model,model_param,model_expr[2],expr=True)
219219
return or_(c1,c2)
220220
elif op=='!':
221221
if num!=2:
222-
raise UliwebError("'!'(not) expression need 2 items: '%s'"%(model_expr))
222+
raise UliwebError("'!'(not) expression need 2 items, but get '%s'"%(model_expr))
223223
return not_(self._get_filter_condition(model,model_param,model_expr[1],expr=True))
224224
else:
225225
raise UliwebError("unknown operator: '%s'"%(op))

0 commit comments

Comments
 (0)