diff --git a/src/index.ts b/src/index.ts index fb0c773..5b509bb 100644 --- a/src/index.ts +++ b/src/index.ts @@ -92,7 +92,10 @@ const getGeneratorDefinition = (value: GeneratorDefinition | GeneratorName): Gen return value; }; -const getCasualCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options) => { +const getCasualCustomValue = ( + generatorDefinition: GeneratorDefinition, + opts: Options, +) => { // If there is a mapping to a `casual` type, then use it and make sure // to call it if it's a function const embeddedGenerator = casual[generatorDefinition.generator]; @@ -161,7 +164,10 @@ const getFakerGenerators = (generatorName: GeneratorName) => { return { embeddedGenerator: null, dynamicGenerator: null }; }; -const getFakerCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options) => { +const getFakerCustomValue = ( + generatorDefinition: GeneratorDefinition, + opts: Options, +) => { // If there is a mapping to a `faker` type, then use it const { embeddedGenerator, dynamicGenerator } = getFakerGenerators(generatorDefinition.generator); if (!embeddedGenerator && generatorDefinition.generator) { @@ -206,7 +212,10 @@ const getFakerCustomValue = (generatorDefinition: GeneratorDefinition, opts: Opt return value; }; -const getCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options) => { +const getCustomValue = ( + generatorDefinition: GeneratorDefinition, + opts: Options, +) => { if (opts.generateLibrary === 'casual') { return getCasualCustomValue(generatorDefinition, opts); } @@ -219,7 +228,7 @@ const getCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options< }; const handleValueGeneration = ( - opts: Options, + opts: Options, customScalar: GeneratorDefinition, baseGenerator: () => void, ) => { @@ -244,18 +253,20 @@ const handleValueGeneration = ( return baseGenerator(); }; -const getNamedImplementType = (opts: Options): string => { - if (!opts.currentType || !('name' in opts.currentType)) { +const getNamedImplementType = (opts: Options): string | number | boolean => { + const { currentType } = opts; + + if (!currentType || !('name' in currentType)) { return ''; } - const name = opts.currentType.name.value; - const casedName = createNameConverter(opts.typeNamesConvention, opts.transformUnderscore)(name); - - return `${toMockName(name, casedName, opts.prefix)}()`; + return getNamedType({ + ...opts, + currentType, + }); }; -const getNamedType = (opts: Options): string | number | boolean => { +const getNamedType = (opts: Options): string | number | boolean => { if (!opts.currentType) { return ''; } diff --git a/tests/useImplementingTypesAndTerminateCircularRelationships/__snapshots__/spec.ts.snap b/tests/useImplementingTypesAndTerminateCircularRelationships/__snapshots__/spec.ts.snap new file mode 100644 index 0000000..aa917e9 --- /dev/null +++ b/tests/useImplementingTypesAndTerminateCircularRelationships/__snapshots__/spec.ts.snap @@ -0,0 +1,54 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`should support useImplementingTypes and terminateCircularRelationships at the same time 1`] = ` +" +export const mockQuery = (overrides?: Partial, _relationshipsToOmit: Set = new Set()): Query => { + const relationshipsToOmit: Set = new Set(_relationshipsToOmit); + relationshipsToOmit.add('Query'); + return { + getUser: overrides && overrides.hasOwnProperty('getUser') ? overrides.getUser! : relationshipsToOmit.has('User') ? {} as User : mockUser({}, relationshipsToOmit), + }; +}; + +export const mockUser = (overrides?: Partial, _relationshipsToOmit: Set = new Set()): User => { + const relationshipsToOmit: Set = new Set(_relationshipsToOmit); + relationshipsToOmit.add('User'); + return { + id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : 'est', + events: overrides && overrides.hasOwnProperty('events') ? overrides.events! : [relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)], + }; +}; + +export const mockEvent = (overrides?: Partial, _relationshipsToOmit: Set = new Set()): Event => { + const relationshipsToOmit: Set = new Set(_relationshipsToOmit); + relationshipsToOmit.add('Event'); + return { + startDate: overrides && overrides.hasOwnProperty('startDate') ? overrides.startDate! : 'sunt', + endDate: overrides && overrides.hasOwnProperty('endDate') ? overrides.endDate! : 'harum', + timeZone: overrides && overrides.hasOwnProperty('timeZone') ? overrides.timeZone! : 'voluptatem', + }; +}; + +export const mockMeetingEvent = (overrides?: Partial, _relationshipsToOmit: Set = new Set()): MeetingEvent => { + const relationshipsToOmit: Set = new Set(_relationshipsToOmit); + relationshipsToOmit.add('MeetingEvent'); + return { + endDate: overrides && overrides.hasOwnProperty('endDate') ? overrides.endDate! : 'quae', + startDate: overrides && overrides.hasOwnProperty('startDate') ? overrides.startDate! : 'aspernatur', + timeZone: overrides && overrides.hasOwnProperty('timeZone') ? overrides.timeZone! : 'quos', + event: overrides && overrides.hasOwnProperty('event') ? overrides.event! : relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit), + }; +}; + +export const mockOtherEvent = (overrides?: Partial, _relationshipsToOmit: Set = new Set()): OtherEvent => { + const relationshipsToOmit: Set = new Set(_relationshipsToOmit); + relationshipsToOmit.add('OtherEvent'); + return { + endDate: overrides && overrides.hasOwnProperty('endDate') ? overrides.endDate! : 'ut', + startDate: overrides && overrides.hasOwnProperty('startDate') ? overrides.startDate! : 'neque', + timeZone: overrides && overrides.hasOwnProperty('timeZone') ? overrides.timeZone! : 'aut', + somethingElse: overrides && overrides.hasOwnProperty('somethingElse') ? overrides.somethingElse! : 'ut', + }; +}; +" +`; diff --git a/tests/useImplementingTypesAndTerminateCircularRelationships/schema.ts b/tests/useImplementingTypesAndTerminateCircularRelationships/schema.ts new file mode 100644 index 0000000..cf5007a --- /dev/null +++ b/tests/useImplementingTypesAndTerminateCircularRelationships/schema.ts @@ -0,0 +1,32 @@ +import { buildSchema } from 'graphql'; + +export default buildSchema(/* GraphQL */ ` + type Query { + getUser(id: String!): User + } + + type User { + id: String! + events: [Event!] + } + + interface Event { + startDate: String + endDate: String + timeZone: String + } + + type MeetingEvent implements Event { + endDate: String + startDate: String + timeZone: String + event: Event! + } + + type OtherEvent implements Event { + endDate: String + startDate: String + timeZone: String + somethingElse: String! + } +`); diff --git a/tests/useImplementingTypesAndTerminateCircularRelationships/spec.ts b/tests/useImplementingTypesAndTerminateCircularRelationships/spec.ts new file mode 100644 index 0000000..d3fc387 --- /dev/null +++ b/tests/useImplementingTypesAndTerminateCircularRelationships/spec.ts @@ -0,0 +1,22 @@ +import { plugin } from '../../src'; +import testSchema from './schema'; + +it('should support useImplementingTypes and terminateCircularRelationships at the same time', async () => { + const result = await plugin(testSchema, [], { + prefix: 'mock', + useImplementingTypes: true, + terminateCircularRelationships: true, + }); + + expect(result).toBeDefined(); + + expect(result).toContain( + "events: overrides && overrides.hasOwnProperty('events') ? overrides.events! : [relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)]", + ); + + expect(result).toContain( + "event: overrides && overrides.hasOwnProperty('event') ? overrides.event! : relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)", + ); + + expect(result).toMatchSnapshot(); +});