22
33import { schemaComposer , InputTypeComposer } from 'graphql-compose' ;
44import {
5- addFieldWithOperators ,
5+ _createOperatorsField ,
6+ addFilterOperators ,
67 processFilterOperators ,
78 OPERATORS_FIELDNAME ,
89} from '../filterOperators' ;
910import { UserModel } from '../../../__mocks__/userModel' ;
1011
11- describe ( 'Resolver helper `filter` ->' , ( ) => {
12- beforeEach ( ( ) => {
13- schemaComposer . clear ( ) ;
14- } ) ;
15-
16- describe ( 'addFieldWithOperators()' , ( ) => {
17- let itc : InputTypeComposer ;
12+ let itc : InputTypeComposer ;
1813
19- beforeEach ( ( ) => {
20- itc = InputTypeComposer . create ( {
21- name : 'UserFilterInput' ,
22- fields : {
23- _id : 'String' ,
24- employment : 'String' ,
25- name : 'String' ,
26- age : 'Int' ,
27- skills : [ 'String' ] ,
28- } ,
29- } ) ;
30- } ) ;
14+ beforeEach ( ( ) => {
15+ schemaComposer . clear ( ) ;
16+ itc = InputTypeComposer . create ( {
17+ name : 'UserFilterInput' ,
18+ fields : {
19+ _id : 'String' ,
20+ employment : 'String' ,
21+ name : 'String' ,
22+ age : 'Int' ,
23+ skills : [ 'String' ] ,
24+ } ,
25+ } ) ;
26+ } ) ;
3127
28+ describe ( 'Resolver helper `filter` ->' , ( ) => {
29+ describe ( '_createOperatorsField()' , ( ) => {
3230 it ( 'should add OPERATORS_FIELDNAME to filterType' , ( ) => {
33- addFieldWithOperators ( itc , 'OperatorsTypeName' , UserModel , { } ) ;
31+ _createOperatorsField ( itc , 'OperatorsTypeName' , UserModel , { } ) ;
3432 expect ( itc . hasField ( OPERATORS_FIELDNAME ) ) . toBe ( true ) ;
3533 expect ( itc . getFieldTC ( OPERATORS_FIELDNAME ) . getTypeName ( ) ) . toBe ( 'OperatorsTypeName' ) ;
3634 } ) ;
3735
3836 it ( 'should by default have only indexed fields' , ( ) => {
39- addFieldWithOperators ( itc , 'OperatorsTypeName' , UserModel , { } ) ;
37+ _createOperatorsField ( itc , 'OperatorsTypeName' , UserModel , { } ) ;
4038 const operatorsTC = itc . getFieldTC ( OPERATORS_FIELDNAME ) ;
4139 expect ( operatorsTC . getFieldNames ( ) ) . toEqual (
4240 expect . arrayContaining ( [ 'name' , '_id' , 'employment' ] )
@@ -45,25 +43,47 @@ describe('Resolver helper `filter` ->', () => {
4543 } ) ;
4644
4745 it ( 'should have only provided fields via options' , ( ) => {
48- addFieldWithOperators ( itc , 'OperatorsTypeName' , UserModel , { age : [ 'lt' ] } ) ;
46+ _createOperatorsField ( itc , 'OperatorsTypeName' , UserModel , { age : [ 'lt' ] } ) ;
4947 const operatorsTC = itc . getFieldTC ( OPERATORS_FIELDNAME ) ;
5048 expect ( operatorsTC . hasField ( 'age' ) ) . toBe ( true ) ;
5149 } ) ;
5250
5351 it ( 'should have only provided operators via options for field' , ( ) => {
54- addFieldWithOperators ( itc , 'OperatorsTypeName' , UserModel , { age : [ 'lt' , 'gte' ] } ) ;
52+ _createOperatorsField ( itc , 'OperatorsTypeName' , UserModel , { age : [ 'lt' , 'gte' ] } ) ;
5553 const operatorsTC = itc . getFieldTC ( OPERATORS_FIELDNAME ) ;
5654 const ageTC = operatorsTC . getFieldTC ( 'age' ) ;
5755 expect ( ageTC . getFieldNames ( ) ) . toEqual ( expect . arrayContaining ( [ 'lt' , 'gte' ] ) ) ;
5856 } ) ;
5957
6058 it ( 'should reuse existed operatorsType' , ( ) => {
6159 const existedITC = itc . constructor . schemaComposer . getOrCreateITC ( 'ExistedType' ) ;
62- addFieldWithOperators ( itc , 'ExistedType' , UserModel , { } ) ;
60+ _createOperatorsField ( itc , 'ExistedType' , UserModel , { } ) ;
6361 expect ( itc . getFieldType ( OPERATORS_FIELDNAME ) ) . toBe ( existedITC . getType ( ) ) ;
6462 } ) ;
6563 } ) ;
6664
65+ describe ( 'addFilterOperators()' , ( ) => {
66+ it ( 'should add OPERATORS_FIELDNAME via _createOperatorsField()' , ( ) => {
67+ addFilterOperators ( itc , UserModel , { } ) ;
68+ expect ( itc . hasField ( OPERATORS_FIELDNAME ) ) . toBe ( true ) ;
69+ expect ( itc . getFieldTC ( OPERATORS_FIELDNAME ) . getTypeName ( ) ) . toBe ( 'Operators' ) ;
70+ } ) ;
71+
72+ it ( 'should add OR field' , ( ) => {
73+ addFilterOperators ( itc , UserModel , { } ) ;
74+ const fields = itc . getFieldNames ( ) ;
75+ expect ( fields ) . toEqual ( expect . arrayContaining ( [ 'OR' , 'name' , 'age' ] ) ) ;
76+ expect ( itc . getFieldTC ( 'OR' ) . getType ( ) ) . toBe ( itc . getType ( ) ) ;
77+ } ) ;
78+
79+ it ( 'should add AND field' , ( ) => {
80+ addFilterOperators ( itc , UserModel , { } ) ;
81+ const fields = itc . getFieldNames ( ) ;
82+ expect ( fields ) . toEqual ( expect . arrayContaining ( [ 'AND' , 'name' , 'age' ] ) ) ;
83+ expect ( itc . getFieldTC ( 'AND' ) . getType ( ) ) . toBe ( itc . getType ( ) ) ;
84+ } ) ;
85+ } ) ;
86+
6787 describe ( 'processFilterOperators()' , ( ) => {
6888 it ( 'should call query.find if args.filter.OPERATORS_FIELDNAME is provided' , ( ) => {
6989 const filter = {
@@ -74,5 +94,94 @@ describe('Resolver helper `filter` ->', () => {
7494 processFilterOperators ( filter , resolveParams ) ;
7595 expect ( spyWhereFn ) . toBeCalledWith ( { age : { $gt : 10 , $lt : 20 } } ) ;
7696 } ) ;
97+
98+ it ( 'should convert OR query' , ( ) => {
99+ const filter = {
100+ OR : [
101+ {
102+ name : {
103+ first : 'Pavel' ,
104+ } ,
105+ age : 30 ,
106+ } ,
107+ {
108+ age : 40 ,
109+ } ,
110+ ] ,
111+ } ;
112+ const spyWhereFn = jest . fn ( ) ;
113+ const resolveParams : any = { query : { where : spyWhereFn } } ;
114+ processFilterOperators ( filter , resolveParams ) ;
115+ expect ( spyWhereFn ) . toBeCalledWith ( {
116+ $or : [
117+ { age : 30 , 'name.first' : 'Pavel' } ,
118+ {
119+ age : 40 ,
120+ } ,
121+ ] ,
122+ } ) ;
123+ } ) ;
124+
125+ it ( 'should convert AND query' , ( ) => {
126+ const filter = {
127+ AND : [
128+ {
129+ name : {
130+ first : 'Pavel' ,
131+ } ,
132+ } ,
133+ {
134+ age : 40 ,
135+ } ,
136+ ] ,
137+ } ;
138+ const spyWhereFn = jest . fn ( ) ;
139+ const resolveParams : any = { query : { where : spyWhereFn } } ;
140+ processFilterOperators ( filter , resolveParams ) ;
141+ expect ( spyWhereFn ) . toBeCalledWith ( {
142+ $and : [
143+ { 'name.first' : 'Pavel' } ,
144+ {
145+ age : 40 ,
146+ } ,
147+ ] ,
148+ } ) ;
149+ } ) ;
150+
151+ it ( 'should convert nested AND/OR query' , ( ) => {
152+ const filter = {
153+ OR : [
154+ {
155+ AND : [
156+ { name : { first : 'Pavel' } } ,
157+ {
158+ OR : [ { age : 30 } , { age : 35 } ] ,
159+ } ,
160+ ] ,
161+ } ,
162+ {
163+ age : 40 ,
164+ } ,
165+ ] ,
166+ } ;
167+ const spyWhereFn = jest . fn ( ) ;
168+ const resolveParams : any = { query : { where : spyWhereFn } } ;
169+ processFilterOperators ( filter , resolveParams ) ;
170+ expect ( spyWhereFn ) . toBeCalledWith ( {
171+ $or : [
172+ {
173+ $and : [
174+ { 'name.first' : 'Pavel' } ,
175+ {
176+ $or : [ { age : 30 } , { age : 35 } ] ,
177+ } ,
178+ ] ,
179+ } ,
180+ {
181+ age : 40 ,
182+ } ,
183+ ] ,
184+ } ) ;
185+ } ) ;
77186 } ) ;
78187} ) ;
0 commit comments