diff --git a/src/features/views/treeViewItems.ts b/src/features/views/treeViewItems.ts index ea7c20f5..ba7a51ba 100644 --- a/src/features/views/treeViewItems.ts +++ b/src/features/views/treeViewItems.ts @@ -65,6 +65,7 @@ export class EnvManagerTreeItem implements EnvTreeItem { public readonly parent: undefined; constructor(public readonly manager: InternalEnvironmentManager) { const item = new TreeItem(manager.displayName, TreeItemCollapsibleState.Collapsed); + item.id = manager.id; item.contextValue = this.getContextValue(); item.description = manager.description; item.tooltip = manager.tooltip ?? manager.description; @@ -88,6 +89,7 @@ export class PythonGroupEnvTreeItem implements EnvTreeItem { ) { const label = typeof group === 'string' ? group : group.name; const item = new TreeItem(label, TreeItemCollapsibleState.Collapsed); + item.id = `${this.parent.manager.id}:${label}`; item.contextValue = `pythonEnvGroup;${this.parent.manager.id}:${label};`; this.treeItem = item; @@ -127,6 +129,7 @@ export class PythonEnvTreeItem implements EnvTreeItem { } const item = new TreeItem(name, TreeItemCollapsibleState.Collapsed); + item.id = environment.envId.id; item.contextValue = this.getContextValue(); // Build description with optional [uv] indicator and disambiguation suffix diff --git a/src/test/features/views/treeViewItems.unit.test.ts b/src/test/features/views/treeViewItems.unit.test.ts index 738f8398..f35f39ae 100644 --- a/src/test/features/views/treeViewItems.unit.test.ts +++ b/src/test/features/views/treeViewItems.unit.test.ts @@ -4,6 +4,7 @@ import { EnvManagerTreeItem, getEnvironmentParentDirName, PythonEnvTreeItem, + PythonGroupEnvTreeItem, } from '../../../features/views/treeViewItems'; import { InternalEnvironmentManager, PythonEnvironmentImpl } from '../../../internal.api'; @@ -73,6 +74,17 @@ function createMockManager( suite('Test TreeView Items', () => { suite('EnvManagerTreeItem', () => { + test('Sets id to manager id for tree item identification', () => { + // Arrange + const manager = createMockManager({ id: 'ms-python.python:venv' }); + + // Act + const item = new EnvManagerTreeItem(manager); + + // Assert + assert.strictEqual(item.treeItem.id, 'ms-python.python:venv'); + }); + test('Context value excludes create when manager does not support it', () => { // Arrange const manager = createMockManager({ supportsCreate: false }); @@ -127,6 +139,20 @@ suite('Test TreeView Items', () => { managerWithRemove = new EnvManagerTreeItem(createMockManager({ supportsRemove: true })); }); + test('Sets id to environment id for tree item identification', () => { + // Arrange + const env = createMockEnvironment({ + id: 'unique-env-id-123', + environmentPath: '/home/user/envs/.venv/bin/python', + }); + + // Act + const item = new PythonEnvTreeItem(env, managerWithoutRemove); + + // Assert + assert.strictEqual(item.treeItem.id, 'unique-env-id-123'); + }); + test('Context value excludes remove and activatable when not supported', () => { // Arrange const env = createMockEnvironment({ @@ -242,6 +268,60 @@ suite('Test TreeView Items', () => { }); }); + suite('PythonGroupEnvTreeItem', () => { + let parentManager: EnvManagerTreeItem; + + setup(() => { + parentManager = new EnvManagerTreeItem(createMockManager({ id: 'ms-python.python:conda' })); + }); + + test('Sets id combining manager id and group name for tree item identification', () => { + // Arrange & Act + const item = new PythonGroupEnvTreeItem(parentManager, 'base'); + + // Assert + assert.strictEqual(item.treeItem.id, 'ms-python.python:conda:base'); + }); + + test('Sets id correctly when group is EnvironmentGroupInfo object', () => { + // Arrange + const groupInfo = { name: 'dev-envs', description: 'Development environments' }; + + // Act + const item = new PythonGroupEnvTreeItem(parentManager, groupInfo); + + // Assert + assert.strictEqual(item.treeItem.id, 'ms-python.python:conda:dev-envs'); + }); + + test('Uses string group as label', () => { + // Arrange & Act + const item = new PythonGroupEnvTreeItem(parentManager, 'my-group'); + + // Assert + assert.strictEqual(item.treeItem.label, 'my-group'); + }); + + test('Uses group name from EnvironmentGroupInfo as label', () => { + // Arrange + const groupInfo = { name: 'production', description: 'Production environments' }; + + // Act + const item = new PythonGroupEnvTreeItem(parentManager, groupInfo); + + // Assert + assert.strictEqual(item.treeItem.label, 'production'); + }); + + test('Sets contextValue with manager id and group name', () => { + // Arrange & Act + const item = new PythonGroupEnvTreeItem(parentManager, 'test-group'); + + // Assert + assert.strictEqual(item.treeItem.contextValue, 'pythonEnvGroup;ms-python.python:conda:test-group;'); + }); + }); + suite('getEnvironmentParentDirName', () => { test('Extracts parent folder from Unix path with bin directory', () => { // Arrange