@@ -567,6 +567,146 @@ def test_apijson_get():
567
567
>>> print(d)
568
568
{'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}}]}
569
569
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
+
570
710
>>> #Association query: Two tables, one to one,ref path is absolute path
571
711
>>> data ='''{
572
712
... "moment":{},
@@ -580,6 +720,32 @@ def test_apijson_get():
580
720
>>> print(d)
581
721
{'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}}
582
722
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
+
583
749
>>> #Association query: Two tables, one to one,ref path is relative path
584
750
>>> data ='''{
585
751
... "moment":{},