Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/chatSessions/copilotcli/vscode-node/test/diffCommands.spec.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 { beforeEach, describe, expect, it, vi } from 'vitest';
7
import { TestLogService } from '../../../../../platform/testing/common/testLogService';
8
9
const { mockRegisterCommand, mockTabGroups } = vi.hoisted(() => ({
10
mockRegisterCommand: vi.fn(),
11
mockTabGroups: {
12
activeTabGroup: { activeTab: null as unknown },
13
all: [] as unknown[],
14
close: vi.fn().mockResolvedValue(undefined),
15
onDidChangeTabGroups: () => ({ dispose: () => { } }),
16
onDidChangeTabs: vi.fn(() => ({ dispose: () => { } })),
17
},
18
}));
19
20
vi.mock('vscode', () => ({
21
window: {
22
tabGroups: mockTabGroups,
23
},
24
commands: {
25
registerCommand: (...args: unknown[]) => mockRegisterCommand(...args),
26
executeCommand: vi.fn().mockResolvedValue(undefined),
27
},
28
TabInputTextDiff: class TabInputTextDiff {
29
constructor(public original: unknown, public modified: unknown) { }
30
},
31
}));
32
33
import * as vscode from 'vscode';
34
import { DiffStateManager, type ActiveDiff } from '../diffState';
35
import { registerDiffCommands, ACCEPT_DIFF_COMMAND, REJECT_DIFF_COMMAND } from '../commands/diffCommands';
36
37
function createTestDiff(tabName: string): ActiveDiff {
38
const modifiedUri = { toString: () => 'modified://' + tabName } as unknown as vscode.Uri;
39
const originalUri = { toString: () => 'original://' + tabName } as unknown as vscode.Uri;
40
return {
41
diffId: 'diff-' + tabName,
42
tabName,
43
originalUri,
44
modifiedUri,
45
newContents: 'new content',
46
cleanup: vi.fn(),
47
resolve: vi.fn(),
48
};
49
}
50
51
function createDiffTab(tabName: string, modifiedUri: vscode.Uri) {
52
return {
53
label: tabName,
54
input: new vscode.TabInputTextDiff(
55
{ scheme: 'copilot-cli-readonly' } as unknown as vscode.Uri,
56
modifiedUri,
57
),
58
};
59
}
60
61
describe('diff accept/reject commands', () => {
62
const logger = new TestLogService();
63
let diffState: DiffStateManager;
64
let registeredCommands: Map<string, (...args: unknown[]) => void>;
65
66
beforeEach(() => {
67
vi.clearAllMocks();
68
diffState = new DiffStateManager(logger);
69
registeredCommands = new Map();
70
71
mockRegisterCommand.mockImplementation((name: string, callback: (...args: unknown[]) => void) => {
72
registeredCommands.set(name, callback);
73
return { dispose: () => { } };
74
});
75
76
mockTabGroups.activeTabGroup = { activeTab: null };
77
mockTabGroups.all = [];
78
});
79
80
it('should register accept and reject commands', () => {
81
registerDiffCommands(logger, diffState);
82
83
expect(registeredCommands.has(ACCEPT_DIFF_COMMAND)).toBe(true);
84
expect(registeredCommands.has(REJECT_DIFF_COMMAND)).toBe(true);
85
});
86
87
it('should resolve diff as SAVED when accept command is executed', () => {
88
registerDiffCommands(logger, diffState);
89
90
const diff = createTestDiff('Test Diff');
91
diffState.register(diff);
92
93
const tab = createDiffTab('Test Diff', diff.modifiedUri);
94
mockTabGroups.activeTabGroup = { activeTab: tab };
95
96
registeredCommands.get(ACCEPT_DIFF_COMMAND)!();
97
98
expect(diff.cleanup).toHaveBeenCalled();
99
expect(diff.resolve).toHaveBeenCalledWith(
100
expect.objectContaining({ status: 'SAVED', trigger: 'accepted_via_button' }),
101
);
102
});
103
104
it('should resolve diff as REJECTED when reject command is executed', () => {
105
registerDiffCommands(logger, diffState);
106
107
const diff = createTestDiff('Reject Diff');
108
diffState.register(diff);
109
110
const tab = createDiffTab('Reject Diff', diff.modifiedUri);
111
mockTabGroups.activeTabGroup = { activeTab: tab };
112
113
registeredCommands.get(REJECT_DIFF_COMMAND)!();
114
115
expect(diff.cleanup).toHaveBeenCalled();
116
expect(diff.resolve).toHaveBeenCalledWith(
117
expect.objectContaining({ status: 'REJECTED', trigger: 'rejected_via_button' }),
118
);
119
});
120
121
it('should not resolve when active tab is not a diff tab', () => {
122
registerDiffCommands(logger, diffState);
123
124
mockTabGroups.activeTabGroup = { activeTab: { label: 'Not A Diff', input: {} } };
125
126
// Should not throw
127
registeredCommands.get(ACCEPT_DIFF_COMMAND)!();
128
});
129
130
it('should not resolve when there is no active tab', () => {
131
registerDiffCommands(logger, diffState);
132
133
mockTabGroups.activeTabGroup = { activeTab: null };
134
135
registeredCommands.get(REJECT_DIFF_COMMAND)!();
136
});
137
138
it('should not close the tab (tab closing is handled by closeDiff tool)', () => {
139
registerDiffCommands(logger, diffState);
140
141
const diff = createTestDiff('Close Test');
142
diffState.register(diff);
143
144
const tab = createDiffTab('Close Test', diff.modifiedUri);
145
mockTabGroups.activeTabGroup = { activeTab: tab };
146
147
registeredCommands.get(ACCEPT_DIFF_COMMAND)!();
148
149
// diffCommands resolves the diff but does NOT close the tab
150
expect(diff.resolve).toHaveBeenCalled();
151
expect(mockTabGroups.close).not.toHaveBeenCalled();
152
});
153
});
154
155