···
+
import { describe, it, expect } from 'vitest';
+
import { parse } from '../parser';
+
import { print } from '../printer';
+
OperationDefinitionNode,
+
VariableDefinitionNode,
+
FragmentDefinitionNode,
+
describe('GraphQL descriptions', () => {
+
describe('OperationDefinition descriptions', () => {
+
it('parses operation with description', () => {
+
Request the current status of a time machine and its operator.
+
query GetTimeMachineStatus {
+
const doc = parse(source, { noLocation: true });
+
const operation = doc.definitions[0] as OperationDefinitionNode;
+
expect(operation.description).toBeDefined();
+
expect(operation.description?.value).toBe(
+
'Request the current status of a time machine and its operator.'
+
expect(operation.description?.block).toBe(true);
+
it('parses operation with single-line description', () => {
+
"Simple query description"
+
const doc = parse(source, { noLocation: true });
+
const operation = doc.definitions[0] as OperationDefinitionNode;
+
expect(operation.description).toBeDefined();
+
expect(operation.description?.value).toBe('Simple query description');
+
expect(operation.description?.block).toBe(false);
+
it('does not allow description on anonymous operations', () => {
+
expect(() => parse(source)).toThrow();
+
it('parses mutation with description', () => {
+
Create a new time machine entry.
+
mutation CreateTimeMachine($input: TimeMachineInput!) {
+
createTimeMachine(input: $input) {
+
const doc = parse(source, { noLocation: true });
+
const operation = doc.definitions[0] as OperationDefinitionNode;
+
expect(operation.description).toBeDefined();
+
expect(operation.description?.value).toBe('Create a new time machine entry.');
+
describe('VariableDefinition descriptions', () => {
+
it('parses variable with description', () => {
+
query GetTimeMachineStatus(
+
"The unique serial number of the time machine to inspect."
+
The year to check the status for.
+
**Warning:** certain years may trigger an anomaly in the space-time continuum.
+
timeMachine(id: $machineId) {
+
const doc = parse(source, { noLocation: true });
+
const operation = doc.definitions[0] as OperationDefinitionNode;
+
const variables = operation.variableDefinitions as VariableDefinitionNode[];
+
expect(variables[0].description).toBeDefined();
+
expect(variables[0].description?.value).toBe(
+
'The unique serial number of the time machine to inspect.'
+
expect(variables[0].description?.block).toBe(false);
+
expect(variables[1].description).toBeDefined();
+
expect(variables[1].description?.value).toBe(
+
'The year to check the status for.\n**Warning:** certain years may trigger an anomaly in the space-time continuum.'
+
expect(variables[1].description?.block).toBe(true);
+
it('parses mixed variables with and without descriptions', () => {
+
const doc = parse(source, { noLocation: true });
+
const operation = doc.definitions[0] as OperationDefinitionNode;
+
const variables = operation.variableDefinitions as VariableDefinitionNode[];
+
expect(variables[0].description).toBeDefined();
+
expect(variables[0].description?.value).toBe('Described variable');
+
expect(variables[1].description).toBeUndefined();
+
describe('FragmentDefinition descriptions', () => {
+
it('parses fragment with description', () => {
+
"Time machine details."
+
fragment TimeMachineDetails on TimeMachine {
+
const doc = parse(source, { noLocation: true });
+
const fragment = doc.definitions[0] as FragmentDefinitionNode;
+
expect(fragment.description).toBeDefined();
+
expect(fragment.description?.value).toBe('Time machine details.');
+
expect(fragment.description?.block).toBe(false);
+
it('parses fragment with block description', () => {
+
Comprehensive time machine information
+
including maintenance history and operational status.
+
fragment FullTimeMachineInfo on TimeMachine {
+
const doc = parse(source, { noLocation: true });
+
const fragment = doc.definitions[0] as FragmentDefinitionNode;
+
expect(fragment.description).toBeDefined();
+
expect(fragment.description?.value).toBe(
+
'Comprehensive time machine information\nincluding maintenance history and operational status.'
+
expect(fragment.description?.block).toBe(true);
+
describe('print with descriptions', () => {
+
it('prints operation description correctly', () => {
+
Request the current status of a time machine and its operator.
+
query GetTimeMachineStatus {
+
const doc = parse(source, { noLocation: true });
+
const printed = print(doc);
+
expect(printed).toContain('"""');
+
expect(printed).toContain('Request the current status of a time machine and its operator.');
+
it('prints variable descriptions correctly', () => {
+
const source = `query GetStatus(
+
const doc = parse(source, { noLocation: true });
+
const printed = print(doc);
+
expect(printed).toContain('"Machine ID"');
+
it('prints fragment description correctly', () => {
+
const source = `"Details fragment"
+
fragment Details on Type {
+
const doc = parse(source, { noLocation: true });
+
const printed = print(doc);
+
expect(printed).toContain('"Details fragment"');
+
describe('roundtrip parsing and printing', () => {
+
it('maintains descriptions through parse and print cycle', () => {
+
Request the current status of a time machine and its operator.
+
query GetTimeMachineStatus(
+
"The unique serial number of the time machine to inspect."
+
The year to check the status for.
+
**Warning:** certain years may trigger an anomaly in the space-time continuum.
+
timeMachine(id: $machineId) {
+
"Time machine details."
+
fragment TimeMachineDetails on TimeMachine {
+
const doc = parse(source, { noLocation: true });
+
const printed = print(doc);
+
const reparsed = parse(printed, { noLocation: true });
+
const operation = doc.definitions[0] as OperationDefinitionNode;
+
const reparsedOperation = reparsed.definitions[0] as OperationDefinitionNode;
+
// The printed/reparsed cycle may have slightly different formatting but same content
+
expect(reparsedOperation.description?.value?.trim()).toBe(
+
operation.description?.value?.trim()
+
const fragment = doc.definitions[1] as FragmentDefinitionNode;
+
const reparsedFragment = reparsed.definitions[1] as FragmentDefinitionNode;
+
expect(reparsedFragment.description?.value).toBe(fragment.description?.value);