diff --git a/src/client/testing/testController/controller.ts b/src/client/testing/testController/controller.ts index 04de209c171d..e632788e62be 100644 --- a/src/client/testing/testController/controller.ts +++ b/src/client/testing/testController/controller.ts @@ -238,6 +238,13 @@ export class PythonTestController implements ITestController, IExtensionSingleAc workspaces.forEach((workspace) => { this.activateLegacyWorkspace(workspace); }); + this.disposables.push( + this.workspaceService.onDidChangeWorkspaceFolders((evt) => { + evt.added.forEach((workspace) => { + this.activateLegacyWorkspace(workspace); + }); + }), + ); } /** diff --git a/src/test/testing/testController/controller.unit.test.ts b/src/test/testing/testController/controller.unit.test.ts index feb5f36fc797..bf82a506ae0f 100644 --- a/src/test/testing/testController/controller.unit.test.ts +++ b/src/test/testing/testController/controller.unit.test.ts @@ -46,7 +46,7 @@ suite('PythonTestController', () => { sandbox.restore(); }); - function createController(options?: { unittestEnabled?: boolean; interpreter?: any }): any { + function createController(options?: { unittestEnabled?: boolean; interpreter?: any; workspaceService?: any }): any { const unittestEnabled = options?.unittestEnabled ?? false; const interpreter = options?.interpreter ?? @@ -57,7 +57,7 @@ suite('PythonTestController', () => { sysPrefix: '/usr', } as any); - const workspaceService = ({ workspaceFolders: [] } as unknown) as any; + const workspaceService = options?.workspaceService ?? (({ workspaceFolders: [] } as unknown) as any); const configSettings = ({ getSettings: sandbox.stub().returns({ testing: { @@ -223,6 +223,34 @@ suite('PythonTestController', () => { assert.strictEqual(projects[0].projectUri.toString(), workspaceUri.toString()); }); + test('Tests can be discovered in workspace folder added after the extension has been activated', async () => { + const addedFolder = vscode.Uri.file('/addedFolder'); + const addedWf: vscode.WorkspaceFolder = { uri: addedFolder } as any; + const onDidChangeWorkspaceFolders = new vscode.EventEmitter(); + const fakeDiscoveryAdapter = sandbox.stub().resolves(undefined); + sandbox.stub(projectUtils, 'createTestAdapters').returns({ + discoveryAdapter: { discoverTests: fakeDiscoveryAdapter }, + } as any); + + const controller: PythonTestController = createController({ + unittestEnabled: true, + workspaceService: { + workspaceFolders: [], + onDidChangeWorkspaceFolders: onDidChangeWorkspaceFolders.event, + getWorkspaceFolder: (uri: vscode.Uri) => (uri === addedFolder ? addedWf : undefined), + }, + }); + await controller.activate(); + + onDidChangeWorkspaceFolders.fire({ + added: [addedWf], + removed: [], + }); + + await controller.refreshTestData(addedFolder, { forceRefresh: true }); + assert.strictEqual(fakeDiscoveryAdapter.calledWith(addedFolder), true); + }); + test('filters Python projects to workspace and creates adapters for each', async () => { const workspaceUri: Uri = vscode.Uri.file('/workspace/root');