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