it('should get the correct mutation definition out of a mutation with multiple fragments', () => { const mutationWithFragments = gql` mutation { createAuthor(firstName: "John", lastName: "Smith") { ...authorDetails } } fragment authorDetails on Author { firstName lastName } `; const expectedDoc = gql` mutation { createAuthor(firstName: "John", lastName: "Smith") { ...authorDetails } } `; const expectedResult: OperationDefinitionNode = expectedDoc .definitions[0] as OperationDefinitionNode; const actualResult = getMutationDefinition(mutationWithFragments); assert.equal(print(actualResult), print(expectedResult)); });
it('should get fragment definitions from a document containing a single fragment', () => { const singleFragmentDefinition = gql` query { author { ...authorDetails } } fragment authorDetails on Author { firstName lastName } `; const expectedDoc = gql` fragment authorDetails on Author { firstName lastName } `; const expectedResult: FragmentDefinitionNode[] = [ expectedDoc.definitions[0] as FragmentDefinitionNode, ]; const actualResult = getFragmentDefinitions(singleFragmentDefinition); assert.equal(actualResult.length, expectedResult.length); assert.equal(print(actualResult[0]), print(expectedResult[0])); });
it('should modify all definitions in a document', () => { const testQuery = gql` query withFragments { user(id: 4) { friends(first: 10) { ...friendFields } } } fragment friendFields on User { firstName lastName }`; const newQueryDoc = addTypenameToDocument(testQuery); const expectedQuery = gql` query withFragments { user(id: 4) { friends(first: 10) { ...friendFields __typename } __typename } } fragment friendFields on User { firstName lastName __typename }`; assert.equal(print(expectedQuery), print(newQueryDoc)); });
it('should correctly add typenames', () => { let testQuery = gql` query { author { name { firstName lastName } } } `; const newQueryDoc = addTypenameToDocument(testQuery); const expectedQuery = gql` query { author { name { firstName lastName __typename } __typename } } `; const expectedQueryStr = print(expectedQuery); assert.equal(expectedQueryStr, print(newQueryDoc)); });
it('should not screw up on a FragmentSpread within the query AST', () => { const testQuery = gql` query withFragments { user(id: 4) { friends(first: 10) { ...friendFields } } } `; const expectedQuery = getQueryDefinition(gql` query withFragments { user(id: 4) { friends(first: 10) { ...friendFields __typename } __typename } } `); const modifiedQuery = addTypenameToDocument(testQuery); assert.equal( print(expectedQuery), print(getQueryDefinition(modifiedQuery)), ); });
it('should correctly add typenames', () => { let testQuery = gql` query { author { name { firstName lastName } } } `; const queryDef = getQueryDefinition(testQuery); const queryRes = addTypenameToSelectionSet(queryDef.selectionSet); // GraphQL print the parsed, updated query and replace the trailing // newlines. const modifiedQueryStr = print(queryRes); const expectedQuery = getQueryDefinition(gql` query { author { name { firstName lastName __typename } __typename } __typename}`); const expectedQueryStr = print(expectedQuery); assert.equal(expectedQueryStr, modifiedQueryStr); });
it('should get query with client fields in fragment with nested fields', function() { const query = gql` query Simple { ...fragmentSpread } fragment fragmentSpread on Thing { user { firstName @client lastName } } `; const expected = gql` query Simple { ...fragmentSpread } fragment fragmentSpread on Thing { user { firstName @client } } `; const doc = getDirectivesFromDocument([{ name: 'client' }], query); expect(print(doc)).toBe(print(expected)); });
it('should get query with different types of directive matchers ', () => { const query = gql` query Simple { maybe @skip(if: false) field @storage(if: true) user @client } `; const expected = gql` query Simple { field @storage(if: true) user @client } `; const doc = getDirectivesFromDocument( [ { name: 'storage' }, { test: directive => directive.name.value === 'client' }, ], query, ); expect(print(doc)).toBe(print(expected)); });
it('should not add duplicates', () => { let testQuery = gql` query { author { name { firstName lastName __typename } } } `; const newQueryDoc = addTypenameToDocument(testQuery); const expectedQuery = gql` query { author { name { firstName lastName __typename } __typename } } `; const expectedQueryStr = print(expectedQuery); expect(print(newQueryDoc)).toBe(expectedQueryStr); });
it('should remove fragment spreads and definitions associated with the removed directive', () => { const query = gql` query Simple { networkField field @client { ...ClientFragment } } fragment ClientFragment on Thing { otherField bar } `; const expected = gql` query Simple { networkField } `; const doc = removeDirectivesFromDocument( [{ name: 'client', remove: true }], query, ); expect(print(doc)).toBe(print(expected)); });