From 264f758bf650aad67f57a5bd53d6771d61ef6713 Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Sun, 11 Apr 2021 23:53:41 +0300 Subject: [PATCH] visitor-test: cleanup test for nodes with unknown kinds (#3034) --- src/language/__tests__/visitor-test.js | 93 ++++++++++++-------------- 1 file changed, 43 insertions(+), 50 deletions(-) diff --git a/src/language/__tests__/visitor-test.js b/src/language/__tests__/visitor-test.js index 6dda355cc5..1f7455cbda 100644 --- a/src/language/__tests__/visitor-test.js +++ b/src/language/__tests__/visitor-test.js @@ -418,6 +418,49 @@ describe('Visitor', () => { ]); }); + it('visit nodes with unknown kinds but does not traverse deeper', () => { + const customAST = parse('{ a }'); + // $FlowExpectedError[prop-missing] + customAST.definitions[0].selectionSet.selections.push({ + kind: 'CustomField', + name: { kind: 'Name', value: 'NamedNodeToBeSkipped' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'CustomField', + name: { kind: 'Name', value: 'NamedNodeToBeSkipped' }, + }, + ], + }, + }); + + const visited = []; + visit(customAST, { + enter(node) { + visited.push(['enter', node.kind, getValue(node)]); + }, + leave(node) { + visited.push(['leave', node.kind, getValue(node)]); + }, + }); + + expect(visited).to.deep.equal([ + ['enter', 'Document', undefined], + ['enter', 'OperationDefinition', undefined], + ['enter', 'SelectionSet', undefined], + ['enter', 'Field', undefined], + ['enter', 'Name', 'a'], + ['leave', 'Name', 'a'], + ['leave', 'Field', undefined], + ['enter', 'CustomField', undefined], + ['leave', 'CustomField', undefined], + ['leave', 'SelectionSet', undefined], + ['leave', 'OperationDefinition', undefined], + ['leave', 'Document', undefined], + ]); + }); + it('Legacy: visits variables defined in fragments', () => { const ast = parse('fragment a($v: Boolean = false) on t { f }', { noLocation: true, @@ -845,56 +888,6 @@ describe('Visitor', () => { ]); }); - describe('Support for custom AST nodes', () => { - const customAST = parse('{ a }'); - (customAST: any).definitions[0].selectionSet.selections.push({ - kind: 'CustomField', - name: { - kind: 'Name', - value: 'b', - }, - selectionSet: { - kind: 'SelectionSet', - selections: [ - { - kind: 'CustomField', - name: { - kind: 'Name', - value: 'c', - }, - }, - ], - }, - }); - - it('does not traverse unknown node kinds', () => { - const visited = []; - visit(customAST, { - enter(node) { - visited.push(['enter', node.kind, getValue(node)]); - }, - leave(node) { - visited.push(['leave', node.kind, getValue(node)]); - }, - }); - - expect(visited).to.deep.equal([ - ['enter', 'Document', undefined], - ['enter', 'OperationDefinition', undefined], - ['enter', 'SelectionSet', undefined], - ['enter', 'Field', undefined], - ['enter', 'Name', 'a'], - ['leave', 'Name', 'a'], - ['leave', 'Field', undefined], - ['enter', 'CustomField', undefined], - ['leave', 'CustomField', undefined], - ['leave', 'SelectionSet', undefined], - ['leave', 'OperationDefinition', undefined], - ['leave', 'Document', undefined], - ]); - }); - }); - describe('visitInParallel', () => { // Note: nearly identical to the above test of the same test but // using visitInParallel.