]>
Commit | Line | Data |
---|---|---|
eb39fafa DC |
1 | /** |
2 | * @fileoverview Tests for no-restricted-properties rule. | |
3 | * @author Will Klein & Eli White | |
4 | */ | |
5 | ||
6 | "use strict"; | |
7 | ||
8 | //------------------------------------------------------------------------------ | |
9 | // Requirements | |
10 | //------------------------------------------------------------------------------ | |
11 | ||
12 | const rule = require("../../../lib/rules/no-restricted-properties"), | |
13 | { RuleTester } = require("../../../lib/rule-tester"); | |
14 | ||
15 | //------------------------------------------------------------------------------ | |
16 | // Tests | |
17 | //------------------------------------------------------------------------------ | |
18 | ||
19 | const ruleTester = new RuleTester(); | |
20 | ||
21 | ruleTester.run("no-restricted-properties", rule, { | |
22 | valid: [ | |
23 | { | |
24 | code: "someObject.someProperty", | |
25 | options: [{ | |
26 | object: "someObject", | |
27 | property: "disallowedProperty" | |
28 | }] | |
29 | }, { | |
30 | code: "anotherObject.disallowedProperty", | |
31 | options: [{ | |
32 | object: "someObject", | |
33 | property: "disallowedProperty" | |
34 | }] | |
35 | }, { | |
36 | code: "someObject.someProperty()", | |
37 | options: [{ | |
38 | object: "someObject", | |
39 | property: "disallowedProperty" | |
40 | }] | |
41 | }, { | |
42 | code: "anotherObject.disallowedProperty()", | |
43 | options: [{ | |
44 | object: "someObject", | |
45 | property: "disallowedProperty" | |
46 | }] | |
47 | }, { | |
48 | code: "anotherObject.disallowedProperty()", | |
49 | options: [{ | |
50 | object: "someObject", | |
51 | property: "disallowedProperty", | |
52 | message: "Please use someObject.allowedProperty instead." | |
53 | }] | |
54 | }, { | |
55 | code: "anotherObject['disallowedProperty']()", | |
56 | options: [{ | |
57 | object: "someObject", | |
58 | property: "disallowedProperty" | |
59 | }] | |
60 | }, { | |
61 | code: "obj.toString", | |
62 | options: [{ | |
63 | object: "obj", | |
64 | property: "__proto__" | |
65 | }] | |
66 | }, { | |
67 | code: "toString.toString", | |
68 | options: [{ | |
69 | object: "obj", | |
70 | property: "foo" | |
71 | }] | |
72 | }, { | |
73 | code: "obj.toString", | |
74 | options: [{ | |
75 | object: "obj", | |
76 | property: "foo" | |
77 | }] | |
78 | }, { | |
79 | code: "foo.bar", | |
80 | options: [{ | |
81 | property: "baz" | |
82 | }] | |
83 | }, { | |
84 | code: "foo.bar", | |
85 | options: [{ | |
86 | object: "baz" | |
87 | }] | |
88 | }, { | |
89 | code: "foo()", | |
90 | options: [{ | |
91 | object: "foo" | |
92 | }] | |
93 | }, { | |
94 | code: "foo;", | |
95 | options: [{ | |
96 | object: "foo" | |
97 | }] | |
98 | }, { | |
99 | code: "foo[/(?<zero>0)/]", | |
100 | options: [{ | |
101 | property: "null" | |
102 | }], | |
103 | parserOptions: { ecmaVersion: 2018 } | |
104 | }, { | |
105 | code: "let bar = foo;", | |
106 | options: [{ object: "foo", property: "bar" }], | |
107 | parserOptions: { ecmaVersion: 6 } | |
108 | }, { | |
109 | code: "let {baz: bar} = foo;", | |
110 | options: [{ object: "foo", property: "bar" }], | |
111 | parserOptions: { ecmaVersion: 6 } | |
112 | }, { | |
113 | code: "let {unrelated} = foo;", | |
114 | options: [{ object: "foo", property: "bar" }], | |
115 | parserOptions: { ecmaVersion: 6 } | |
116 | }, { | |
117 | code: "let {baz: {bar: qux}} = foo;", | |
118 | options: [{ object: "foo", property: "bar" }], | |
119 | parserOptions: { ecmaVersion: 6 } | |
120 | }, { | |
121 | code: "let {bar} = foo.baz;", | |
122 | options: [{ object: "foo", property: "bar" }], | |
123 | parserOptions: { ecmaVersion: 6 } | |
124 | }, { | |
125 | code: "let {baz: bar} = foo;", | |
126 | options: [{ property: "bar" }], | |
127 | parserOptions: { ecmaVersion: 6 } | |
128 | }, { | |
129 | code: "let baz; ({baz: bar} = foo)", | |
130 | options: [{ object: "foo", property: "bar" }], | |
131 | parserOptions: { ecmaVersion: 6 } | |
132 | }, { | |
133 | code: "let bar;", | |
134 | options: [{ object: "foo", property: "bar" }], | |
135 | parserOptions: { ecmaVersion: 6 } | |
136 | }, { | |
137 | code: "let bar; ([bar = 5] = foo);", | |
138 | options: [{ object: "foo", property: "1" }], | |
139 | parserOptions: { ecmaVersion: 6 } | |
140 | }, { | |
141 | code: "function qux({baz: bar} = foo) {}", | |
142 | options: [{ object: "foo", property: "bar" }], | |
143 | parserOptions: { ecmaVersion: 6 } | |
144 | }, { | |
145 | code: "let [bar, baz] = foo;", | |
146 | options: [{ object: "foo", property: "1" }], | |
147 | parserOptions: { ecmaVersion: 6 } | |
148 | }, { | |
149 | code: "let [, bar] = foo;", | |
150 | options: [{ object: "foo", property: "0" }], | |
151 | parserOptions: { ecmaVersion: 6 } | |
152 | }, { | |
153 | code: "let [, bar = 5] = foo;", | |
154 | options: [{ object: "foo", property: "1" }], | |
155 | parserOptions: { ecmaVersion: 6 } | |
156 | }, { | |
157 | code: "let bar; ([bar = 5] = foo);", | |
158 | options: [{ object: "foo", property: "0" }], | |
159 | parserOptions: { ecmaVersion: 6 } | |
160 | }, { | |
161 | code: "function qux([bar] = foo) {}", | |
162 | options: [{ object: "foo", property: "0" }], | |
163 | parserOptions: { ecmaVersion: 6 } | |
164 | }, { | |
165 | code: "function qux([, bar] = foo) {}", | |
166 | options: [{ object: "foo", property: "0" }], | |
167 | parserOptions: { ecmaVersion: 6 } | |
168 | }, { | |
169 | code: "function qux([, bar] = foo) {}", | |
170 | options: [{ object: "foo", property: "1" }], | |
171 | parserOptions: { ecmaVersion: 6 } | |
609c276f TL |
172 | }, { |
173 | code: "class C { #foo; foo() { this.#foo; } }", | |
174 | options: [{ property: "#foo" }], | |
175 | parserOptions: { ecmaVersion: 2022 } | |
eb39fafa DC |
176 | } |
177 | ], | |
178 | ||
179 | invalid: [ | |
180 | { | |
181 | code: "someObject.disallowedProperty", | |
182 | options: [{ | |
183 | object: "someObject", | |
184 | property: "disallowedProperty" | |
185 | }], | |
186 | errors: [{ | |
187 | messageId: "restrictedObjectProperty", | |
188 | data: { | |
189 | objectName: "someObject", | |
190 | propertyName: "disallowedProperty", | |
191 | message: "" | |
192 | }, | |
193 | type: "MemberExpression" | |
194 | }] | |
195 | }, { | |
196 | code: "someObject.disallowedProperty", | |
197 | options: [{ | |
198 | object: "someObject", | |
199 | property: "disallowedProperty", | |
200 | message: "Please use someObject.allowedProperty instead." | |
201 | }], | |
202 | errors: [{ | |
203 | messageId: "restrictedObjectProperty", | |
204 | data: { | |
205 | objectName: "someObject", | |
206 | propertyName: "disallowedProperty", | |
207 | message: " Please use someObject.allowedProperty instead." | |
208 | }, | |
209 | type: "MemberExpression" | |
210 | }] | |
211 | }, { | |
212 | code: "someObject.disallowedProperty; anotherObject.anotherDisallowedProperty()", | |
213 | options: [{ | |
214 | object: "someObject", | |
215 | property: "disallowedProperty" | |
216 | }, { | |
217 | object: "anotherObject", | |
218 | property: "anotherDisallowedProperty" | |
219 | }], | |
220 | errors: [{ | |
221 | messageId: "restrictedObjectProperty", | |
222 | data: { | |
223 | objectName: "someObject", | |
224 | propertyName: "disallowedProperty", | |
225 | message: "" | |
226 | }, | |
227 | type: "MemberExpression" | |
228 | }, { | |
229 | messageId: "restrictedObjectProperty", | |
230 | data: { | |
231 | objectName: "anotherObject", | |
232 | propertyName: "anotherDisallowedProperty", | |
233 | message: "" | |
234 | }, | |
235 | type: "MemberExpression" | |
236 | }] | |
237 | }, { | |
238 | code: "foo.__proto__", | |
239 | options: [{ | |
240 | property: "__proto__", | |
241 | message: "Please use Object.getPrototypeOf instead." | |
242 | }], | |
243 | errors: [{ | |
244 | messageId: "restrictedProperty", | |
245 | data: { | |
246 | objectName: "", | |
247 | propertyName: "__proto__", | |
248 | message: " Please use Object.getPrototypeOf instead." | |
249 | }, | |
250 | type: "MemberExpression" | |
251 | }] | |
252 | }, { | |
253 | code: "foo['__proto__']", | |
254 | options: [{ | |
255 | property: "__proto__", | |
256 | message: "Please use Object.getPrototypeOf instead." | |
257 | }], | |
258 | errors: [{ | |
259 | messageId: "restrictedProperty", | |
260 | data: { | |
261 | objectName: "", | |
262 | propertyName: "__proto__", | |
263 | message: " Please use Object.getPrototypeOf instead." | |
264 | }, | |
265 | type: "MemberExpression" | |
266 | }] | |
267 | }, { | |
268 | code: "foo.bar.baz;", | |
269 | options: [{ object: "foo" }], | |
270 | errors: [{ | |
271 | messageId: "restrictedObjectProperty", | |
272 | data: { | |
273 | objectName: "foo", | |
274 | propertyName: "bar", | |
275 | message: "" | |
276 | }, | |
277 | type: "MemberExpression" | |
278 | }] | |
279 | }, { | |
280 | code: "foo.bar();", | |
281 | options: [{ object: "foo" }], | |
282 | errors: [{ | |
283 | messageId: "restrictedObjectProperty", | |
284 | data: { | |
285 | objectName: "foo", | |
286 | propertyName: "bar", | |
287 | message: "" | |
288 | }, | |
289 | type: "MemberExpression" | |
290 | }] | |
291 | }, { | |
292 | code: "foo.bar.baz();", | |
293 | options: [{ object: "foo" }], | |
294 | errors: [{ | |
295 | messageId: "restrictedObjectProperty", | |
296 | data: { | |
297 | objectName: "foo", | |
298 | propertyName: "bar", | |
299 | message: "" | |
300 | }, | |
301 | type: "MemberExpression" | |
302 | }] | |
303 | }, { | |
304 | code: "foo.bar.baz;", | |
305 | options: [{ property: "bar" }], | |
306 | errors: [{ | |
307 | messageId: "restrictedProperty", | |
308 | data: { | |
309 | objectName: "", | |
310 | propertyName: "bar", | |
311 | message: "" | |
312 | }, | |
313 | type: "MemberExpression" | |
314 | }] | |
315 | }, { | |
316 | code: "foo.bar();", | |
317 | options: [{ property: "bar" }], | |
318 | errors: [{ | |
319 | messageId: "restrictedProperty", | |
320 | data: { | |
321 | objectName: "", | |
322 | propertyName: "bar", | |
323 | message: "" | |
324 | }, | |
325 | type: "MemberExpression" | |
326 | }] | |
327 | }, { | |
328 | code: "foo.bar.baz();", | |
329 | options: [{ property: "bar" }], | |
330 | errors: [{ | |
331 | messageId: "restrictedProperty", | |
332 | data: { | |
333 | objectName: "", | |
334 | propertyName: "bar", | |
335 | message: "" | |
336 | }, | |
337 | type: "MemberExpression" | |
338 | }] | |
339 | }, { | |
340 | code: "foo[/(?<zero>0)/]", | |
341 | options: [{ property: "/(?<zero>0)/" }], | |
342 | parserOptions: { ecmaVersion: 2018 }, | |
343 | errors: [{ | |
344 | messageId: "restrictedProperty", | |
345 | data: { | |
346 | objectName: "", | |
347 | propertyName: "/(?<zero>0)/", | |
348 | message: "" | |
349 | }, | |
350 | type: "MemberExpression" | |
351 | }] | |
352 | }, { | |
353 | code: "require.call({}, 'foo')", | |
354 | options: [{ | |
355 | object: "require", | |
356 | message: "Please call require() directly." | |
357 | }], | |
358 | errors: [{ | |
359 | messageId: "restrictedObjectProperty", | |
360 | data: { | |
361 | objectName: "require", | |
362 | propertyName: "call", | |
363 | message: " Please call require() directly." | |
364 | }, | |
365 | type: "MemberExpression" | |
366 | }] | |
367 | }, { | |
368 | code: "require['resolve']", | |
369 | options: [{ | |
370 | object: "require" | |
371 | }], | |
372 | errors: [{ | |
373 | messageId: "restrictedObjectProperty", | |
374 | data: { | |
375 | objectName: "require", | |
376 | propertyName: "resolve", | |
377 | message: "" | |
378 | }, | |
379 | type: "MemberExpression" | |
380 | }] | |
381 | }, { | |
382 | code: "let {bar} = foo;", | |
383 | options: [{ object: "foo", property: "bar" }], | |
384 | parserOptions: { ecmaVersion: 6 }, | |
385 | errors: [{ | |
386 | messageId: "restrictedObjectProperty", | |
387 | data: { | |
388 | objectName: "foo", | |
389 | propertyName: "bar", | |
390 | message: "" | |
391 | }, | |
392 | type: "ObjectPattern" | |
393 | }] | |
394 | }, { | |
395 | code: "let {bar: baz} = foo;", | |
396 | options: [{ object: "foo", property: "bar" }], | |
397 | parserOptions: { ecmaVersion: 6 }, | |
398 | errors: [{ | |
399 | messageId: "restrictedObjectProperty", | |
400 | data: { | |
401 | objectName: "foo", | |
402 | propertyName: "bar", | |
403 | message: "" | |
404 | }, | |
405 | type: "ObjectPattern" | |
406 | }] | |
407 | }, { | |
408 | code: "let {'bar': baz} = foo;", | |
409 | options: [{ object: "foo", property: "bar" }], | |
410 | parserOptions: { ecmaVersion: 6 }, | |
411 | errors: [{ | |
412 | messageId: "restrictedObjectProperty", | |
413 | data: { | |
414 | objectName: "foo", | |
415 | propertyName: "bar", | |
416 | message: "" | |
417 | }, | |
418 | type: "ObjectPattern" | |
419 | }] | |
420 | }, { | |
421 | code: "let {bar: {baz: qux}} = foo;", | |
422 | options: [{ object: "foo", property: "bar" }], | |
423 | parserOptions: { ecmaVersion: 6 }, | |
424 | errors: [{ | |
425 | messageId: "restrictedObjectProperty", | |
426 | data: { | |
427 | objectName: "foo", | |
428 | propertyName: "bar", | |
429 | message: "" | |
430 | }, | |
431 | type: "ObjectPattern" | |
432 | }] | |
433 | }, { | |
434 | code: "let {bar} = foo;", | |
435 | options: [{ object: "foo" }], | |
436 | parserOptions: { ecmaVersion: 6 }, | |
437 | errors: [{ | |
438 | messageId: "restrictedObjectProperty", | |
439 | data: { | |
440 | objectName: "foo", | |
441 | propertyName: "bar", | |
442 | message: "" | |
443 | }, | |
444 | type: "ObjectPattern" | |
445 | }] | |
446 | }, { | |
447 | code: "let {bar: baz} = foo;", | |
448 | options: [{ object: "foo" }], | |
449 | parserOptions: { ecmaVersion: 6 }, | |
450 | errors: [{ | |
451 | messageId: "restrictedObjectProperty", | |
452 | data: { | |
453 | objectName: "foo", | |
454 | propertyName: "bar", | |
455 | message: "" | |
456 | }, | |
457 | type: "ObjectPattern" | |
458 | }] | |
459 | }, { | |
460 | code: "let {bar} = foo;", | |
461 | options: [{ property: "bar" }], | |
462 | parserOptions: { ecmaVersion: 6 }, | |
463 | errors: [{ | |
464 | messageId: "restrictedProperty", | |
465 | data: { | |
466 | objectName: "", | |
467 | propertyName: "bar", | |
468 | message: "" | |
469 | }, | |
470 | type: "ObjectPattern" | |
471 | }] | |
472 | }, { | |
473 | code: "let bar; ({bar} = foo);", | |
474 | options: [{ object: "foo", property: "bar" }], | |
475 | parserOptions: { ecmaVersion: 6 }, | |
476 | errors: [{ | |
477 | messageId: "restrictedObjectProperty", | |
478 | data: { | |
479 | objectName: "foo", | |
480 | propertyName: "bar", | |
481 | message: "" | |
482 | }, | |
483 | type: "ObjectPattern" | |
484 | }] | |
485 | }, { | |
486 | code: "let bar; ({bar: baz = 1} = foo);", | |
487 | options: [{ object: "foo", property: "bar" }], | |
488 | parserOptions: { ecmaVersion: 6 }, | |
489 | errors: [{ | |
490 | messageId: "restrictedObjectProperty", | |
491 | data: { | |
492 | objectName: "foo", | |
493 | propertyName: "bar", | |
494 | message: "" | |
495 | }, | |
496 | type: "ObjectPattern" | |
497 | }] | |
498 | }, { | |
499 | code: "function qux({bar} = foo) {}", | |
500 | options: [{ object: "foo", property: "bar" }], | |
501 | parserOptions: { ecmaVersion: 6 }, | |
502 | errors: [{ | |
503 | messageId: "restrictedObjectProperty", | |
504 | data: { | |
505 | objectName: "foo", | |
506 | propertyName: "bar", | |
507 | message: "" | |
508 | }, | |
509 | type: "ObjectPattern" | |
510 | }] | |
511 | }, { | |
512 | code: "function qux({bar: baz} = foo) {}", | |
513 | options: [{ object: "foo", property: "bar" }], | |
514 | parserOptions: { ecmaVersion: 6 }, | |
515 | errors: [{ | |
516 | messageId: "restrictedObjectProperty", | |
517 | data: { | |
518 | objectName: "foo", | |
519 | propertyName: "bar", | |
520 | message: "" | |
521 | }, | |
522 | type: "ObjectPattern" | |
523 | }] | |
524 | }, { | |
525 | code: "var {['foo']: qux, bar} = baz", | |
526 | options: [{ object: "baz", property: "foo" }], | |
527 | parserOptions: { ecmaVersion: 6 }, | |
528 | errors: [{ | |
529 | messageId: "restrictedObjectProperty", | |
530 | data: { | |
531 | objectName: "baz", | |
532 | propertyName: "foo", | |
533 | message: "" | |
534 | }, | |
535 | type: "ObjectPattern" | |
536 | }] | |
609c276f TL |
537 | }, { |
538 | code: "obj['#foo']", | |
539 | options: [{ property: "#foo" }], | |
540 | errors: [{ | |
541 | messageId: "restrictedProperty", | |
542 | data: { | |
543 | objectName: "", | |
544 | propertyName: "#foo", | |
545 | message: "" | |
546 | }, | |
547 | type: "MemberExpression" | |
548 | }] | |
eb39fafa DC |
549 | } |
550 | ] | |
551 | }); |