@@ -15,58 +15,14 @@ import {expect} from 'chai';
15
15
import schema from './fixtures/schema' ;
16
16
17
17
import ComplexityVisitor from '../QueryComplexity' ;
18
+ import {
19
+ simpleEstimator ,
20
+ fieldConfigEstimator ,
21
+ } from '../index' ;
18
22
19
23
describe ( 'QueryComplexity analysis' , ( ) => {
20
24
const typeInfo = new TypeInfo ( schema ) ;
21
25
22
- it ( 'should consider default scalar cost' , ( ) => {
23
- const ast = parse ( `
24
- query {
25
- scalar
26
- }
27
- ` ) ;
28
-
29
- const context = new ValidationContext ( schema , ast , typeInfo ) ;
30
- const visitor = new ComplexityVisitor ( context , {
31
- maximumComplexity : 100
32
- } ) ;
33
-
34
- visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
35
- expect ( visitor . complexity ) . to . equal ( 1 ) ;
36
- } ) ;
37
-
38
- it ( 'should consider custom scalar cost' , ( ) => {
39
- const ast = parse ( `
40
- query {
41
- complexScalar
42
- }
43
- ` ) ;
44
-
45
- const context = new ValidationContext ( schema , ast , typeInfo ) ;
46
- const visitor = new ComplexityVisitor ( context , {
47
- maximumComplexity : 100
48
- } ) ;
49
-
50
- visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
51
- expect ( visitor . complexity ) . to . equal ( 20 ) ;
52
- } ) ;
53
-
54
- it ( 'should consider variable scalar cost' , ( ) => {
55
- const ast = parse ( `
56
- query {
57
- variableScalar(count: 100)
58
- }
59
- ` ) ;
60
-
61
- const context = new ValidationContext ( schema , ast , typeInfo ) ;
62
- const visitor = new ComplexityVisitor ( context , {
63
- maximumComplexity : 100
64
- } ) ;
65
-
66
- visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
67
- expect ( visitor . complexity ) . to . equal ( 1000 ) ;
68
- } ) ;
69
-
70
26
it ( 'should not allow negative cost' , ( ) => {
71
27
const ast = parse ( `
72
28
query {
@@ -76,7 +32,10 @@ describe('QueryComplexity analysis', () => {
76
32
77
33
const context = new ValidationContext ( schema , ast , typeInfo ) ;
78
34
const visitor = new ComplexityVisitor ( context , {
79
- maximumComplexity : 100
35
+ maximumComplexity : 100 ,
36
+ estimators : [
37
+ simpleEstimator ( { defaultComplexity : - 100 } )
38
+ ]
80
39
} ) ;
81
40
82
41
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
@@ -92,7 +51,13 @@ describe('QueryComplexity analysis', () => {
92
51
93
52
const context = new ValidationContext ( schema , ast , typeInfo ) ;
94
53
const visitor = new ComplexityVisitor ( context , {
95
- maximumComplexity : 100
54
+ maximumComplexity : 100 ,
55
+ estimators : [
56
+ fieldConfigEstimator ( ) ,
57
+ simpleEstimator ( {
58
+ defaultComplexity : 1
59
+ } )
60
+ ]
96
61
} ) ;
97
62
98
63
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
@@ -116,7 +81,13 @@ describe('QueryComplexity analysis', () => {
116
81
117
82
const context = new ValidationContext ( schema , ast , typeInfo ) ;
118
83
const visitor = new ComplexityVisitor ( context , {
119
- maximumComplexity : 100
84
+ maximumComplexity : 100 ,
85
+ estimators : [
86
+ fieldConfigEstimator ( ) ,
87
+ simpleEstimator ( {
88
+ defaultComplexity : 1
89
+ } )
90
+ ]
120
91
} ) ;
121
92
122
93
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
@@ -137,7 +108,13 @@ describe('QueryComplexity analysis', () => {
137
108
138
109
const context = new ValidationContext ( schema , ast , typeInfo ) ;
139
110
const visitor = new ComplexityVisitor ( context , {
140
- maximumComplexity : 100
111
+ maximumComplexity : 100 ,
112
+ estimators : [
113
+ fieldConfigEstimator ( ) ,
114
+ simpleEstimator ( {
115
+ defaultComplexity : 1
116
+ } )
117
+ ]
141
118
} ) ;
142
119
143
120
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
@@ -158,7 +135,13 @@ describe('QueryComplexity analysis', () => {
158
135
159
136
const context = new ValidationContext ( schema , ast , typeInfo ) ;
160
137
const visitor = new ComplexityVisitor ( context , {
161
- maximumComplexity : 100
138
+ maximumComplexity : 100 ,
139
+ estimators : [
140
+ fieldConfigEstimator ( ) ,
141
+ simpleEstimator ( {
142
+ defaultComplexity : 1
143
+ } )
144
+ ]
162
145
} ) ;
163
146
164
147
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
@@ -179,7 +162,13 @@ describe('QueryComplexity analysis', () => {
179
162
180
163
const context = new ValidationContext ( schema , ast , typeInfo ) ;
181
164
const visitor = new ComplexityVisitor ( context , {
182
- maximumComplexity : 100
165
+ maximumComplexity : 100 ,
166
+ estimators : [
167
+ fieldConfigEstimator ( ) ,
168
+ simpleEstimator ( {
169
+ defaultComplexity : 1
170
+ } )
171
+ ]
183
172
} ) ;
184
173
185
174
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
@@ -199,7 +188,13 @@ describe('QueryComplexity analysis', () => {
199
188
200
189
const context = new ValidationContext ( schema , ast , typeInfo ) ;
201
190
const visitor = new ComplexityVisitor ( context , {
202
- maximumComplexity : 100
191
+ maximumComplexity : 100 ,
192
+ estimators : [
193
+ fieldConfigEstimator ( ) ,
194
+ simpleEstimator ( {
195
+ defaultComplexity : 1
196
+ } )
197
+ ]
203
198
} ) ;
204
199
205
200
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
@@ -215,25 +210,77 @@ describe('QueryComplexity analysis', () => {
215
210
216
211
const context = new ValidationContext ( schema , ast , typeInfo ) ;
217
212
const visitor = new ComplexityVisitor ( context , {
218
- maximumComplexity : 100
213
+ maximumComplexity : 100 ,
214
+ estimators : [
215
+ fieldConfigEstimator ( ) ,
216
+ simpleEstimator ( {
217
+ defaultComplexity : 1
218
+ } )
219
+ ]
219
220
} ) ;
220
221
221
222
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
222
223
expect ( visitor . complexity ) . to . equal ( 1 ) ;
223
224
} ) ;
224
225
225
- it ( 'should error on a missing non-null argument' , ( ) => {
226
+ it ( 'should report error on a missing non-null argument' , ( ) => {
226
227
const ast = parse ( `
227
228
query {
228
229
requiredArgs
229
230
}
230
231
` ) ;
231
232
const context = new ValidationContext ( schema , ast , typeInfo ) ;
232
233
const visitor = new ComplexityVisitor ( context , {
233
- maximumComplexity : 100
234
+ maximumComplexity : 100 ,
235
+ estimators : [
236
+ fieldConfigEstimator ( ) ,
237
+ simpleEstimator ( {
238
+ defaultComplexity : 1
239
+ } )
240
+ ]
234
241
} ) ;
235
242
visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
236
243
expect ( context . getErrors ( ) . length ) . to . equal ( 1 ) ;
237
244
expect ( context . getErrors ( ) [ 0 ] . message ) . to . equal ( 'Argument "count" of required type "Int!" was not provided.' ) ;
238
245
} ) ;
246
+
247
+ it ( 'should report error when no estimator is configured' , ( ) => {
248
+ const ast = parse ( `
249
+ query {
250
+ scalar
251
+ }
252
+ ` ) ;
253
+ const context = new ValidationContext ( schema , ast , typeInfo ) ;
254
+ const visitor = new ComplexityVisitor ( context , {
255
+ maximumComplexity : 100 ,
256
+ estimators : [ ]
257
+ } ) ;
258
+ visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
259
+ expect ( context . getErrors ( ) . length ) . to . equal ( 1 ) ;
260
+ expect ( context . getErrors ( ) [ 0 ] . message ) . to . equal (
261
+ 'No complexity could be calculated for field undefined.scalar. ' +
262
+ 'At least one complexity estimator has to return a complexity score.'
263
+ ) ;
264
+ } ) ;
265
+
266
+ it ( 'should report error when no estimator returns value' , ( ) => {
267
+ const ast = parse ( `
268
+ query {
269
+ scalar
270
+ }
271
+ ` ) ;
272
+ const context = new ValidationContext ( schema , ast , typeInfo ) ;
273
+ const visitor = new ComplexityVisitor ( context , {
274
+ maximumComplexity : 100 ,
275
+ estimators : [
276
+ fieldConfigEstimator ( )
277
+ ]
278
+ } ) ;
279
+ visit ( ast , visitWithTypeInfo ( typeInfo , visitor ) ) ;
280
+ expect ( context . getErrors ( ) . length ) . to . equal ( 1 ) ;
281
+ expect ( context . getErrors ( ) [ 0 ] . message ) . to . equal (
282
+ 'No complexity could be calculated for field undefined.scalar. ' +
283
+ 'At least one complexity estimator has to return a complexity score.'
284
+ ) ;
285
+ } ) ;
239
286
} ) ;
0 commit comments