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: [], + }); +});