@futdevpro/dynamo-eslint 1.15.22 → 1.15.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/.c8rc.json +26 -26
  2. package/.cursor/rules/__assistant_guide.mdc +30 -30
  3. package/.cursor/rules/__main.mdc +64 -64
  4. package/.cursor/rules/_ag_backend-structure.mdc +85 -85
  5. package/.cursor/rules/_ag_backend.mdc +16 -16
  6. package/.cursor/rules/_ag_debug.mdc +7 -7
  7. package/.cursor/rules/_ag_documentation_writing_rules.mdc +372 -372
  8. package/.cursor/rules/_ag_file-refactoring.mdc +113 -113
  9. package/.cursor/rules/_ag_fixes_rules.mdc +5 -5
  10. package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
  11. package/.cursor/rules/_ag_frontend.mdc +39 -39
  12. package/.cursor/rules/_ag_import-rules.mdc +44 -44
  13. package/.cursor/rules/_ag_naming.mdc +115 -115
  14. package/.cursor/rules/_ag_running_commands.mdc +4 -4
  15. package/.cursor/rules/_ag_server-controller.mdc +5 -5
  16. package/.cursor/rules/_ag_should-be.mdc +6 -6
  17. package/.cursor/rules/_ag_swearing.mdc +47 -47
  18. package/.cursor/rules/ai_development_guide.md +60 -60
  19. package/.cursor/rules/ai_directives.md +114 -114
  20. package/.cursor/rules/cursor-rules.md +160 -160
  21. package/.cursor/rules/default-command.mdc +464 -464
  22. package/.cursor/rules/error_code_pattern.md +39 -39
  23. package/.cursor/rules/saved rule mcp server use.md +15 -15
  24. package/.dynamo/pipeline.cicd.config.json +184 -184
  25. package/.dynamo/version-bump.config.json +5 -5
  26. package/.eslintrc.json +4 -4
  27. package/.github/workflows/main.yml +436 -436
  28. package/.husky/pre-commit +2 -2
  29. package/.vscode/settings.json +11 -11
  30. package/README.md +319 -319
  31. package/__documentations/2026-04-18-ccap-review-integration.md +173 -173
  32. package/__documentations/2026-08-18-bfr-ctm-005-eslint9-validator-report.md +45 -0
  33. package/build/configs/base.d.ts +9 -9
  34. package/build/configs/base.js +150 -150
  35. package/build/configs/fsm.d.ts +1 -1
  36. package/build/configs/fsm.js +7 -7
  37. package/build/configs/ngx-package.d.ts +1 -1
  38. package/build/configs/ngx-package.js +7 -7
  39. package/build/configs/ngx.d.ts +4 -4
  40. package/build/configs/ngx.js +91 -91
  41. package/build/configs/nts-package.d.ts +1 -1
  42. package/build/configs/nts-package.js +17 -17
  43. package/build/configs/nts.d.ts +1 -1
  44. package/build/configs/nts.js +31 -31
  45. package/build/index.d.ts +1 -1
  46. package/build/index.js +2 -2
  47. package/build/plugin/index.d.ts +52 -52
  48. package/build/plugin/index.js +80 -80
  49. package/build/plugin/rules/angular/angular-for-track-logic.d.ts +7 -7
  50. package/build/plugin/rules/angular/angular-for-track-logic.js +81 -81
  51. package/build/plugin/rules/angular/effect-signal-loop.d.ts +9 -9
  52. package/build/plugin/rules/angular/effect-signal-loop.js +112 -112
  53. package/build/plugin/rules/angular/no-async-ngoninit.d.ts +8 -8
  54. package/build/plugin/rules/angular/no-async-ngoninit.js +42 -42
  55. package/build/plugin/rules/angular/no-component-direct-api.d.ts +9 -9
  56. package/build/plugin/rules/angular/no-component-direct-api.js +75 -75
  57. package/build/plugin/rules/angular/no-method-call-in-template.d.ts +8 -8
  58. package/build/plugin/rules/angular/no-method-call-in-template.js +79 -79
  59. package/build/plugin/rules/angular/no-ngfor-directive.d.ts +7 -7
  60. package/build/plugin/rules/angular/no-ngfor-directive.js +59 -59
  61. package/build/plugin/rules/angular/no-ngif-directive.d.ts +7 -7
  62. package/build/plugin/rules/angular/no-ngif-directive.js +59 -59
  63. package/build/plugin/rules/explicit-types.d.ts +3 -3
  64. package/build/plugin/rules/explicit-types.js +178 -178
  65. package/build/plugin/rules/import/import-order.d.ts +3 -3
  66. package/build/plugin/rules/import/import-order.js +154 -154
  67. package/build/plugin/rules/import/no-import-type.d.ts +3 -3
  68. package/build/plugin/rules/import/no-import-type.js +45 -45
  69. package/build/plugin/rules/import/no-js-import.d.ts +3 -3
  70. package/build/plugin/rules/import/no-js-import.js +40 -40
  71. package/build/plugin/rules/naming-patterns.d.ts +7 -7
  72. package/build/plugin/rules/naming-patterns.d.ts.map +1 -1
  73. package/build/plugin/rules/naming-patterns.js +366 -350
  74. package/build/plugin/rules/naming-patterns.js.map +1 -1
  75. package/build/plugin/rules/no-getter-logic.d.ts +3 -3
  76. package/build/plugin/rules/no-getter-logic.js +194 -194
  77. package/build/plugin/rules/prefer-enum-over-string-union.d.ts +3 -3
  78. package/build/plugin/rules/prefer-enum-over-string-union.js +289 -289
  79. package/build/plugin/rules/prefer-interface-over-duplicate-types.d.ts +3 -3
  80. package/build/plugin/rules/prefer-interface-over-duplicate-types.js +264 -264
  81. package/build/plugin/rules/require-jsdoc-description.d.ts +3 -3
  82. package/build/plugin/rules/require-jsdoc-description.js +496 -496
  83. package/build/plugin/rules/require-test-description-prefix.d.ts +3 -3
  84. package/build/plugin/rules/require-test-description-prefix.js +135 -135
  85. package/build/plugin/rules/ts/data-model-extends.d.ts +8 -8
  86. package/build/plugin/rules/ts/data-model-extends.js +94 -94
  87. package/build/plugin/rules/ts/no-any-type.d.ts +8 -8
  88. package/build/plugin/rules/ts/no-any-type.js +36 -36
  89. package/build/plugin/rules/ts/no-as-cast.d.ts +8 -8
  90. package/build/plugin/rules/ts/no-as-cast.js +49 -49
  91. package/build/plugin/rules/ts/no-dynamic-imports.d.ts +8 -8
  92. package/build/plugin/rules/ts/no-dynamic-imports.js +50 -50
  93. package/build/plugin/rules/ts/no-native-browser-dialogs.d.ts +8 -8
  94. package/build/plugin/rules/ts/no-native-browser-dialogs.js +78 -78
  95. package/build/plugin/rules/ts/no-plain-function-export.d.ts +9 -9
  96. package/build/plugin/rules/ts/no-plain-function-export.js +69 -69
  97. package/build/plugin/rules/ts/one-export-per-file.d.ts +8 -8
  98. package/build/plugin/rules/ts/one-export-per-file.js +73 -73
  99. package/build/scripts/dynamo-fix.d.ts +26 -26
  100. package/build/scripts/dynamo-fix.js +146 -146
  101. package/build/scripts/dynamo-fix.js.map +1 -1
  102. package/build/scripts/eslintrc-audit.d.ts +26 -26
  103. package/build/scripts/eslintrc-audit.js +100 -100
  104. package/build/scripts/fix-return-types.d.ts +74 -74
  105. package/build/scripts/fix-return-types.js +226 -226
  106. package/build/scripts/validate-imports.d.ts +26 -26
  107. package/build/scripts/validate-imports.js +157 -137
  108. package/build/scripts/validate-imports.js.map +1 -1
  109. package/build/scripts/validate-naming.d.ts +26 -26
  110. package/build/scripts/validate-naming.js +157 -123
  111. package/build/scripts/validate-naming.js.map +1 -1
  112. package/eslint.config.js +15 -15
  113. package/package.json +105 -105
  114. package/samples/.vscode/settings.json +13 -13
  115. package/samples/base/.eslintrc.json +6 -6
  116. package/samples/base/eslint.config.js +3 -3
  117. package/samples/fsm/.eslintrc.json +4 -4
  118. package/samples/fsm/eslint.config.js +3 -3
  119. package/samples/ngx/.eslintrc.json +6 -6
  120. package/samples/ngx/eslint.config.js +3 -3
  121. package/samples/ngx-package/.eslintrc.json +4 -4
  122. package/samples/ngx-package/eslint.config.js +3 -3
  123. package/samples/nts/.eslintrc.json +6 -6
  124. package/samples/nts/eslint.config.js +3 -3
  125. package/samples/nts-package/.eslintrc.json +4 -4
  126. package/samples/nts-package/eslint.config.js +3 -3
  127. package/samples/package.json.example +26 -26
  128. package/samples/poc-sample.ts +38 -38
  129. package/samples/poc-violations.ts +54 -54
  130. package/scripts/run-coverage-tests.js +24 -24
  131. package/spec/support/helpers/ts-node-helper.js +9 -9
  132. package/spec/support/jasmine.coverage.json +23 -23
  133. package/spec/support/jasmine.json +24 -24
  134. package/src/configs/base.ts +157 -157
  135. package/src/configs/fsm.ts +10 -10
  136. package/src/configs/ngx-package.ts +10 -10
  137. package/src/configs/ngx.ts +96 -96
  138. package/src/configs/nts-package.ts +20 -20
  139. package/src/configs/nts.ts +34 -34
  140. package/src/index.ts +4 -4
  141. package/src/plugin/index.ts +86 -86
  142. package/src/plugin/rules/angular/angular-for-track-logic.spec.ts +44 -44
  143. package/src/plugin/rules/angular/angular-for-track-logic.ts +88 -88
  144. package/src/plugin/rules/angular/effect-signal-loop.spec.ts +89 -89
  145. package/src/plugin/rules/angular/effect-signal-loop.ts +125 -125
  146. package/src/plugin/rules/angular/no-async-ngoninit.spec.ts +50 -50
  147. package/src/plugin/rules/angular/no-async-ngoninit.ts +43 -43
  148. package/src/plugin/rules/angular/no-component-direct-api.spec.ts +78 -78
  149. package/src/plugin/rules/angular/no-component-direct-api.ts +82 -82
  150. package/src/plugin/rules/angular/no-method-call-in-template.spec.ts +63 -63
  151. package/src/plugin/rules/angular/no-method-call-in-template.ts +89 -89
  152. package/src/plugin/rules/angular/no-ngfor-directive.spec.ts +44 -44
  153. package/src/plugin/rules/angular/no-ngfor-directive.ts +62 -62
  154. package/src/plugin/rules/angular/no-ngif-directive.spec.ts +44 -44
  155. package/src/plugin/rules/angular/no-ngif-directive.ts +62 -62
  156. package/src/plugin/rules/explicit-types.spec.ts +190 -190
  157. package/src/plugin/rules/explicit-types.ts +186 -186
  158. package/src/plugin/rules/import/import-order.spec.ts +219 -219
  159. package/src/plugin/rules/import/import-order.ts +197 -197
  160. package/src/plugin/rules/import/no-import-type.spec.ts +69 -69
  161. package/src/plugin/rules/import/no-import-type.ts +46 -46
  162. package/src/plugin/rules/import/no-js-import.spec.ts +82 -82
  163. package/src/plugin/rules/import/no-js-import.ts +45 -45
  164. package/src/plugin/rules/naming-patterns.spec.ts +189 -127
  165. package/src/plugin/rules/naming-patterns.ts +426 -408
  166. package/src/plugin/rules/no-getter-logic.spec.ts +591 -591
  167. package/src/plugin/rules/no-getter-logic.ts +220 -220
  168. package/src/plugin/rules/prefer-enum-over-string-union.spec.ts +583 -583
  169. package/src/plugin/rules/prefer-enum-over-string-union.ts +333 -333
  170. package/src/plugin/rules/prefer-interface-over-duplicate-types.spec.ts +404 -404
  171. package/src/plugin/rules/prefer-interface-over-duplicate-types.ts +314 -314
  172. package/src/plugin/rules/require-jsdoc-description.spec.ts +779 -779
  173. package/src/plugin/rules/require-jsdoc-description.ts +572 -572
  174. package/src/plugin/rules/require-test-description-prefix.spec.ts +459 -459
  175. package/src/plugin/rules/require-test-description-prefix.ts +154 -154
  176. package/src/plugin/rules/ts/data-model-extends.spec.ts +84 -84
  177. package/src/plugin/rules/ts/data-model-extends.ts +100 -100
  178. package/src/plugin/rules/ts/no-any-type.spec.ts +28 -28
  179. package/src/plugin/rules/ts/no-any-type.ts +36 -36
  180. package/src/plugin/rules/ts/no-as-cast.spec.ts +51 -51
  181. package/src/plugin/rules/ts/no-as-cast.ts +51 -51
  182. package/src/plugin/rules/ts/no-dynamic-imports.spec.ts +54 -54
  183. package/src/plugin/rules/ts/no-dynamic-imports.ts +49 -49
  184. package/src/plugin/rules/ts/no-native-browser-dialogs.spec.ts +54 -54
  185. package/src/plugin/rules/ts/no-native-browser-dialogs.ts +84 -84
  186. package/src/plugin/rules/ts/no-plain-function-export.spec.ts +72 -72
  187. package/src/plugin/rules/ts/no-plain-function-export.ts +73 -73
  188. package/src/plugin/rules/ts/one-export-per-file.spec.ts +64 -64
  189. package/src/plugin/rules/ts/one-export-per-file.ts +77 -77
  190. package/src/scripts/dynamo-fix.ts +172 -172
  191. package/src/scripts/eslintrc-audit.ts +116 -116
  192. package/src/scripts/fix-return-types.spec.ts +65 -65
  193. package/src/scripts/fix-return-types.ts +288 -288
  194. package/src/scripts/validate-imports.ts +278 -249
  195. package/src/scripts/validate-naming.ts +204 -176
  196. package/src/scripts/validator-cli.integration.spec.ts +96 -0
  197. package/tsconfig.json +31 -31
@@ -1,459 +1,459 @@
1
- import requireTestPrefixRule from './require-test-description-prefix';
2
-
3
- describe('| require-test-description-prefix', () => {
4
- it('| should be a valid ESLint rule', () => {
5
- expect(requireTestPrefixRule.meta.type).toBe('suggestion');
6
- expect(requireTestPrefixRule.meta.docs.description).toBe('Require "| " prefix in test descriptions');
7
- expect(requireTestPrefixRule.meta.fixable).toBe('code');
8
- });
9
-
10
- it('| should not report when describe has correct prefix', () => {
11
- let reportCalled = false;
12
- const mockContext = {
13
- report: (options: any) => {
14
- reportCalled = true;
15
- },
16
- options: [{ prefix: '| ' }],
17
- } as any;
18
-
19
- const rule = requireTestPrefixRule.create(mockContext);
20
-
21
- const mockNode = {
22
- type: 'CallExpression',
23
- callee: { name: 'describe' },
24
- arguments: [
25
- { type: 'Literal', value: '| my test suite' },
26
- ],
27
- } as any;
28
-
29
- rule.CallExpression(mockNode);
30
-
31
- expect(reportCalled).toBe(false);
32
- });
33
-
34
- it('| should not report when it has correct prefix', () => {
35
- let reportCalled = false;
36
- const mockContext = {
37
- report: (options: any) => {
38
- reportCalled = true;
39
- },
40
- options: [{ prefix: '| ' }],
41
- } as any;
42
-
43
- const rule = requireTestPrefixRule.create(mockContext);
44
-
45
- const mockNode = {
46
- type: 'CallExpression',
47
- callee: { name: 'it' },
48
- arguments: [
49
- { type: 'Literal', value: '| should do something' },
50
- ],
51
- } as any;
52
-
53
- rule.CallExpression(mockNode);
54
-
55
- expect(reportCalled).toBe(false);
56
- });
57
-
58
- it('| should not report when test has correct prefix', () => {
59
- let reportCalled = false;
60
- const mockContext = {
61
- report: (options: any) => {
62
- reportCalled = true;
63
- },
64
- options: [{ prefix: '| ' }],
65
- } as any;
66
-
67
- const rule = requireTestPrefixRule.create(mockContext);
68
-
69
- const mockNode = {
70
- type: 'CallExpression',
71
- callee: { name: 'test' },
72
- arguments: [
73
- { type: 'Literal', value: '| validates input' },
74
- ],
75
- } as any;
76
-
77
- rule.CallExpression(mockNode);
78
-
79
- expect(reportCalled).toBe(false);
80
- });
81
-
82
- it('| should report when describe is missing prefix', () => {
83
- let reportCalled = false;
84
- const mockContext = {
85
- report: (options: any) => {
86
- reportCalled = true;
87
- expect(options.messageId).toBe('missingPrefix');
88
- expect(options.data.prefix).toBe('| ');
89
- expect(options.fix).toBeDefined();
90
- },
91
- options: [{ prefix: '| ' }],
92
- } as any;
93
-
94
- const rule = requireTestPrefixRule.create(mockContext);
95
-
96
- const mockNode = {
97
- type: 'CallExpression',
98
- callee: { name: 'describe' },
99
- arguments: [
100
- { type: 'Literal', value: 'my test suite' },
101
- ],
102
- } as any;
103
-
104
- rule.CallExpression(mockNode);
105
-
106
- expect(reportCalled).toBe(true);
107
- });
108
-
109
- it('| should report when it is missing prefix', () => {
110
- let reportCalled = false;
111
- const mockContext = {
112
- report: (options: any) => {
113
- reportCalled = true;
114
- expect(options.messageId).toBe('missingPrefix');
115
- expect(options.data.prefix).toBe('| ');
116
- },
117
- options: [{ prefix: '| ' }],
118
- } as any;
119
-
120
- const rule = requireTestPrefixRule.create(mockContext);
121
-
122
- const mockNode = {
123
- type: 'CallExpression',
124
- callee: { name: 'it' },
125
- arguments: [
126
- { type: 'Literal', value: 'should do something' },
127
- ],
128
- } as any;
129
-
130
- rule.CallExpression(mockNode);
131
-
132
- expect(reportCalled).toBe(true);
133
- });
134
-
135
- it('| should report when describe has wrong prefix', () => {
136
- let reportCalled = false;
137
- const mockContext = {
138
- report: (options: any) => {
139
- reportCalled = true;
140
- expect(options.messageId).toBe('wrongPrefix');
141
- expect(options.data.prefix).toBe('| ');
142
- expect(options.data.found).toBe('|');
143
- },
144
- options: [{ prefix: '| ' }],
145
- } as any;
146
-
147
- const rule = requireTestPrefixRule.create(mockContext);
148
-
149
- const mockNode = {
150
- type: 'CallExpression',
151
- callee: { name: 'describe' },
152
- arguments: [
153
- { type: 'Literal', value: '|my test suite' },
154
- ],
155
- } as any;
156
-
157
- rule.CallExpression(mockNode);
158
-
159
- expect(reportCalled).toBe(true);
160
- });
161
-
162
- it('| should report when it has only pipe without space', () => {
163
- let reportCalled = false;
164
- const mockContext = {
165
- report: (options: any) => {
166
- reportCalled = true;
167
- expect(options.messageId).toBe('wrongPrefix');
168
- expect(options.data.found).toBe('|');
169
- },
170
- options: [{ prefix: '| ' }],
171
- } as any;
172
-
173
- const rule = requireTestPrefixRule.create(mockContext);
174
-
175
- const mockNode = {
176
- type: 'CallExpression',
177
- callee: { name: 'it' },
178
- arguments: [
179
- { type: 'Literal', value: '|should do something' },
180
- ],
181
- } as any;
182
-
183
- rule.CallExpression(mockNode);
184
-
185
- expect(reportCalled).toBe(true);
186
- });
187
-
188
- it('| should not report on non-test functions', () => {
189
- let reportCalled = false;
190
- const mockContext = {
191
- report: (options: any) => {
192
- reportCalled = true;
193
- },
194
- options: [{ prefix: '| ' }],
195
- } as any;
196
-
197
- const rule = requireTestPrefixRule.create(mockContext);
198
-
199
- const mockNode = {
200
- type: 'CallExpression',
201
- callee: { name: 'console' },
202
- arguments: [
203
- { type: 'Literal', value: 'log message' },
204
- ],
205
- } as any;
206
-
207
- rule.CallExpression(mockNode);
208
-
209
- expect(reportCalled).toBe(false);
210
- });
211
-
212
- it('| should not report when no arguments provided', () => {
213
- let reportCalled = false;
214
- const mockContext = {
215
- report: (options: any) => {
216
- reportCalled = true;
217
- },
218
- options: [{ prefix: '| ' }],
219
- } as any;
220
-
221
- const rule = requireTestPrefixRule.create(mockContext);
222
-
223
- const mockNode = {
224
- type: 'CallExpression',
225
- callee: { name: 'describe' },
226
- arguments: [],
227
- } as any;
228
-
229
- rule.CallExpression(mockNode);
230
-
231
- expect(reportCalled).toBe(false);
232
- });
233
-
234
- it('| should not report when first argument is not a string', () => {
235
- let reportCalled = false;
236
- const mockContext = {
237
- report: (options: any) => {
238
- reportCalled = true;
239
- },
240
- options: [{ prefix: '| ' }],
241
- } as any;
242
-
243
- const rule = requireTestPrefixRule.create(mockContext);
244
-
245
- const mockNode = {
246
- type: 'CallExpression',
247
- callee: { name: 'describe' },
248
- arguments: [
249
- { type: 'Identifier', name: 'myVariable' },
250
- ],
251
- } as any;
252
-
253
- rule.CallExpression(mockNode);
254
-
255
- expect(reportCalled).toBe(false);
256
- });
257
-
258
- it('| should handle beforeEach and afterEach', () => {
259
- let reportCalled = false;
260
- const mockContext = {
261
- report: (options: any) => {
262
- reportCalled = true;
263
- expect(options.messageId).toBe('missingPrefix');
264
- },
265
- options: [{ prefix: '| ' }],
266
- } as any;
267
-
268
- const rule = requireTestPrefixRule.create(mockContext);
269
-
270
- const mockNode = {
271
- type: 'CallExpression',
272
- callee: { name: 'beforeEach' },
273
- arguments: [
274
- { type: 'Literal', value: 'setup test data' },
275
- ],
276
- } as any;
277
-
278
- rule.CallExpression(mockNode);
279
-
280
- expect(reportCalled).toBe(true);
281
- });
282
-
283
- it('| should handle beforeAll and afterAll', () => {
284
- let reportCalled = false;
285
- const mockContext = {
286
- report: (options: any) => {
287
- reportCalled = true;
288
- expect(options.messageId).toBe('missingPrefix');
289
- },
290
- options: [{ prefix: '| ' }],
291
- } as any;
292
-
293
- const rule = requireTestPrefixRule.create(mockContext);
294
-
295
- const mockNode = {
296
- type: 'CallExpression',
297
- callee: { name: 'beforeAll' },
298
- arguments: [
299
- { type: 'Literal', value: 'setup suite' },
300
- ],
301
- } as any;
302
-
303
- rule.CallExpression(mockNode);
304
-
305
- expect(reportCalled).toBe(true);
306
- });
307
-
308
- it('| should handle custom prefix configuration', () => {
309
- let reportCalled = false;
310
- const mockContext = {
311
- report: (options: any) => {
312
- reportCalled = true;
313
- expect(options.data.prefix).toBe('>>> ');
314
- },
315
- options: [{ prefix: '>>> ' }],
316
- } as any;
317
-
318
- const rule = requireTestPrefixRule.create(mockContext);
319
-
320
- const mockNode = {
321
- type: 'CallExpression',
322
- callee: { name: 'describe' },
323
- arguments: [
324
- { type: 'Literal', value: 'my test suite' },
325
- ],
326
- } as any;
327
-
328
- rule.CallExpression(mockNode);
329
-
330
- expect(reportCalled).toBe(true);
331
- });
332
-
333
- it('| should handle custom test functions configuration', () => {
334
- let reportCalled = false;
335
- const mockContext = {
336
- report: (options: any) => {
337
- reportCalled = true;
338
- },
339
- options: [{ testFunctions: [ 'myTest' ] }],
340
- } as any;
341
-
342
- const rule = requireTestPrefixRule.create(mockContext);
343
-
344
- const mockNode = {
345
- type: 'CallExpression',
346
- callee: { name: 'myTest' },
347
- arguments: [
348
- { type: 'Literal', value: 'my test description' },
349
- ],
350
- } as any;
351
-
352
- rule.CallExpression(mockNode);
353
-
354
- expect(reportCalled).toBe(true);
355
- });
356
-
357
- it('| should provide auto-fix functionality', () => {
358
- const mockContext = {
359
- report: (options: any) => {
360
- expect(options.fix).toBeDefined();
361
- expect(typeof options.fix).toBe('function');
362
-
363
- // Test the fix function
364
- const fixResult = options.fix({
365
- replaceText: (node: any, text: string) => {
366
- expect(text).toBe('\'| my test suite\'');
367
-
368
- return [];
369
- },
370
- });
371
-
372
- expect(Array.isArray(fixResult)).toBe(true);
373
- },
374
- options: [{ prefix: '| ' }],
375
- } as any;
376
-
377
- const rule = requireTestPrefixRule.create(mockContext);
378
-
379
- const mockNode = {
380
- type: 'CallExpression',
381
- callee: { name: 'describe' },
382
- arguments: [
383
- { type: 'Literal', value: 'my test suite' },
384
- ],
385
- } as any;
386
-
387
- rule.CallExpression(mockNode);
388
- });
389
-
390
- it('| should handle empty string descriptions', () => {
391
- let reportCalled = false;
392
- const mockContext = {
393
- report: (options: any) => {
394
- reportCalled = true;
395
- expect(options.messageId).toBe('missingPrefix');
396
- },
397
- options: [{ prefix: '| ' }],
398
- } as any;
399
-
400
- const rule = requireTestPrefixRule.create(mockContext);
401
-
402
- const mockNode = {
403
- type: 'CallExpression',
404
- callee: { name: 'describe' },
405
- arguments: [
406
- { type: 'Literal', value: '' },
407
- ],
408
- } as any;
409
-
410
- rule.CallExpression(mockNode);
411
-
412
- expect(reportCalled).toBe(true);
413
- });
414
-
415
- it('| should handle errors gracefully', () => {
416
- const mockContext = {
417
- report: (options: any) => {
418
- // Should not throw
419
- },
420
- options: [{ prefix: '| ' }],
421
- } as any;
422
-
423
- const rule = requireTestPrefixRule.create(mockContext);
424
-
425
- // Test with malformed nodes
426
- const malformedNode = {
427
- type: 'CallExpression',
428
- // Missing required properties
429
- } as any;
430
-
431
- expect(() => {
432
- rule.CallExpression(malformedNode);
433
- }).not.toThrow();
434
- });
435
-
436
- it('| should handle missing callee gracefully', () => {
437
- let reportCalled = false;
438
- const mockContext = {
439
- report: (options: any) => {
440
- reportCalled = true;
441
- },
442
- options: [{ prefix: '| ' }],
443
- } as any;
444
-
445
- const rule = requireTestPrefixRule.create(mockContext);
446
-
447
- const mockNode = {
448
- type: 'CallExpression',
449
- // Missing callee
450
- arguments: [
451
- { type: 'Literal', value: 'my test suite' },
452
- ],
453
- } as any;
454
-
455
- rule.CallExpression(mockNode);
456
-
457
- expect(reportCalled).toBe(false);
458
- });
459
- });
1
+ import requireTestPrefixRule from './require-test-description-prefix';
2
+
3
+ describe('| require-test-description-prefix', () => {
4
+ it('| should be a valid ESLint rule', () => {
5
+ expect(requireTestPrefixRule.meta.type).toBe('suggestion');
6
+ expect(requireTestPrefixRule.meta.docs.description).toBe('Require "| " prefix in test descriptions');
7
+ expect(requireTestPrefixRule.meta.fixable).toBe('code');
8
+ });
9
+
10
+ it('| should not report when describe has correct prefix', () => {
11
+ let reportCalled = false;
12
+ const mockContext = {
13
+ report: (options: any) => {
14
+ reportCalled = true;
15
+ },
16
+ options: [{ prefix: '| ' }],
17
+ } as any;
18
+
19
+ const rule = requireTestPrefixRule.create(mockContext);
20
+
21
+ const mockNode = {
22
+ type: 'CallExpression',
23
+ callee: { name: 'describe' },
24
+ arguments: [
25
+ { type: 'Literal', value: '| my test suite' },
26
+ ],
27
+ } as any;
28
+
29
+ rule.CallExpression(mockNode);
30
+
31
+ expect(reportCalled).toBe(false);
32
+ });
33
+
34
+ it('| should not report when it has correct prefix', () => {
35
+ let reportCalled = false;
36
+ const mockContext = {
37
+ report: (options: any) => {
38
+ reportCalled = true;
39
+ },
40
+ options: [{ prefix: '| ' }],
41
+ } as any;
42
+
43
+ const rule = requireTestPrefixRule.create(mockContext);
44
+
45
+ const mockNode = {
46
+ type: 'CallExpression',
47
+ callee: { name: 'it' },
48
+ arguments: [
49
+ { type: 'Literal', value: '| should do something' },
50
+ ],
51
+ } as any;
52
+
53
+ rule.CallExpression(mockNode);
54
+
55
+ expect(reportCalled).toBe(false);
56
+ });
57
+
58
+ it('| should not report when test has correct prefix', () => {
59
+ let reportCalled = false;
60
+ const mockContext = {
61
+ report: (options: any) => {
62
+ reportCalled = true;
63
+ },
64
+ options: [{ prefix: '| ' }],
65
+ } as any;
66
+
67
+ const rule = requireTestPrefixRule.create(mockContext);
68
+
69
+ const mockNode = {
70
+ type: 'CallExpression',
71
+ callee: { name: 'test' },
72
+ arguments: [
73
+ { type: 'Literal', value: '| validates input' },
74
+ ],
75
+ } as any;
76
+
77
+ rule.CallExpression(mockNode);
78
+
79
+ expect(reportCalled).toBe(false);
80
+ });
81
+
82
+ it('| should report when describe is missing prefix', () => {
83
+ let reportCalled = false;
84
+ const mockContext = {
85
+ report: (options: any) => {
86
+ reportCalled = true;
87
+ expect(options.messageId).toBe('missingPrefix');
88
+ expect(options.data.prefix).toBe('| ');
89
+ expect(options.fix).toBeDefined();
90
+ },
91
+ options: [{ prefix: '| ' }],
92
+ } as any;
93
+
94
+ const rule = requireTestPrefixRule.create(mockContext);
95
+
96
+ const mockNode = {
97
+ type: 'CallExpression',
98
+ callee: { name: 'describe' },
99
+ arguments: [
100
+ { type: 'Literal', value: 'my test suite' },
101
+ ],
102
+ } as any;
103
+
104
+ rule.CallExpression(mockNode);
105
+
106
+ expect(reportCalled).toBe(true);
107
+ });
108
+
109
+ it('| should report when it is missing prefix', () => {
110
+ let reportCalled = false;
111
+ const mockContext = {
112
+ report: (options: any) => {
113
+ reportCalled = true;
114
+ expect(options.messageId).toBe('missingPrefix');
115
+ expect(options.data.prefix).toBe('| ');
116
+ },
117
+ options: [{ prefix: '| ' }],
118
+ } as any;
119
+
120
+ const rule = requireTestPrefixRule.create(mockContext);
121
+
122
+ const mockNode = {
123
+ type: 'CallExpression',
124
+ callee: { name: 'it' },
125
+ arguments: [
126
+ { type: 'Literal', value: 'should do something' },
127
+ ],
128
+ } as any;
129
+
130
+ rule.CallExpression(mockNode);
131
+
132
+ expect(reportCalled).toBe(true);
133
+ });
134
+
135
+ it('| should report when describe has wrong prefix', () => {
136
+ let reportCalled = false;
137
+ const mockContext = {
138
+ report: (options: any) => {
139
+ reportCalled = true;
140
+ expect(options.messageId).toBe('wrongPrefix');
141
+ expect(options.data.prefix).toBe('| ');
142
+ expect(options.data.found).toBe('|');
143
+ },
144
+ options: [{ prefix: '| ' }],
145
+ } as any;
146
+
147
+ const rule = requireTestPrefixRule.create(mockContext);
148
+
149
+ const mockNode = {
150
+ type: 'CallExpression',
151
+ callee: { name: 'describe' },
152
+ arguments: [
153
+ { type: 'Literal', value: '|my test suite' },
154
+ ],
155
+ } as any;
156
+
157
+ rule.CallExpression(mockNode);
158
+
159
+ expect(reportCalled).toBe(true);
160
+ });
161
+
162
+ it('| should report when it has only pipe without space', () => {
163
+ let reportCalled = false;
164
+ const mockContext = {
165
+ report: (options: any) => {
166
+ reportCalled = true;
167
+ expect(options.messageId).toBe('wrongPrefix');
168
+ expect(options.data.found).toBe('|');
169
+ },
170
+ options: [{ prefix: '| ' }],
171
+ } as any;
172
+
173
+ const rule = requireTestPrefixRule.create(mockContext);
174
+
175
+ const mockNode = {
176
+ type: 'CallExpression',
177
+ callee: { name: 'it' },
178
+ arguments: [
179
+ { type: 'Literal', value: '|should do something' },
180
+ ],
181
+ } as any;
182
+
183
+ rule.CallExpression(mockNode);
184
+
185
+ expect(reportCalled).toBe(true);
186
+ });
187
+
188
+ it('| should not report on non-test functions', () => {
189
+ let reportCalled = false;
190
+ const mockContext = {
191
+ report: (options: any) => {
192
+ reportCalled = true;
193
+ },
194
+ options: [{ prefix: '| ' }],
195
+ } as any;
196
+
197
+ const rule = requireTestPrefixRule.create(mockContext);
198
+
199
+ const mockNode = {
200
+ type: 'CallExpression',
201
+ callee: { name: 'console' },
202
+ arguments: [
203
+ { type: 'Literal', value: 'log message' },
204
+ ],
205
+ } as any;
206
+
207
+ rule.CallExpression(mockNode);
208
+
209
+ expect(reportCalled).toBe(false);
210
+ });
211
+
212
+ it('| should not report when no arguments provided', () => {
213
+ let reportCalled = false;
214
+ const mockContext = {
215
+ report: (options: any) => {
216
+ reportCalled = true;
217
+ },
218
+ options: [{ prefix: '| ' }],
219
+ } as any;
220
+
221
+ const rule = requireTestPrefixRule.create(mockContext);
222
+
223
+ const mockNode = {
224
+ type: 'CallExpression',
225
+ callee: { name: 'describe' },
226
+ arguments: [],
227
+ } as any;
228
+
229
+ rule.CallExpression(mockNode);
230
+
231
+ expect(reportCalled).toBe(false);
232
+ });
233
+
234
+ it('| should not report when first argument is not a string', () => {
235
+ let reportCalled = false;
236
+ const mockContext = {
237
+ report: (options: any) => {
238
+ reportCalled = true;
239
+ },
240
+ options: [{ prefix: '| ' }],
241
+ } as any;
242
+
243
+ const rule = requireTestPrefixRule.create(mockContext);
244
+
245
+ const mockNode = {
246
+ type: 'CallExpression',
247
+ callee: { name: 'describe' },
248
+ arguments: [
249
+ { type: 'Identifier', name: 'myVariable' },
250
+ ],
251
+ } as any;
252
+
253
+ rule.CallExpression(mockNode);
254
+
255
+ expect(reportCalled).toBe(false);
256
+ });
257
+
258
+ it('| should handle beforeEach and afterEach', () => {
259
+ let reportCalled = false;
260
+ const mockContext = {
261
+ report: (options: any) => {
262
+ reportCalled = true;
263
+ expect(options.messageId).toBe('missingPrefix');
264
+ },
265
+ options: [{ prefix: '| ' }],
266
+ } as any;
267
+
268
+ const rule = requireTestPrefixRule.create(mockContext);
269
+
270
+ const mockNode = {
271
+ type: 'CallExpression',
272
+ callee: { name: 'beforeEach' },
273
+ arguments: [
274
+ { type: 'Literal', value: 'setup test data' },
275
+ ],
276
+ } as any;
277
+
278
+ rule.CallExpression(mockNode);
279
+
280
+ expect(reportCalled).toBe(true);
281
+ });
282
+
283
+ it('| should handle beforeAll and afterAll', () => {
284
+ let reportCalled = false;
285
+ const mockContext = {
286
+ report: (options: any) => {
287
+ reportCalled = true;
288
+ expect(options.messageId).toBe('missingPrefix');
289
+ },
290
+ options: [{ prefix: '| ' }],
291
+ } as any;
292
+
293
+ const rule = requireTestPrefixRule.create(mockContext);
294
+
295
+ const mockNode = {
296
+ type: 'CallExpression',
297
+ callee: { name: 'beforeAll' },
298
+ arguments: [
299
+ { type: 'Literal', value: 'setup suite' },
300
+ ],
301
+ } as any;
302
+
303
+ rule.CallExpression(mockNode);
304
+
305
+ expect(reportCalled).toBe(true);
306
+ });
307
+
308
+ it('| should handle custom prefix configuration', () => {
309
+ let reportCalled = false;
310
+ const mockContext = {
311
+ report: (options: any) => {
312
+ reportCalled = true;
313
+ expect(options.data.prefix).toBe('>>> ');
314
+ },
315
+ options: [{ prefix: '>>> ' }],
316
+ } as any;
317
+
318
+ const rule = requireTestPrefixRule.create(mockContext);
319
+
320
+ const mockNode = {
321
+ type: 'CallExpression',
322
+ callee: { name: 'describe' },
323
+ arguments: [
324
+ { type: 'Literal', value: 'my test suite' },
325
+ ],
326
+ } as any;
327
+
328
+ rule.CallExpression(mockNode);
329
+
330
+ expect(reportCalled).toBe(true);
331
+ });
332
+
333
+ it('| should handle custom test functions configuration', () => {
334
+ let reportCalled = false;
335
+ const mockContext = {
336
+ report: (options: any) => {
337
+ reportCalled = true;
338
+ },
339
+ options: [{ testFunctions: [ 'myTest' ] }],
340
+ } as any;
341
+
342
+ const rule = requireTestPrefixRule.create(mockContext);
343
+
344
+ const mockNode = {
345
+ type: 'CallExpression',
346
+ callee: { name: 'myTest' },
347
+ arguments: [
348
+ { type: 'Literal', value: 'my test description' },
349
+ ],
350
+ } as any;
351
+
352
+ rule.CallExpression(mockNode);
353
+
354
+ expect(reportCalled).toBe(true);
355
+ });
356
+
357
+ it('| should provide auto-fix functionality', () => {
358
+ const mockContext = {
359
+ report: (options: any) => {
360
+ expect(options.fix).toBeDefined();
361
+ expect(typeof options.fix).toBe('function');
362
+
363
+ // Test the fix function
364
+ const fixResult = options.fix({
365
+ replaceText: (node: any, text: string) => {
366
+ expect(text).toBe('\'| my test suite\'');
367
+
368
+ return [];
369
+ },
370
+ });
371
+
372
+ expect(Array.isArray(fixResult)).toBe(true);
373
+ },
374
+ options: [{ prefix: '| ' }],
375
+ } as any;
376
+
377
+ const rule = requireTestPrefixRule.create(mockContext);
378
+
379
+ const mockNode = {
380
+ type: 'CallExpression',
381
+ callee: { name: 'describe' },
382
+ arguments: [
383
+ { type: 'Literal', value: 'my test suite' },
384
+ ],
385
+ } as any;
386
+
387
+ rule.CallExpression(mockNode);
388
+ });
389
+
390
+ it('| should handle empty string descriptions', () => {
391
+ let reportCalled = false;
392
+ const mockContext = {
393
+ report: (options: any) => {
394
+ reportCalled = true;
395
+ expect(options.messageId).toBe('missingPrefix');
396
+ },
397
+ options: [{ prefix: '| ' }],
398
+ } as any;
399
+
400
+ const rule = requireTestPrefixRule.create(mockContext);
401
+
402
+ const mockNode = {
403
+ type: 'CallExpression',
404
+ callee: { name: 'describe' },
405
+ arguments: [
406
+ { type: 'Literal', value: '' },
407
+ ],
408
+ } as any;
409
+
410
+ rule.CallExpression(mockNode);
411
+
412
+ expect(reportCalled).toBe(true);
413
+ });
414
+
415
+ it('| should handle errors gracefully', () => {
416
+ const mockContext = {
417
+ report: (options: any) => {
418
+ // Should not throw
419
+ },
420
+ options: [{ prefix: '| ' }],
421
+ } as any;
422
+
423
+ const rule = requireTestPrefixRule.create(mockContext);
424
+
425
+ // Test with malformed nodes
426
+ const malformedNode = {
427
+ type: 'CallExpression',
428
+ // Missing required properties
429
+ } as any;
430
+
431
+ expect(() => {
432
+ rule.CallExpression(malformedNode);
433
+ }).not.toThrow();
434
+ });
435
+
436
+ it('| should handle missing callee gracefully', () => {
437
+ let reportCalled = false;
438
+ const mockContext = {
439
+ report: (options: any) => {
440
+ reportCalled = true;
441
+ },
442
+ options: [{ prefix: '| ' }],
443
+ } as any;
444
+
445
+ const rule = requireTestPrefixRule.create(mockContext);
446
+
447
+ const mockNode = {
448
+ type: 'CallExpression',
449
+ // Missing callee
450
+ arguments: [
451
+ { type: 'Literal', value: 'my test suite' },
452
+ ],
453
+ } as any;
454
+
455
+ rule.CallExpression(mockNode);
456
+
457
+ expect(reportCalled).toBe(false);
458
+ });
459
+ });