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/readonlyContentProvider.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
8
vi.mock('vscode', () => ({
9
Uri: {
10
file: (path: string) => ({
11
scheme: 'file',
12
path,
13
fsPath: path,
14
toString: () => `file://${path}`,
15
}),
16
from: (components: { scheme: string; path: string; query: string }) => ({
17
scheme: components.scheme,
18
path: components.path,
19
query: components.query,
20
toString: () => `${components.scheme}:${components.path}?${components.query}`,
21
}),
22
},
23
workspace: {
24
registerTextDocumentContentProvider: vi.fn(() => ({ dispose: () => { } })),
25
},
26
}));
27
28
import type { Uri } from 'vscode';
29
import { ReadonlyContentProvider, createReadonlyUri } from '../readonlyContentProvider';
30
31
/** Creates a mock URI using the same factory as the source code */
32
function mockUri(path: string, query: string): Uri {
33
return createReadonlyUri(path, query);
34
}
35
36
describe('ReadonlyContentProvider', () => {
37
let provider: ReadonlyContentProvider;
38
39
beforeEach(() => {
40
provider = new ReadonlyContentProvider();
41
});
42
43
it('should store and retrieve content by URI', () => {
44
const uri = mockUri('/test/file.ts', 'version=1');
45
provider.setContent(uri, 'Hello World');
46
47
const content = provider.provideTextDocumentContent(uri);
48
49
expect(content).toBe('Hello World');
50
});
51
52
it('should return empty string for unknown URIs', () => {
53
const content = provider.provideTextDocumentContent(mockUri('/unknown/file.ts', 'version=1'));
54
55
expect(content).toBe('');
56
});
57
58
it('should clear content', () => {
59
const uri = mockUri('/test/file.ts', 'version=1');
60
provider.setContent(uri, 'Hello World');
61
provider.clearContent(uri);
62
63
const content = provider.provideTextDocumentContent(uri);
64
65
expect(content).toBe('');
66
});
67
68
it('should overwrite existing content', () => {
69
const uri = mockUri('/test/file.ts', 'v=1');
70
provider.setContent(uri, 'First content');
71
provider.setContent(uri, 'Updated content');
72
73
const content = provider.provideTextDocumentContent(uri);
74
75
expect(content).toBe('Updated content');
76
});
77
78
it('should distinguish URIs by query parameter', () => {
79
const originalUri = mockUri('/test/file.ts', 'original');
80
const modifiedUri = mockUri('/test/file.ts', 'modified');
81
82
provider.setContent(originalUri, 'Original');
83
provider.setContent(modifiedUri, 'Modified');
84
85
expect(provider.provideTextDocumentContent(originalUri)).toBe('Original');
86
expect(provider.provideTextDocumentContent(modifiedUri)).toBe('Modified');
87
});
88
89
it('should register as a text document content provider', async () => {
90
const disposable = provider.register();
91
92
const vscodeModule = await import('vscode');
93
expect(vscodeModule.workspace.registerTextDocumentContentProvider).toHaveBeenCalled();
94
expect(disposable).toBeDefined();
95
});
96
97
it('should handle URIs with special characters in path', () => {
98
const uri = mockUri('/test/file with spaces.ts', 'version=1');
99
provider.setContent(uri, 'Special content');
100
101
const content = provider.provideTextDocumentContent(uri);
102
103
expect(content).toBe('Special content');
104
});
105
106
it('should handle empty content', () => {
107
const uri = mockUri('/test/empty.ts', 'v=1');
108
provider.setContent(uri, '');
109
110
const content = provider.provideTextDocumentContent(uri);
111
112
expect(content).toBe('');
113
});
114
115
it('should handle multiple different files', () => {
116
const uri1 = mockUri('/file1.ts', 'v=1');
117
const uri2 = mockUri('/file2.ts', 'v=1');
118
const uri3 = mockUri('/file3.ts', 'v=1');
119
120
provider.setContent(uri1, 'Content 1');
121
provider.setContent(uri2, 'Content 2');
122
provider.setContent(uri3, 'Content 3');
123
124
expect(provider.provideTextDocumentContent(uri1)).toBe('Content 1');
125
expect(provider.provideTextDocumentContent(uri2)).toBe('Content 2');
126
expect(provider.provideTextDocumentContent(uri3)).toBe('Content 3');
127
});
128
});
129
130