import { TSESLint } from '@typescript-eslint/utils'; import { RuleRunner } from '../rule-runner'; import { createAssertConfigRule } from '../utils/testing-rules/assert-config'; describe('ruleRunner', () => { describe('when providing configs', () => { const config = ({} as unknown) as TSESLint.RuleTesterConfig; const code = ''; const ruleName = 'ruleName'; let linter: TSESLint.Linter; beforeEach(() => { linter = new TSESLint.Linter(); }); it('overrides the filename', () => { const wantFileName = 'want.filename.tsx'; const callback = jest.fn(); const rule = createAssertConfigRule((context) => callback(context.getFilename()), ); linter.defineRule(ruleName, rule); new RuleRunner({ code, linter, ruleName, config }) .withFileName(wantFileName) .render(); expect(callback).toBeCalledTimes(1); expect(callback).toBeCalledWith(wantFileName); }); it('produces if the filename is not provided', () => { const callback = jest.fn(); const rule = createAssertConfigRule((context) => { callback(context.getFilename()); }); linter.defineRule(ruleName, rule); new RuleRunner({ code, linter, ruleName, config }).render(); expect(callback).toBeCalledTimes(1); expect(callback).toBeCalledWith(''); }); it('can add the settings', () => { const callback = jest.fn(); const wantSetting = { a: 1, b: 2, c: 3 }; const rule = createAssertConfigRule((context) => { callback(context.settings); }); linter.defineRule(ruleName, rule); new RuleRunner({ code, linter, ruleName, config }) .overrideConfig({ settings: wantSetting }) .render(); expect(callback).toBeCalledTimes(1); expect(callback).toBeCalledWith(wantSetting); }); it('overrides ecmaVersion in parserOptions', () => { const callback = jest.fn(); const wantParserOptions = { ecmaVersion: 6, }; const rule = createAssertConfigRule((context) => { callback(context.parserOptions); }); linter.defineRule(ruleName, rule); new RuleRunner({ code, linter, ruleName, config }) .overrideConfig({ parserOptions: { ecmaVersion: 6 } }) .render(); expect(callback).toBeCalledTimes(1); expect(callback).toBeCalledWith(wantParserOptions); }); }); describe('when calling render', () => { const markResult = jest.fn(); function mockLinter({ lintMessages, fixReport, }: { // eslint-disable-next-line @typescript-eslint/no-explicit-any lintMessages: readonly any[]; fixReport?: { output: string }; }): TSESLint.Linter { // eslint-disable-next-line @typescript-eslint/no-explicit-any const linter: any = { verify: () => lintMessages, verifyAndFix: () => fixReport, getRules: () => ({ get: () => ({ meta: { fixable: fixReport == null ? false : 'code', }, }), }), }; return (linter as unknown) as TSESLint.Linter; } function createRuleRunner({ code = '', fixReport, lintMessages, }: { code?: string; fixReport?: { output: string }; // eslint-disable-next-line @typescript-eslint/no-explicit-any lintMessages: readonly any[]; }) { return new RuleRunner({ code, config: { parser: 'any' }, linter: mockLinter({ lintMessages, fixReport }), ruleName: 'any', markResult, }); } beforeEach(() => { markResult.mockClear(); }); it('returns lintMessages if the rule is not fixable', () => { const ruleRunner = createRuleRunner({ lintMessages: [{ a: 1 }] }); const { lintMessages } = ruleRunner.render(); expect(lintMessages).toEqual([{ a: 1 }]); }); it('returns empty fixedOutput if the rule is not fixable', () => { const ruleRunner = createRuleRunner({ lintMessages: [{ a: 1 }] }); const { fixedOutput } = ruleRunner.render(); expect(fixedOutput).toEqual(undefined); }); it('returns the snapshot from markResult', () => { markResult.mockReturnValue('return value'); const ruleRunner = createRuleRunner({ lintMessages: [{ a: 1 }] }); const { snapshot } = ruleRunner.render(); expect(snapshot).toEqual('return value'); }); it('returns the lintMessages if the rule is fixable', () => { const ruleRunner = createRuleRunner({ lintMessages: [{ a: 1 }], fixReport: { output: 'fixed' }, }); const { lintMessages } = ruleRunner.render(); expect(lintMessages).toEqual([{ a: 1 }]); }); it('returns the fixedSnapshot if the rule is fixable', () => { const ruleRunner = createRuleRunner({ lintMessages: [{ a: 1 }], fixReport: { output: 'fixed' }, }); const { fixedOutput } = ruleRunner.render(); expect(fixedOutput).toEqual('fixed'); }); it('returns the snapshot from markResult if the rule is fixable', () => { markResult.mockReturnValue('return value'); const ruleRunner = createRuleRunner({ lintMessages: [{ a: 1 }], fixReport: { output: 'fixed' }, }); const { snapshot } = ruleRunner.render(); expect(snapshot).toEqual('return value'); }); }); });