From 35aaeb7b77455629ed053643ba9e5e3eb6fd47cf Mon Sep 17 00:00:00 2001 From: lotmek Date: Mon, 14 Oct 2024 18:01:17 -0400 Subject: [PATCH] fix(rule-tester): allow custom filename outside directory --- packages/rule-tester/src/RuleTester.ts | 10 ++++- packages/rule-tester/tests/filename.test.ts | 48 +++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 packages/rule-tester/tests/filename.test.ts diff --git a/packages/rule-tester/src/RuleTester.ts b/packages/rule-tester/src/RuleTester.ts index 9c04e0363c48..72b6b87a83cb 100644 --- a/packages/rule-tester/src/RuleTester.ts +++ b/packages/rule-tester/src/RuleTester.ts @@ -746,7 +746,15 @@ export class RuleTester extends TestFramework { ...configWithoutCustomKeys.linterOptions, }, }); - messages = this.#linter.verify(code, actualConfig, filename); + messages = this.#linter.verify( + code, + // ESLint uses an internal FlatConfigArray that extends @humanwhocodes/config-array. + Object.assign([], { + basePath: filename ? path.parse(filename).root : '', + getConfig: () => actualConfig, + }), + filename, + ); } finally { SourceCode.prototype.applyInlineConfig = applyInlineConfig; SourceCode.prototype.applyLanguageOptions = applyLanguageOptions; diff --git a/packages/rule-tester/tests/filename.test.ts b/packages/rule-tester/tests/filename.test.ts new file mode 100644 index 000000000000..1c68f4ba196d --- /dev/null +++ b/packages/rule-tester/tests/filename.test.ts @@ -0,0 +1,48 @@ +/* eslint-disable perfectionist/sort-objects */ +import { RuleTester } from '@typescript-eslint/rule-tester'; +import { ESLintUtils } from '@typescript-eslint/utils'; + +const ruleTester = new RuleTester(); + +const rule = ESLintUtils.RuleCreator.withoutDocs({ + meta: { + docs: { + description: 'some description', + }, + messages: { + foo: 'It works', + }, + schema: [], + type: 'problem', + }, + defaultOptions: [], + create: context => ({ + Program(node): void { + context.report({ node, messageId: 'foo' }); + }, + }), +}); + +describe('rule tester filename', () => { + ruleTester.run('absolute path', rule, { + invalid: [ + { + code: '_', + errors: [{ messageId: 'foo' }], + filename: '/an-absolute-path/foo.js', + }, + ], + valid: [], + }); + + ruleTester.run('relative path', rule, { + invalid: [ + { + code: '_', + errors: [{ messageId: 'foo' }], + filename: '../foo.js', + }, + ], + valid: [], + }); +});