diff --git a/packages/extension/src/testTree.ts b/packages/extension/src/testTree.ts index 8a85b84d..42ba4b64 100644 --- a/packages/extension/src/testTree.ts +++ b/packages/extension/src/testTree.ts @@ -146,7 +146,11 @@ export class TestTree extends vscode.Disposable { const normalizedFile = normalize(file) const fileId = `${normalizedFile}${project}` const cached = this.fileItems.get(fileId) - if (cached) return cached + if (cached) { + // the file can be included in several configs (#799) + if (!cached.tags.includes(api.tag)) cached.tags = [...cached.tags, api.tag] + return cached + } const fileUri = vscode.Uri.file(resolve(file)) const parentItem = this.getOrCreateFolderTestItem(api, dirname(file)) diff --git a/test/unit/testTree.test.ts b/test/unit/testTree.test.ts new file mode 100644 index 00000000..e2a44ce1 --- /dev/null +++ b/test/unit/testTree.test.ts @@ -0,0 +1,44 @@ +import { resolve } from 'node:path' +import * as vscode from 'vscode' +import { expect } from 'chai' +import type { VitestProcessAPI } from '../../packages/extension/src/apiProcess' +import { TransformSchemaProvider } from '../../packages/extension/src/schemaProvider' +import { TagsManager } from '../../packages/extension/src/tagsManager' +import { TestTree } from '../../packages/extension/src/testTree' + +describe('TestTree', () => { + it('adds every config tag to a shared test file', () => { + const controller = vscode.tests.createTestController('test-tree', 'Vitest') + const loader = controller.createTestItem('loader', 'Loading') + const schemaProvider = new TransformSchemaProvider(async () => null) + const tree = new TestTree(controller, loader, new TagsManager(), schemaProvider) + const root = resolve(__dirname, '../..') + const workspaceFolder = { + uri: vscode.Uri.file(root), + name: 'vscode', + index: 0, + } + const file = resolve(__dirname, 'testTree.test.ts') + const metadata = { project: '', pool: 'threads' } + const baseApi = { + tag: new vscode.TestTag('root:vitest.config.base.ts'), + } as VitestProcessAPI + const packageApi = { + tag: new vscode.TestTag('foo:vitest.config.ts'), + } as VitestProcessAPI + + tree.reset([workspaceFolder]) + const item = tree.getOrCreateFileTestItem(baseApi, metadata, file) + const cachedItem = tree.getOrCreateFileTestItem(packageApi, metadata, file) + + expect(cachedItem).to.equal(item) + expect(cachedItem.tags.map((tag) => tag.id)).to.deep.equal([ + 'root:vitest.config.base.ts', + 'foo:vitest.config.ts', + ]) + + tree.dispose() + schemaProvider.dispose() + controller.dispose() + }) +})