diff --git a/packages/vscode/src/stacks/test/worker/index.ts b/packages/vscode/src/stacks/test/worker/index.ts index 79b4dc4..45f9bcd 100644 --- a/packages/vscode/src/stacks/test/worker/index.ts +++ b/packages/vscode/src/stacks/test/worker/index.ts @@ -129,9 +129,13 @@ export class Worker { ? { ...data.coverage, reporters: [new CoverageReporter()] } : data.coverage, }); - const runOptions = { filters: fileFilters } satisfies NonNullable< - Parameters[0] - >; + const runOptions: NonNullable[0]> = { + filters: fileFilters, + }; + // Project configs receive operation options, not root config overrides. + if (data.testNamePattern !== undefined) { + runOptions.testNamePattern = data.testNamePattern; + } if (command === 'watch') { const startup = rstest.watch(runOptions); this.watcherStartupPromise = startup; diff --git a/packages/vscode/tests/stacks/test/master.test.ts b/packages/vscode/tests/stacks/test/master.test.ts index 00a098e..70887c9 100644 --- a/packages/vscode/tests/stacks/test/master.test.ts +++ b/packages/vscode/tests/stacks/test/master.test.ts @@ -1018,6 +1018,28 @@ describe('Rstest public API', () => { }); describe('Rstest public run lifecycle', () => { + it('passes a selected test name to the run operation', async () => { + const engineRun = rs.fn(async () => ({ + status: 'pass', + unhandledErrors: [], + })); + const worker = new Worker(); + rs.spyOn(worker as any, 'init').mockResolvedValue({ + command: 'run', + fileFilters: ['"/x/file.test.ts"'], + rstest: { run: engineRun }, + }); + + await worker.runTest({ + testNamePattern: '^selected test$', + } as WorkerInitOptions); + + expect(engineRun).toHaveBeenCalledWith({ + filters: ['"/x/file.test.ts"'], + testNamePattern: '^selected test$', + }); + }); + it.each([ { filter: '/x/tests', kind: 'folder' }, { filter: '"/x/tests/file.test.ts"', kind: 'file' },