Mirror: TypeScript LSP plugin that finds GraphQL documents in your code and provides diagnostics, auto-complete and hover-information.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: add tests for hovering and suggestions (#34)

* add test for hovering and suggestions

* testing

* prettier ignore

authored by

Jovi De Croock and committed by
GitHub
d5a225fb 2a89522e

+158 -66
+1
.prettierignore
··· 1 + test/e2e/fixture-project/fixtures/**/*
+1
test/e2e/fixture-project/fixtures/simple.ts
··· 4 4 query AllPosts { 5 5 posts { 6 6 title 7 + 7 8 } 8 9 } 9 10 `;
+3
test/e2e/fixture-project/schema.graphql
··· 1 1 type Query { 2 2 post(id: ID!): Post 3 + """ 4 + List out all posts 5 + """ 3 6 posts: [Post] 4 7 } 5 8
+153
test/e2e/graphqlsp.test.ts
··· 1 + import { expect, afterAll, beforeAll, it, describe } from 'vitest'; 2 + import { TSServer } from './server'; 3 + import path from 'node:path'; 4 + import fs from 'node:fs'; 5 + import url from 'node:url'; 6 + import ts from 'typescript/lib/tsserverlibrary'; 7 + 8 + const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); 9 + 10 + const projectPath = path.resolve(__dirname, 'fixture-project'); 11 + 12 + let server: TSServer; 13 + 14 + describe('simple', () => { 15 + const testFile = path.join(projectPath, 'simple.ts'); 16 + const generatedFile = path.join(projectPath, 'simple.generated.ts'); 17 + 18 + beforeAll(async () => { 19 + server = new TSServer(projectPath, { debugLog: false }); 20 + const fixtureFileContent = fs.readFileSync( 21 + path.resolve(testFile, '../fixtures/simple.ts'), 22 + 'utf-8' 23 + ); 24 + 25 + server.sendCommand('open', { 26 + file: testFile, 27 + fileContent: '// empty', 28 + scriptKindName: 'TS', 29 + } satisfies ts.server.protocol.OpenRequestArgs); 30 + 31 + server.sendCommand('updateOpen', { 32 + openFiles: [{ file: testFile, fileContent: fixtureFileContent }], 33 + } satisfies ts.server.protocol.UpdateOpenRequestArgs); 34 + 35 + server.sendCommand('saveto', { 36 + file: testFile, 37 + tmpfile: testFile, 38 + } satisfies ts.server.protocol.SavetoRequestArgs); 39 + 40 + await server.waitForResponse( 41 + response => response.type === 'event' && response.event === 'setTypings' 42 + ); 43 + }); 44 + 45 + afterAll(() => { 46 + try { 47 + fs.unlinkSync(testFile); 48 + fs.unlinkSync(generatedFile); 49 + } catch {} 50 + server.close(); 51 + }); 52 + 53 + it('Generates types for a given query', async () => { 54 + expect(() => { 55 + fs.lstatSync(testFile); 56 + fs.lstatSync(generatedFile); 57 + }).not.toThrow(); 58 + 59 + expect(fs.readFileSync(testFile, 'utf-8')).toContain( 60 + `as typeof import('./simple.generated').AllPostsDocument` 61 + ); 62 + expect(fs.readFileSync(generatedFile, 'utf-8')).toContain( 63 + 'export const AllPostsDocument = ' 64 + ); 65 + }, 7500); 66 + 67 + it('Proposes suggestions for a selection-set', async () => { 68 + server.send({ 69 + seq: 8, 70 + type: 'request', 71 + command: 'completionInfo', 72 + arguments: { 73 + file: testFile, 74 + line: 7, 75 + offset: 7, 76 + includeExternalModuleExports: true, 77 + includeInsertTextCompletions: true, 78 + triggerKind: 1, 79 + }, 80 + }); 81 + 82 + await server.waitForResponse( 83 + response => 84 + response.type === 'response' && response.command === 'completionInfo' 85 + ); 86 + 87 + const res = server.responses 88 + .reverse() 89 + .find( 90 + resp => resp.type === 'response' && resp.command === 'completionInfo' 91 + ); 92 + 93 + expect(res).toBeDefined(); 94 + expect(typeof res?.body.entries).toEqual('object'); 95 + const defaultAttrs = { kind: 'var', kindModifiers: 'declare' }; 96 + expect(res?.body.entries).toEqual([ 97 + { 98 + ...defaultAttrs, 99 + name: 'id', 100 + sortText: '0id', 101 + labelDetails: { detail: ' ID!' }, 102 + }, 103 + { 104 + ...defaultAttrs, 105 + name: 'title', 106 + sortText: '1title', 107 + labelDetails: { detail: ' String!' }, 108 + }, 109 + { 110 + ...defaultAttrs, 111 + name: 'content', 112 + sortText: '2content', 113 + labelDetails: { detail: ' String!' }, 114 + }, 115 + { 116 + ...defaultAttrs, 117 + name: '__typename', 118 + sortText: '3__typename', 119 + labelDetails: { 120 + detail: ' String!', 121 + description: 'The name of the current Object type at runtime.', 122 + }, 123 + }, 124 + ]); 125 + }, 7500); 126 + 127 + it('Gives quick-info when hovering', async () => { 128 + server.send({ 129 + seq: 9, 130 + type: 'request', 131 + command: 'quickinfo', 132 + arguments: { 133 + file: testFile, 134 + line: 5, 135 + offset: 7, 136 + }, 137 + }); 138 + 139 + await server.waitForResponse( 140 + response => 141 + response.type === 'response' && response.command === 'quickinfo' 142 + ); 143 + 144 + const res = server.responses 145 + .reverse() 146 + .find(resp => resp.type === 'response' && resp.command === 'quickinfo'); 147 + expect(res).toBeDefined(); 148 + expect(typeof res?.body).toEqual('object'); 149 + expect(res?.body.displayString).toEqual(`Query.posts: [Post] 150 + 151 + List out all posts`); 152 + }, 7500); 153 + });
-66
test/e2e/smoke.test.ts
··· 1 - import { expect, afterEach, afterAll, beforeEach, it } from 'vitest'; 2 - import { TSServer } from './server'; 3 - import path from 'node:path'; 4 - import fs from 'node:fs'; 5 - import url from 'node:url'; 6 - import ts from 'typescript/lib/tsserverlibrary'; 7 - 8 - const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); 9 - 10 - const projectPath = path.resolve(__dirname, 'fixture-project'); 11 - 12 - let server: TSServer; 13 - beforeEach(() => { 14 - server = new TSServer(projectPath, { debugLog: false }); 15 - }); 16 - afterEach(() => { 17 - server.close(); 18 - }); 19 - 20 - const testFile = path.join(projectPath, 'simple.ts'); 21 - const generatedFile = path.join(projectPath, 'simple.generated.ts'); 22 - 23 - afterAll(() => { 24 - try { 25 - fs.unlinkSync(testFile); 26 - fs.unlinkSync(generatedFile); 27 - } catch {} 28 - }); 29 - 30 - it('passes simple smoke test', async () => { 31 - const fixtureFileContent = fs.readFileSync( 32 - path.resolve(testFile, '../fixtures/simple.ts'), 33 - 'utf-8' 34 - ); 35 - 36 - server.sendCommand('open', { 37 - file: testFile, 38 - fileContent: '// empty', 39 - scriptKindName: 'TS', 40 - } satisfies ts.server.protocol.OpenRequestArgs); 41 - 42 - server.sendCommand('updateOpen', { 43 - openFiles: [{ file: testFile, fileContent: fixtureFileContent }], 44 - } satisfies ts.server.protocol.UpdateOpenRequestArgs); 45 - 46 - server.sendCommand('saveto', { 47 - file: testFile, 48 - tmpfile: testFile, 49 - } satisfies ts.server.protocol.SavetoRequestArgs); 50 - 51 - await server.waitForResponse( 52 - response => response.type === 'event' && response.event === 'setTypings' 53 - ); 54 - 55 - expect(() => { 56 - fs.lstatSync(testFile); 57 - fs.lstatSync(generatedFile); 58 - }).not.toThrow(); 59 - 60 - expect(fs.readFileSync(testFile, 'utf-8')).toContain( 61 - `as typeof import('./simple.generated').AllPostsDocument` 62 - ); 63 - expect(fs.readFileSync(generatedFile, 'utf-8')).toContain( 64 - 'export const AllPostsDocument = ' 65 - ); 66 - }, 7500);