7
7
* of patent rights can be found in the PATENTS file in the same directory.
8
8
*/
9
9
10
+ import { expect } from 'chai' ;
10
11
import { describe , it } from 'mocha' ;
11
12
import { expectPassesRule , expectFailsRule } from './harness' ;
12
13
import {
@@ -15,9 +16,9 @@ import {
15
16
} from '../rules/FieldsOnCorrectType' ;
16
17
17
18
18
- function undefinedField ( field , type , line , column ) {
19
+ function undefinedField ( field , type , suggestions , line , column ) {
19
20
return {
20
- message : undefinedFieldMessage ( field , type ) ,
21
+ message : undefinedFieldMessage ( field , type , suggestions ) ,
21
22
locations : [ { line, column } ] ,
22
23
} ;
23
24
}
@@ -84,8 +85,8 @@ describe('Validate: Fields on correct type', () => {
84
85
}
85
86
}
86
87
}` ,
87
- [ undefinedField ( 'unknown_pet_field' , 'Pet' , 3 , 9 ) ,
88
- undefinedField ( 'unknown_cat_field' , 'Cat' , 5 , 13 ) ]
88
+ [ undefinedField ( 'unknown_pet_field' , 'Pet' , [ ] , 3 , 9 ) ,
89
+ undefinedField ( 'unknown_cat_field' , 'Cat' , [ ] , 5 , 13 ) ]
89
90
) ;
90
91
} ) ;
91
92
@@ -94,7 +95,7 @@ describe('Validate: Fields on correct type', () => {
94
95
fragment fieldNotDefined on Dog {
95
96
meowVolume
96
97
}` ,
97
- [ undefinedField ( 'meowVolume' , 'Dog' , 3 , 9 ) ]
98
+ [ undefinedField ( 'meowVolume' , 'Dog' , [ ] , 3 , 9 ) ]
98
99
) ;
99
100
} ) ;
100
101
@@ -105,7 +106,7 @@ describe('Validate: Fields on correct type', () => {
105
106
deeper_unknown_field
106
107
}
107
108
}` ,
108
- [ undefinedField ( 'unknown_field' , 'Dog' , 3 , 9 ) ]
109
+ [ undefinedField ( 'unknown_field' , 'Dog' , [ ] , 3 , 9 ) ]
109
110
) ;
110
111
} ) ;
111
112
@@ -116,7 +117,7 @@ describe('Validate: Fields on correct type', () => {
116
117
unknown_field
117
118
}
118
119
}` ,
119
- [ undefinedField ( 'unknown_field' , 'Pet' , 4 , 11 ) ]
120
+ [ undefinedField ( 'unknown_field' , 'Pet' , [ ] , 4 , 11 ) ]
120
121
) ;
121
122
} ) ;
122
123
@@ -127,7 +128,7 @@ describe('Validate: Fields on correct type', () => {
127
128
meowVolume
128
129
}
129
130
}` ,
130
- [ undefinedField ( 'meowVolume' , 'Dog' , 4 , 11 ) ]
131
+ [ undefinedField ( 'meowVolume' , 'Dog' , [ ] , 4 , 11 ) ]
131
132
) ;
132
133
} ) ;
133
134
@@ -136,7 +137,7 @@ describe('Validate: Fields on correct type', () => {
136
137
fragment aliasedFieldTargetNotDefined on Dog {
137
138
volume : mooVolume
138
139
}` ,
139
- [ undefinedField ( 'mooVolume' , 'Dog' , 3 , 9 ) ]
140
+ [ undefinedField ( 'mooVolume' , 'Dog' , [ ] , 3 , 9 ) ]
140
141
) ;
141
142
} ) ;
142
143
@@ -145,7 +146,7 @@ describe('Validate: Fields on correct type', () => {
145
146
fragment aliasedLyingFieldTargetNotDefined on Dog {
146
147
barkVolume : kawVolume
147
148
}` ,
148
- [ undefinedField ( 'kawVolume' , 'Dog' , 3 , 9 ) ]
149
+ [ undefinedField ( 'kawVolume' , 'Dog' , [ ] , 3 , 9 ) ]
149
150
) ;
150
151
} ) ;
151
152
@@ -154,16 +155,16 @@ describe('Validate: Fields on correct type', () => {
154
155
fragment notDefinedOnInterface on Pet {
155
156
tailLength
156
157
}` ,
157
- [ undefinedField ( 'tailLength' , 'Pet' , 3 , 9 ) ]
158
+ [ undefinedField ( 'tailLength' , 'Pet' , [ ] , 3 , 9 ) ]
158
159
) ;
159
160
} ) ;
160
161
161
- it ( 'Defined on implmentors but not on interface' , ( ) => {
162
+ it ( 'Defined on implementors but not on interface' , ( ) => {
162
163
expectFailsRule ( FieldsOnCorrectType , `
163
164
fragment definedOnImplementorsButNotInterface on Pet {
164
165
nickname
165
166
}` ,
166
- [ undefinedField ( 'nickname' , 'Pet' , 3 , 9 ) ]
167
+ [ undefinedField ( 'nickname' , 'Pet' , [ 'Cat' , 'Dog' ] , 3 , 9 ) ]
167
168
) ;
168
169
} ) ;
169
170
@@ -180,7 +181,7 @@ describe('Validate: Fields on correct type', () => {
180
181
fragment directFieldSelectionOnUnion on CatOrDog {
181
182
directField
182
183
}` ,
183
- [ undefinedField ( 'directField' , 'CatOrDog' , 3 , 9 ) ]
184
+ [ undefinedField ( 'directField' , 'CatOrDog' , [ ] , 3 , 9 ) ]
184
185
) ;
185
186
} ) ;
186
187
@@ -189,7 +190,15 @@ describe('Validate: Fields on correct type', () => {
189
190
fragment definedOnImplementorsQueriedOnUnion on CatOrDog {
190
191
name
191
192
}` ,
192
- [ undefinedField ( 'name' , 'CatOrDog' , 3 , 9 ) ]
193
+ [
194
+ undefinedField (
195
+ 'name' ,
196
+ 'CatOrDog' ,
197
+ [ 'Being' , 'Pet' , 'Canine' , 'Cat' , 'Dog' ] ,
198
+ 3 ,
199
+ 9
200
+ )
201
+ ]
193
202
) ;
194
203
} ) ;
195
204
@@ -206,4 +215,29 @@ describe('Validate: Fields on correct type', () => {
206
215
` ) ;
207
216
} ) ;
208
217
218
+ describe ( 'Fields on correct type error message' , ( ) => {
219
+ it ( 'Works with no suggestions' , ( ) => {
220
+ expect (
221
+ undefinedFieldMessage ( 'T' , 'f' , [ ] )
222
+ ) . to . equal ( 'Cannot query field "T" on type "f".' ) ;
223
+ } ) ;
224
+
225
+ it ( 'Works with no small numbers of suggestions' , ( ) => {
226
+ expect (
227
+ undefinedFieldMessage ( 'T' , 'f' , [ 'A' , 'B' ] )
228
+ ) . to . equal ( 'Cannot query field "T" on type "f". ' +
229
+ 'However, this field exists on "A", "B". ' +
230
+ 'Perhaps you meant to use an inline fragment?' ) ;
231
+ } ) ;
232
+
233
+ it ( 'Works with lots of suggestions' , ( ) => {
234
+ expect (
235
+ undefinedFieldMessage ( 'T' , 'f' , [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ] )
236
+ ) . to . equal ( 'Cannot query field "T" on type "f". ' +
237
+ 'However, this field exists on "A", "B", "C", "D", "E", ' +
238
+ 'and 1 other types. ' +
239
+ 'Perhaps you meant to use an inline fragment?' ) ;
240
+ } ) ;
241
+ } ) ;
209
242
} ) ;
243
+
0 commit comments