Skip to content

Commit

Permalink
fix: Error when using useImplementingTypes and terminateCircularRelat…
Browse files Browse the repository at this point in the history
…ionships at the same time
  • Loading branch information
Swanoo committed Nov 10, 2023
1 parent 5b6b611 commit bf6dd95
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 11 deletions.
33 changes: 22 additions & 11 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,10 @@ const getGeneratorDefinition = (value: GeneratorDefinition | GeneratorName): Gen
return value;
};

const getCasualCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options<NamedTypeNode>) => {
const getCasualCustomValue = (
generatorDefinition: GeneratorDefinition,
opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>,
) => {
// 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];
Expand Down Expand Up @@ -161,7 +164,10 @@ const getFakerGenerators = (generatorName: GeneratorName) => {
return { embeddedGenerator: null, dynamicGenerator: null };
};

const getFakerCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options<NamedTypeNode>) => {
const getFakerCustomValue = (
generatorDefinition: GeneratorDefinition,
opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>,
) => {
// If there is a mapping to a `faker` type, then use it
const { embeddedGenerator, dynamicGenerator } = getFakerGenerators(generatorDefinition.generator);
if (!embeddedGenerator && generatorDefinition.generator) {
Expand Down Expand Up @@ -206,7 +212,10 @@ const getFakerCustomValue = (generatorDefinition: GeneratorDefinition, opts: Opt
return value;
};

const getCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options<NamedTypeNode>) => {
const getCustomValue = (
generatorDefinition: GeneratorDefinition,
opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>,
) => {
if (opts.generateLibrary === 'casual') {
return getCasualCustomValue(generatorDefinition, opts);
}
Expand All @@ -219,7 +228,7 @@ const getCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options<
};

const handleValueGeneration = (
opts: Options<NamedTypeNode>,
opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>,
customScalar: GeneratorDefinition,
baseGenerator: () => void,
) => {
Expand All @@ -244,18 +253,20 @@ const handleValueGeneration = (
return baseGenerator();
};

const getNamedImplementType = (opts: Options<TypeItem['types']>): string => {
if (!opts.currentType || !('name' in opts.currentType)) {
const getNamedImplementType = (opts: Options<TypeItem['types']>): 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<NamedTypeNode>): string | number | boolean => {
const getNamedType = (opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>): string | number | boolean => {
if (!opts.currentType) {
return '';
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Query>, _relationshipsToOmit: Set<string> = new Set()): Query => {
const relationshipsToOmit: Set<string> = 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<User>, _relationshipsToOmit: Set<string> = new Set()): User => {
const relationshipsToOmit: Set<string> = 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<Event>, _relationshipsToOmit: Set<string> = new Set()): Event => {
const relationshipsToOmit: Set<string> = 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<MeetingEvent>, _relationshipsToOmit: Set<string> = new Set()): MeetingEvent => {
const relationshipsToOmit: Set<string> = 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<OtherEvent>, _relationshipsToOmit: Set<string> = new Set()): OtherEvent => {
const relationshipsToOmit: Set<string> = 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',
};
};
"
`;
Original file line number Diff line number Diff line change
@@ -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!
}
`);
Original file line number Diff line number Diff line change
@@ -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();
});

0 comments on commit bf6dd95

Please sign in to comment.