UNPKG

ra-data-opencrud

Version:

A Prisma/GraphCMS data provider for react-admin

444 lines (428 loc) 9.27 kB
import { TypeKind, print, IntrospectionField, FieldNode, DocumentNode } from 'graphql'; import { GET_LIST, GET_ONE, GET_MANY, GET_MANY_REFERENCE, UPDATE, CREATE, DELETE } from 'react-admin'; import buildGqlQuery, { buildApolloArgs, buildArgs, buildFields, getArgType, Query } from './buildGqlQuery'; import { IntrospectionResult, Resource } from './constants/interfaces'; describe('getArgType', () => { it('returns the arg type', () => { expect( print( getArgType({ type: { kind: TypeKind.SCALAR, name: 'foo' } } as IntrospectionField) ) ).toEqual('foo'); }); it('returns the arg type for NON_NULL types', () => { expect( print( getArgType({ type: { kind: TypeKind.NON_NULL, ofType: { name: 'ID', kind: TypeKind.SCALAR } } } as IntrospectionField) ) ).toEqual('ID!'); }); it('returns the arg type for LIST types', () => { expect( print( getArgType({ type: { kind: TypeKind.LIST, ofType: { name: 'ID', kind: TypeKind.SCALAR } } } as IntrospectionField) ) ).toEqual('[ID]'); }); it('returns the arg type for LIST types of NON_NULL type', () => { expect( print( getArgType({ type: { kind: TypeKind.LIST, ofType: { kind: TypeKind.NON_NULL, ofType: { kind: TypeKind.SCALAR, name: 'ID' } } } } as IntrospectionField) ) ).toEqual('[ID!]'); }); }); describe('buildArgs', () => { it('returns an empty array when query does not have any arguments', () => { expect(buildArgs({ args: [] } as Query)).toEqual([]); }); it('returns an array of args correctly filtered when query has arguments', () => { expect( print( buildArgs({ args: [{ name: 'foo' }, { name: 'bar' }] } as Query, { foo: 'foo_value' }) ) ).toEqual(['foo: $foo']); }); }); describe('buildApolloArgs', () => { it('returns an empty array when query does not have any arguments', () => { expect(print(buildApolloArgs({ args: [] }))).toEqual([]); }); it('returns an array of args correctly filtered when query has arguments', () => { expect( print( buildApolloArgs( { args: [ { name: 'foo', type: { kind: TypeKind.NON_NULL, ofType: { kind: TypeKind.SCALAR, name: 'Int' } } }, { name: 'barId', type: { kind: TypeKind.SCALAR, name: 'ID' } }, { name: 'barIds', type: { kind: TypeKind.LIST, ofType: { kind: TypeKind.NON_NULL, ofType: { kind: TypeKind.SCALAR, name: 'ID' } } } }, { name: 'bar' } ] } as Query, { foo: 'foo_value', barId: 100, barIds: [101, 102] } ) ) ).toEqual(['$foo: Int!', '$barId: ID', '$barIds: [ID!]']); }); }); describe('buildFields', () => { it('returns an object with the fields to retrieve', () => { const introspectionResults = { resources: [{ type: { name: 'resourceType' } }], types: [ { name: 'linkedType', fields: [ { name: 'id', type: { kind: TypeKind.SCALAR, name: 'ID' } } ] } ] }; const fields = [ { type: { kind: TypeKind.SCALAR, name: 'ID' }, name: 'id' }, { type: { kind: TypeKind.SCALAR, name: '_internalField' }, name: 'foo1' }, { type: { kind: TypeKind.OBJECT, name: 'linkedType' }, name: 'linked' }, { type: { kind: TypeKind.OBJECT, name: 'resourceType' }, name: 'resource' } ]; expect( print( buildFields(introspectionResults as IntrospectionResult)(fields as any) ) ).toEqual([ 'id', `linked { id }`, `resource { id }` ]); }); }); describe('buildGqlQuery', () => { const introspectionResults = { resources: [{ type: { name: 'resourceType' } }], types: [ { name: 'linkedType', fields: [ { name: 'foo', type: { kind: TypeKind.SCALAR, name: 'bar' } } ] } ] }; const resource = { type: { fields: [ { type: { kind: TypeKind.SCALAR, name: '' }, name: 'foo' }, { type: { kind: TypeKind.SCALAR, name: '_foo' }, name: 'foo1' }, { type: { kind: TypeKind.OBJECT, name: 'linkedType' }, name: 'linked' }, { type: { kind: TypeKind.OBJECT, name: 'resourceType' }, name: 'resource' } ] } }; const queryType = { name: 'commands', args: [ { name: 'foo', type: { kind: TypeKind.NON_NULL, ofType: { kind: TypeKind.SCALAR, name: 'Int' } } }, { name: 'barId', type: { kind: TypeKind.SCALAR } }, { name: 'barIds', type: { kind: TypeKind.SCALAR } }, { name: 'bar' } ] }; const params = { foo: 'foo_value' }; it('returns the correct query for GET_LIST', () => { expect( print( buildGqlQuery(introspectionResults as IntrospectionResult)( resource as Resource, GET_LIST, queryType as Query, params, {} as DocumentNode ) ) ).toEqual( `query commands($foo: Int!) { items: commands(foo: $foo) { foo linked { foo } resource { id } } total: commandsConnection(foo: $foo) { aggregate { count } } } ` ); }); it('returns the correct query for GET_MANY', () => { expect( print( buildGqlQuery(introspectionResults as IntrospectionResult)( resource as Resource, GET_MANY, queryType as Query, params, {} as DocumentNode ) ) ).toEqual( `query commands($foo: Int!) { items: commands(foo: $foo) { foo linked { foo } resource { id } } total: commandsConnection(foo: $foo) { aggregate { count } } } ` ); }); it('returns the correct query for GET_MANY_REFERENCE', () => { expect( print( buildGqlQuery(introspectionResults as IntrospectionResult)( resource as Resource, GET_MANY_REFERENCE, queryType as Query, params, {} as DocumentNode ) ) ).toEqual( `query commands($foo: Int!) { items: commands(foo: $foo) { foo linked { foo } resource { id } } total: commandsConnection(foo: $foo) { aggregate { count } } } ` ); }); it('returns the correct query for GET_ONE', () => { expect( print( buildGqlQuery(introspectionResults as IntrospectionResult)( resource as Resource, GET_ONE, { ...queryType, name: 'getCommand' } as Query, params, {} as DocumentNode ) ) ).toEqual( `query getCommand($foo: Int!) { data: getCommand(foo: $foo) { foo linked { foo } resource { id } } } ` ); }); it('returns the correct query for UPDATE', () => { expect( print( buildGqlQuery(introspectionResults as IntrospectionResult)( resource as Resource, UPDATE, { ...queryType, name: 'updateCommand' } as Query, params, {} as DocumentNode ) ) ).toEqual( `mutation updateCommand($foo: Int!) { data: updateCommand(foo: $foo) { foo linked { foo } resource { id } } } ` ); }); it('returns the correct query for CREATE', () => { expect( print( buildGqlQuery(introspectionResults as IntrospectionResult)( resource as Resource, CREATE, { ...queryType, name: 'createCommand' } as Query, params, {} as DocumentNode ) ) ).toEqual( `mutation createCommand($foo: Int!) { data: createCommand(foo: $foo) { foo linked { foo } resource { id } } } ` ); }); it('returns the correct query for DELETE', () => { expect( print( buildGqlQuery(introspectionResults as IntrospectionResult)( resource as Resource, DELETE, { ...queryType, name: 'deleteCommand' } as Query, params, {} as DocumentNode ) ) ).toEqual( `mutation deleteCommand($foo: Int!) { data: deleteCommand(foo: $foo) { id } } ` ); }); });