Path: blob/main/src/vs/sessions/contrib/copilotChatSessions/test/browser/isolationPicker.test.ts
13406 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { Event } from '../../../../../base/common/event.js';7import { DisposableStore } from '../../../../../base/common/lifecycle.js';8import { observableValue } from '../../../../../base/common/observable.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';10import { IActionWidgetService } from '../../../../../platform/actionWidget/browser/actionWidget.js';11import { IActionListItem } from '../../../../../platform/actionWidget/browser/actionList.js';12import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';13import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';14import { TestInstantiationService } from '../../../../../platform/instantiation/test/common/instantiationServiceMock.js';15import { GitRefType } from '../../../../../workbench/contrib/git/common/gitService.js';16import { ISessionsProvidersService } from '../../../../services/sessions/browser/sessionsProvidersService.js';17import { IActiveSession, ISessionsManagementService } from '../../../../services/sessions/common/sessionsManagement.js';18import { CopilotChatSessionsProvider } from '../../browser/copilotChatSessionsProvider.js';19import { IsolationMode, IsolationPicker } from '../../browser/isolationPicker.js';2021interface IIsolationActionItem {22readonly mode: IsolationMode;23readonly checked?: boolean;24}2526function showPicker(container: HTMLElement): void {27const trigger = container.querySelector<HTMLElement>('a.action-label');28assert.ok(trigger);29trigger.click();30}3132function createPicker(33disposables: DisposableStore,34mode: IsolationMode,35actionWidgetItems: IActionListItem<IIsolationActionItem>[],36): IsolationPicker {37const instantiationService = disposables.add(new TestInstantiationService());38const activeSession = {39providerId: 'default-copilot',40sessionId: 'session-id',41loading: observableValue('loading', false),42} as unknown as IActiveSession;43const isolationMode = observableValue<IsolationMode | undefined>('isolationMode', mode);44const gitState = observableValue('gitState', {45HEAD: { type: GitRefType.Head, name: 'main', commit: 'abc123' },46remotes: [],47mergeChanges: [],48indexChanges: [],49workingTreeChanges: [],50untrackedChanges: [],51});52const provider = Object.assign(Object.create(CopilotChatSessionsProvider.prototype), {53getSession: () => ({54gitRepository: { state: gitState },55isolationMode,56}),57});5859instantiationService.stub(IActionWidgetService, {60isVisible: false,61hide: () => { },62show: <T>(_id: string, _supportsPreview: boolean, items: IActionListItem<T>[]) => {63actionWidgetItems.splice(0, actionWidgetItems.length, ...(items as IActionListItem<IIsolationActionItem>[]));64},65});66instantiationService.stub(IConfigurationService, new TestConfigurationService());67instantiationService.stub(ISessionsManagementService, {68activeSession: observableValue<IActiveSession | undefined>('activeSession', activeSession),69} as unknown as ISessionsManagementService);70instantiationService.stub(ISessionsProvidersService, {71onDidChangeProviders: Event.None,72getProviders: () => [],73getProvider: () => provider,74} as unknown as ISessionsProvidersService);7576return disposables.add(instantiationService.createInstance(IsolationPicker));77}7879suite('IsolationPicker', () => {80const disposables = new DisposableStore();8182teardown(() => {83disposables.clear();84});8586ensureNoDisposablesAreLeakedInTestSuite();8788test('marks folder as checked when workspace isolation is selected', () => {89const actionWidgetItems: IActionListItem<IIsolationActionItem>[] = [];90const picker = createPicker(disposables, 'workspace', actionWidgetItems);91const container = document.createElement('div');92picker.render(container);93showPicker(container);9495assert.deepStrictEqual(96actionWidgetItems.map(item => ({ label: item.label, checked: item.item?.checked })),97[98{ label: 'Worktree', checked: undefined },99{ label: 'Folder', checked: true },100],101);102});103104test('marks worktree as checked when worktree isolation is selected', () => {105const actionWidgetItems: IActionListItem<IIsolationActionItem>[] = [];106const picker = createPicker(disposables, 'worktree', actionWidgetItems);107const container = document.createElement('div');108picker.render(container);109showPicker(container);110111assert.deepStrictEqual(112actionWidgetItems.map(item => ({ label: item.label, checked: item.item?.checked })),113[114{ label: 'Worktree', checked: true },115{ label: 'Folder', checked: undefined },116],117);118});119});120121122