/
get-definition-and-bound-span.test.ts
140 lines (131 loc) · 3.5 KB
/
get-definition-and-bound-span.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import ts from 'typescript';
import { mark, type Frets } from 'fretted-strings';
import { AdapterFixture } from './testing/adapter-fixture';
function createFixture(name: string) {
return new AdapterFixture(name);
}
describe('getDefinitionAndBoundSpan', () => {
const delegateFn = jest.fn(() => undefined);
beforeEach(() => {
delegateFn.mockClear();
});
it.each([
{
name: 'cursor on not template leteral',
source: `
const query = 100;
%%% ^ %%%
%%% s1 %%%
`,
},
{
name: 'incomplete operation',
source: `
const query = \`
query MyQuery {
...MyFragment
%%% ^ %%%
%%% s1 %%%
\`;
`,
},
{
name: 'cursor on not fragment spread',
source: `
const query = \`
query MyQuery {
...MyFragment
%%% ^ %%%
%%% s1 %%%
}
fragment MyFragment on Query {
__typename
}
\`;
`,
},
{
name: 'not exsisting fragment definition',
source: `
const query = \`
query MyQuery {
...MyFragment
%%% ^ %%%
%%% s1 %%%
}
fragment OtherFragment on Query {
__typename
}
\`;
`,
},
])('should return no definition info for $name .', ({ source }) => {
const fixture = createFixture('input.ts');
const frets: Frets = {};
fixture.source = mark(source, frets);
fixture.adapter.getDefinitionAndBoundSpan(delegateFn, 'input.ts', frets.s1.pos);
expect(delegateFn).toHaveBeenCalledTimes(1);
});
it('should return definition info when cursor is on fragment spread', () => {
const fixture = createFixture('input.ts');
const frets: Frets = {};
fixture.source = mark(
`
const query = \`
query MyQuery {
...MyFragment
%%% ^ ^ %%%
%%% s1 s2 %%%
}
fragment MyFragment on Query {
%%% ^ ^ %%%
%%% d1 d2 %%%
__typename
}
\`;
`,
frets,
);
const actual = fixture.adapter.getDefinitionAndBoundSpan(delegateFn, 'input.ts', frets.s1.pos);
expect(actual).toMatchObject({
textSpan: {
start: frets.s1.pos,
length: frets.s2.pos - frets.s1.pos,
},
definitions: [
{
fileName: 'input.ts',
textSpan: {
start: frets.d1.pos,
length: frets.d2.pos - frets.d1.pos,
},
},
] as Partial<ts.DefinitionInfo>[],
});
});
it('should return definition to other file', () => {
const fixture = createFixture('input.ts');
const frets: Frets = {};
fixture.registerFragment(
'fragments.ts',
`
fragment MyFragment on Query {
__typename
}
`,
).source = mark(
`
const query = \`
query MyQuery {
...MyFragment
%%% ^ %%%
%%% s1 %%%
}
\`;
`,
frets,
);
const actual = fixture.adapter.getDefinitionAndBoundSpan(delegateFn, 'input.ts', frets.s1.pos);
expect(actual?.definitions?.[0].fileName).toBe('fragments.ts');
});
});