Skip to content

Commit b0caf1b

Browse files
committed
Add session tests
1 parent ed7d45f commit b0caf1b

1 file changed

Lines changed: 170 additions & 0 deletions

File tree

test/core/session.test.ts

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
import { type TelemetryReporter } from "@vscode/extension-telemetry";
5+
import * as assert from "assert";
6+
import Sinon from "sinon";
7+
import * as vscode from "vscode";
8+
import type { DocumentSelector } from "vscode-languageclient";
9+
import { SessionManager } from "../../src/session";
10+
import { stubInterface, testLogger } from "../utils";
11+
12+
describe("SessionManager middleware", () => {
13+
afterEach(() => {
14+
Sinon.restore();
15+
});
16+
17+
it("delays didOpen until session initialization completes", async () => {
18+
const registerCommandStub = Sinon.stub(
19+
vscode.commands,
20+
"registerCommand",
21+
).returns(disposableStub());
22+
const onDidChangeConfigurationStub = Sinon.stub(
23+
vscode.workspace,
24+
"onDidChangeConfiguration",
25+
).returns(disposableStub());
26+
27+
Sinon.stub(vscode.languages, "createLanguageStatusItem").returns(
28+
stubInterface<vscode.LanguageStatusItem>({
29+
text: "",
30+
detail: "",
31+
busy: false,
32+
severity: vscode.LanguageStatusSeverity.Information,
33+
dispose: () => {
34+
return;
35+
},
36+
}),
37+
);
38+
39+
const manager = new SessionManager(
40+
stubInterface<vscode.ExtensionContext>({
41+
globalStorageUri: vscode.Uri.file("C:/tmp"),
42+
extensionMode: vscode.ExtensionMode.Test,
43+
subscriptions: [],
44+
logUri: vscode.Uri.file("C:/tmp"),
45+
}),
46+
testLogger,
47+
["powershell"] as DocumentSelector,
48+
"Visual Studio Code",
49+
"PowerShell",
50+
"2026.5.0",
51+
"ms-vscode",
52+
stubInterface<TelemetryReporter>(),
53+
);
54+
55+
const document = stubInterface<vscode.TextDocument>();
56+
let nextCalled = false;
57+
const next = Sinon.spy(
58+
(_document: vscode.TextDocument): Promise<void> => {
59+
nextCalled = true;
60+
return Promise.resolve();
61+
},
62+
);
63+
64+
const didOpenPromise = manager.didOpen(document, next);
65+
66+
await Promise.resolve();
67+
assert.equal(
68+
nextCalled,
69+
false,
70+
"didOpen should wait for initialization",
71+
);
72+
73+
(
74+
manager as unknown as {
75+
started: PromiseWithResolvers<undefined>;
76+
}
77+
).started.resolve(undefined);
78+
79+
await didOpenPromise;
80+
assert.equal(
81+
nextCalled,
82+
true,
83+
"didOpen should run after initialization",
84+
);
85+
assert.ok(
86+
registerCommandStub.calledThrice,
87+
"SessionManager should register its commands in constructor",
88+
);
89+
assert.ok(
90+
onDidChangeConfigurationStub.calledOnce,
91+
"SessionManager should register configuration listener in constructor",
92+
);
93+
});
94+
95+
it("delays didChange until session initialization completes", async () => {
96+
Sinon.stub(vscode.commands, "registerCommand").returns(
97+
disposableStub(),
98+
);
99+
Sinon.stub(vscode.workspace, "onDidChangeConfiguration").returns(
100+
disposableStub(),
101+
);
102+
103+
Sinon.stub(vscode.languages, "createLanguageStatusItem").returns(
104+
stubInterface<vscode.LanguageStatusItem>({
105+
text: "",
106+
detail: "",
107+
busy: false,
108+
severity: vscode.LanguageStatusSeverity.Information,
109+
dispose: () => {
110+
return;
111+
},
112+
}),
113+
);
114+
115+
const manager = new SessionManager(
116+
stubInterface<vscode.ExtensionContext>({
117+
globalStorageUri: vscode.Uri.file("C:/tmp"),
118+
extensionMode: vscode.ExtensionMode.Test,
119+
subscriptions: [],
120+
logUri: vscode.Uri.file("C:/tmp"),
121+
}),
122+
testLogger,
123+
["powershell"] as DocumentSelector,
124+
"Visual Studio Code",
125+
"PowerShell",
126+
"2026.5.0",
127+
"ms-vscode",
128+
stubInterface<TelemetryReporter>(),
129+
);
130+
131+
const changeEvent = stubInterface<vscode.TextDocumentChangeEvent>();
132+
let nextCalled = false;
133+
const next = Sinon.spy(
134+
(_event: vscode.TextDocumentChangeEvent): Promise<void> => {
135+
nextCalled = true;
136+
return Promise.resolve();
137+
},
138+
);
139+
140+
const didChangePromise = manager.didChange(changeEvent, next);
141+
142+
await Promise.resolve();
143+
assert.equal(
144+
nextCalled,
145+
false,
146+
"didChange should wait for initialization",
147+
);
148+
149+
(
150+
manager as unknown as {
151+
started: PromiseWithResolvers<undefined>;
152+
}
153+
).started.resolve(undefined);
154+
155+
await didChangePromise;
156+
assert.equal(
157+
nextCalled,
158+
true,
159+
"didChange should run after initialization",
160+
);
161+
});
162+
});
163+
164+
function disposableStub(): vscode.Disposable {
165+
return {
166+
dispose: (): void => {
167+
return;
168+
},
169+
};
170+
}

0 commit comments

Comments
 (0)