Skip to content

Commit 6de5ae8

Browse files
committed
test: harden rule-system alignment with derived IDs and 7 new checks
1 parent 617a3d6 commit 6de5ae8

1 file changed

Lines changed: 62 additions & 16 deletions

File tree

packages/core/src/config.test.ts

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,8 @@ import {
88
import { allRules } from './rules/index.js';
99
import { resolvePreset, getPresetNames } from './presets.js';
1010

11-
const ALL_RULE_IDS = [
12-
'unused-imports',
13-
'complexity-hotspot',
14-
'optional-chaining',
15-
'boolean-simplification',
16-
'early-return',
17-
'no-debugger',
18-
'no-empty-catch',
19-
'no-useless-return',
20-
'ts-diagnostics',
21-
'no-console',
22-
'no-empty-function',
23-
'duplicate-imports',
24-
'no-unreachable-after-return',
25-
'no-throw-literal',
26-
];
11+
// Canonical rule ID list — add new rule IDs here when adding rules
12+
const ALL_RULE_IDS = allRules.map((r) => r.id).sort();
2713

2814
describe('parseConfig', () => {
2915
it('parses a valid config', () => {
@@ -168,3 +154,63 @@ describe('cliRulesToConfig', () => {
168154
expect(config['no-debugger']).toBe('warn');
169155
});
170156
});
157+
158+
describe('rule-system alignment', () => {
159+
it('every rule in allRules is present in DEFAULT_CONFIG', () => {
160+
const defaults = mergeConfig(null);
161+
for (const rule of allRules) {
162+
expect(defaults, `rule "${rule.id}" missing from DEFAULT_CONFIG`).toHaveProperty(rule.id);
163+
}
164+
});
165+
166+
it('DEFAULT_CONFIG has no entries for unknown rules', () => {
167+
const defaults = mergeConfig(null);
168+
const ruleIdSet = new Set(allRules.map((r) => r.id));
169+
for (const key of Object.keys(defaults)) {
170+
expect(ruleIdSet.has(key), `DEFAULT_CONFIG contains unknown rule "${key}"`).toBe(true);
171+
}
172+
});
173+
174+
it('every preset references only known rule IDs', () => {
175+
const ruleIdSet = new Set(allRules.map((r) => r.id));
176+
for (const presetName of getPresetNames()) {
177+
const config = resolvePreset(presetName)!;
178+
for (const key of Object.keys(config)) {
179+
expect(ruleIdSet.has(key), `preset "${presetName}" references unknown rule "${key}"`).toBe(true);
180+
}
181+
}
182+
});
183+
184+
it('every preset covers every rule', () => {
185+
for (const presetName of getPresetNames()) {
186+
const config = resolvePreset(presetName)!;
187+
for (const id of ALL_RULE_IDS) {
188+
expect(config, `preset "${presetName}" missing rule "${id}"`).toHaveProperty(id);
189+
}
190+
}
191+
});
192+
193+
it('filterRulesByConfig returns consistent results with DEFAULT_CONFIG', () => {
194+
const defaults = mergeConfig(null);
195+
const filtered = filterRulesByConfig(allRules, defaults);
196+
const filteredIds = new Set(filtered.map((r) => r.id));
197+
198+
for (const [id, setting] of Object.entries(defaults)) {
199+
if (setting === 'off') {
200+
expect(filteredIds.has(id), `rule "${id}" is off but still active`).toBe(false);
201+
} else {
202+
expect(filteredIds.has(id), `rule "${id}" is ${setting} but not active`).toBe(true);
203+
}
204+
}
205+
});
206+
207+
it('allRules has no duplicate IDs', () => {
208+
const ids = allRules.map((r) => r.id);
209+
expect(new Set(ids).size).toBe(ids.length);
210+
});
211+
212+
it('allRules count matches DEFAULT_CONFIG key count', () => {
213+
const defaults = mergeConfig(null);
214+
expect(Object.keys(defaults).length).toBe(allRules.length);
215+
});
216+
});

0 commit comments

Comments
 (0)