Skip to content

Commit 9f81b30

Browse files
authored
add test cases for auto-import (#214)
1 parent c9309df commit 9f81b30

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

packages/ts-plugin/e2e/named-exports.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
launchTsserver,
1010
mergeSpanGroups,
1111
normalizeCodeFixActions,
12+
normalizeCompletionDetails,
1213
normalizeCompletionEntry,
1314
normalizeRefItems,
1415
normalizeSpanGroups,
@@ -259,6 +260,44 @@ describe('supports completions', async () => {
259260
normalizeCompletionEntry(res.body?.entries.filter((entry) => entry.name === entryName) ?? []),
260261
).toStrictEqual(normalizeCompletionEntry(expected));
261262
});
263+
test('if the user completes `styles`, auto-import the namespace import', async () => {
264+
const res = await tsserver.sendCompletionDetails({
265+
file: iff.paths['index.ts'],
266+
line: 1,
267+
offset: 7,
268+
entryNames: [
269+
{
270+
name: 'styles',
271+
source: './a.module.css',
272+
data: {
273+
exportName: ts.InternalSymbolName.Default,
274+
fileName: iff.paths['a.module.css'],
275+
moduleSpecifier: './a.module.css',
276+
} satisfies ts.CompletionEntryData,
277+
},
278+
],
279+
});
280+
expect(normalizeCompletionDetails(res.body!)).toStrictEqual([
281+
{
282+
codeActions: [
283+
{
284+
changes: [
285+
{
286+
fileName: formatPath(iff.paths['index.ts']),
287+
textChanges: [
288+
{
289+
start: { line: 1, offset: 1 },
290+
end: { line: 1, offset: 1 },
291+
newText: `import * as styles from "./a.module.css";${ts.sys.newLine}${ts.sys.newLine}`,
292+
},
293+
],
294+
},
295+
],
296+
},
297+
],
298+
},
299+
]);
300+
});
262301
});
263302
describe('prioritize named imports if prioritizeNamedImports is true', async () => {
264303
const iff = await baseIff.fork({

packages/ts-plugin/e2e/test-util/tsserver.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ interface Tsserver {
2828
sendCompletionInfo(
2929
args: server.protocol.CompletionsRequest['arguments'],
3030
): Promise<server.protocol.CompletionInfoResponse>;
31+
sendCompletionDetails(
32+
args: server.protocol.CompletionDetailsRequest['arguments'],
33+
): Promise<server.protocol.CompletionDetailsResponse>;
3134
sendGetCodeFixes(args: server.protocol.CodeFixRequest['arguments']): Promise<server.protocol.CodeFixResponse>;
3235
}
3336

@@ -77,6 +80,7 @@ export function launchTsserver(): Tsserver {
7780
sendRequest(ts.server.protocol.CommandTypes.GetApplicableRefactors, args),
7881
sendGetEditsForRefactor: async (args) => sendRequest(ts.server.protocol.CommandTypes.GetEditsForRefactor, args),
7982
sendCompletionInfo: async (args) => sendRequest(ts.server.protocol.CommandTypes.CompletionInfo, args),
83+
sendCompletionDetails: async (args) => sendRequest(ts.server.protocol.CommandTypes.CompletionDetails, args),
8084
sendGetCodeFixes: async (args) => sendRequest(ts.server.protocol.CommandTypes.GetCodeFixes, args),
8185
};
8286
}
@@ -200,6 +204,30 @@ export function normalizeCompletionEntry(entries: readonly SimplifiedCompletionE
200204
);
201205
}
202206

207+
type SimplifiedCodeAction = {
208+
changes: ts.server.protocol.FileCodeEdits[];
209+
};
210+
211+
type SimplifiedCompletionDetails = {
212+
codeActions?: SimplifiedCodeAction[];
213+
};
214+
215+
export function normalizeCompletionDetails(
216+
entries: readonly SimplifiedCompletionDetails[],
217+
): SimplifiedCompletionDetails[] {
218+
return entries.map((entry) => {
219+
return {
220+
...(entry.codeActions ?
221+
{
222+
codeActions: entry.codeActions.map((action) => {
223+
return { changes: action.changes };
224+
}),
225+
}
226+
: {}),
227+
};
228+
});
229+
}
230+
203231
type SimplifiedCodeFixAction = {
204232
fixName: string;
205233
changes: ts.server.protocol.FileCodeEdits[];

0 commit comments

Comments
 (0)