···
1
+
import { describe, it, expect } from 'vitest';
2
+
import { parse } from '../parser';
3
+
import { print } from '../printer';
5
+
OperationDefinitionNode,
6
+
VariableDefinitionNode,
7
+
FragmentDefinitionNode,
10
+
describe('GraphQL descriptions', () => {
11
+
describe('OperationDefinition descriptions', () => {
12
+
it('parses operation with description', () => {
15
+
Request the current status of a time machine and its operator.
17
+
query GetTimeMachineStatus {
25
+
const doc = parse(source, { noLocation: true });
26
+
const operation = doc.definitions[0] as OperationDefinitionNode;
28
+
expect(operation.description).toBeDefined();
29
+
expect(operation.description?.value).toBe(
30
+
'Request the current status of a time machine and its operator.'
32
+
expect(operation.description?.block).toBe(true);
35
+
it('parses operation with single-line description', () => {
37
+
"Simple query description"
43
+
const doc = parse(source, { noLocation: true });
44
+
const operation = doc.definitions[0] as OperationDefinitionNode;
46
+
expect(operation.description).toBeDefined();
47
+
expect(operation.description?.value).toBe('Simple query description');
48
+
expect(operation.description?.block).toBe(false);
51
+
it('does not allow description on anonymous operations', () => {
59
+
expect(() => parse(source)).toThrow();
62
+
it('parses mutation with description', () => {
65
+
Create a new time machine entry.
67
+
mutation CreateTimeMachine($input: TimeMachineInput!) {
68
+
createTimeMachine(input: $input) {
74
+
const doc = parse(source, { noLocation: true });
75
+
const operation = doc.definitions[0] as OperationDefinitionNode;
77
+
expect(operation.description).toBeDefined();
78
+
expect(operation.description?.value).toBe('Create a new time machine entry.');
82
+
describe('VariableDefinition descriptions', () => {
83
+
it('parses variable with description', () => {
85
+
query GetTimeMachineStatus(
86
+
"The unique serial number of the time machine to inspect."
90
+
The year to check the status for.
91
+
**Warning:** certain years may trigger an anomaly in the space-time continuum.
95
+
timeMachine(id: $machineId) {
101
+
const doc = parse(source, { noLocation: true });
102
+
const operation = doc.definitions[0] as OperationDefinitionNode;
103
+
const variables = operation.variableDefinitions as VariableDefinitionNode[];
105
+
expect(variables[0].description).toBeDefined();
106
+
expect(variables[0].description?.value).toBe(
107
+
'The unique serial number of the time machine to inspect.'
109
+
expect(variables[0].description?.block).toBe(false);
111
+
expect(variables[1].description).toBeDefined();
112
+
expect(variables[1].description?.value).toBe(
113
+
'The year to check the status for.\n**Warning:** certain years may trigger an anomaly in the space-time continuum.'
115
+
expect(variables[1].description?.block).toBe(true);
118
+
it('parses mixed variables with and without descriptions', () => {
121
+
"Described variable"
129
+
const doc = parse(source, { noLocation: true });
130
+
const operation = doc.definitions[0] as OperationDefinitionNode;
131
+
const variables = operation.variableDefinitions as VariableDefinitionNode[];
133
+
expect(variables[0].description).toBeDefined();
134
+
expect(variables[0].description?.value).toBe('Described variable');
135
+
expect(variables[1].description).toBeUndefined();
139
+
describe('FragmentDefinition descriptions', () => {
140
+
it('parses fragment with description', () => {
142
+
"Time machine details."
143
+
fragment TimeMachineDetails on TimeMachine {
150
+
const doc = parse(source, { noLocation: true });
151
+
const fragment = doc.definitions[0] as FragmentDefinitionNode;
153
+
expect(fragment.description).toBeDefined();
154
+
expect(fragment.description?.value).toBe('Time machine details.');
155
+
expect(fragment.description?.block).toBe(false);
158
+
it('parses fragment with block description', () => {
161
+
Comprehensive time machine information
162
+
including maintenance history and operational status.
164
+
fragment FullTimeMachineInfo on TimeMachine {
172
+
const doc = parse(source, { noLocation: true });
173
+
const fragment = doc.definitions[0] as FragmentDefinitionNode;
175
+
expect(fragment.description).toBeDefined();
176
+
expect(fragment.description?.value).toBe(
177
+
'Comprehensive time machine information\nincluding maintenance history and operational status.'
179
+
expect(fragment.description?.block).toBe(true);
183
+
describe('print with descriptions', () => {
184
+
it('prints operation description correctly', () => {
185
+
const source = `"""
186
+
Request the current status of a time machine and its operator.
188
+
query GetTimeMachineStatus {
194
+
const doc = parse(source, { noLocation: true });
195
+
const printed = print(doc);
197
+
expect(printed).toContain('"""');
198
+
expect(printed).toContain('Request the current status of a time machine and its operator.');
201
+
it('prints variable descriptions correctly', () => {
202
+
const source = `query GetStatus(
209
+
const doc = parse(source, { noLocation: true });
210
+
const printed = print(doc);
212
+
expect(printed).toContain('"Machine ID"');
215
+
it('prints fragment description correctly', () => {
216
+
const source = `"Details fragment"
217
+
fragment Details on Type {
221
+
const doc = parse(source, { noLocation: true });
222
+
const printed = print(doc);
224
+
expect(printed).toContain('"Details fragment"');
228
+
describe('roundtrip parsing and printing', () => {
229
+
it('maintains descriptions through parse and print cycle', () => {
230
+
const source = `"""
231
+
Request the current status of a time machine and its operator.
233
+
query GetTimeMachineStatus(
234
+
"The unique serial number of the time machine to inspect."
238
+
The year to check the status for.
239
+
**Warning:** certain years may trigger an anomaly in the space-time continuum.
243
+
timeMachine(id: $machineId) {
244
+
...TimeMachineDetails
249
+
status(year: $year)
253
+
"Time machine details."
254
+
fragment TimeMachineDetails on TimeMachine {
260
+
const doc = parse(source, { noLocation: true });
261
+
const printed = print(doc);
262
+
const reparsed = parse(printed, { noLocation: true });
264
+
const operation = doc.definitions[0] as OperationDefinitionNode;
265
+
const reparsedOperation = reparsed.definitions[0] as OperationDefinitionNode;
267
+
// The printed/reparsed cycle may have slightly different formatting but same content
268
+
expect(reparsedOperation.description?.value?.trim()).toBe(
269
+
operation.description?.value?.trim()
272
+
const fragment = doc.definitions[1] as FragmentDefinitionNode;
273
+
const reparsedFragment = reparsed.definitions[1] as FragmentDefinitionNode;
275
+
expect(reparsedFragment.description?.value).toBe(fragment.description?.value);