@@ -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":{},
0 commit comments