Skip to content

Commit 90d53b6

Browse files
authored
fix: Error when using useImplementingTypes and terminateCircularRelationships at the same time (#141)
Closes #140
1 parent a8caeee commit 90d53b6

File tree

4 files changed

+130
-11
lines changed

4 files changed

+130
-11
lines changed

src/index.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ const getGeneratorDefinition = (value: GeneratorDefinition | GeneratorName): Gen
9292
return value;
9393
};
9494

95-
const getCasualCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options<NamedTypeNode>) => {
95+
const getCasualCustomValue = (
96+
generatorDefinition: GeneratorDefinition,
97+
opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>,
98+
) => {
9699
// If there is a mapping to a `casual` type, then use it and make sure
97100
// to call it if it's a function
98101
const embeddedGenerator = casual[generatorDefinition.generator];
@@ -161,7 +164,10 @@ const getFakerGenerators = (generatorName: GeneratorName) => {
161164
return { embeddedGenerator: null, dynamicGenerator: null };
162165
};
163166

164-
const getFakerCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options<NamedTypeNode>) => {
167+
const getFakerCustomValue = (
168+
generatorDefinition: GeneratorDefinition,
169+
opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>,
170+
) => {
165171
// If there is a mapping to a `faker` type, then use it
166172
const { embeddedGenerator, dynamicGenerator } = getFakerGenerators(generatorDefinition.generator);
167173
if (!embeddedGenerator && generatorDefinition.generator) {
@@ -206,7 +212,10 @@ const getFakerCustomValue = (generatorDefinition: GeneratorDefinition, opts: Opt
206212
return value;
207213
};
208214

209-
const getCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options<NamedTypeNode>) => {
215+
const getCustomValue = (
216+
generatorDefinition: GeneratorDefinition,
217+
opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>,
218+
) => {
210219
if (opts.generateLibrary === 'casual') {
211220
return getCasualCustomValue(generatorDefinition, opts);
212221
}
@@ -219,7 +228,7 @@ const getCustomValue = (generatorDefinition: GeneratorDefinition, opts: Options<
219228
};
220229

221230
const handleValueGeneration = (
222-
opts: Options<NamedTypeNode>,
231+
opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>,
223232
customScalar: GeneratorDefinition,
224233
baseGenerator: () => void,
225234
) => {
@@ -244,18 +253,20 @@ const handleValueGeneration = (
244253
return baseGenerator();
245254
};
246255

247-
const getNamedImplementType = (opts: Options<TypeItem['types']>): string => {
248-
if (!opts.currentType || !('name' in opts.currentType)) {
256+
const getNamedImplementType = (opts: Options<TypeItem['types']>): string | number | boolean => {
257+
const { currentType } = opts;
258+
259+
if (!currentType || !('name' in currentType)) {
249260
return '';
250261
}
251262

252-
const name = opts.currentType.name.value;
253-
const casedName = createNameConverter(opts.typeNamesConvention, opts.transformUnderscore)(name);
254-
255-
return `${toMockName(name, casedName, opts.prefix)}()`;
263+
return getNamedType({
264+
...opts,
265+
currentType,
266+
});
256267
};
257268

258-
const getNamedType = (opts: Options<NamedTypeNode>): string | number | boolean => {
269+
const getNamedType = (opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>): string | number | boolean => {
259270
if (!opts.currentType) {
260271
return '';
261272
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`should support useImplementingTypes and terminateCircularRelationships at the same time 1`] = `
4+
"
5+
export const mockQuery = (overrides?: Partial<Query>, _relationshipsToOmit: Set<string> = new Set()): Query => {
6+
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
7+
relationshipsToOmit.add('Query');
8+
return {
9+
getUser: overrides && overrides.hasOwnProperty('getUser') ? overrides.getUser! : relationshipsToOmit.has('User') ? {} as User : mockUser({}, relationshipsToOmit),
10+
};
11+
};
12+
13+
export const mockUser = (overrides?: Partial<User>, _relationshipsToOmit: Set<string> = new Set()): User => {
14+
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
15+
relationshipsToOmit.add('User');
16+
return {
17+
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : 'est',
18+
events: overrides && overrides.hasOwnProperty('events') ? overrides.events! : [relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)],
19+
};
20+
};
21+
22+
export const mockEvent = (overrides?: Partial<Event>, _relationshipsToOmit: Set<string> = new Set()): Event => {
23+
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
24+
relationshipsToOmit.add('Event');
25+
return {
26+
startDate: overrides && overrides.hasOwnProperty('startDate') ? overrides.startDate! : 'sunt',
27+
endDate: overrides && overrides.hasOwnProperty('endDate') ? overrides.endDate! : 'harum',
28+
timeZone: overrides && overrides.hasOwnProperty('timeZone') ? overrides.timeZone! : 'voluptatem',
29+
};
30+
};
31+
32+
export const mockMeetingEvent = (overrides?: Partial<MeetingEvent>, _relationshipsToOmit: Set<string> = new Set()): MeetingEvent => {
33+
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
34+
relationshipsToOmit.add('MeetingEvent');
35+
return {
36+
endDate: overrides && overrides.hasOwnProperty('endDate') ? overrides.endDate! : 'quae',
37+
startDate: overrides && overrides.hasOwnProperty('startDate') ? overrides.startDate! : 'aspernatur',
38+
timeZone: overrides && overrides.hasOwnProperty('timeZone') ? overrides.timeZone! : 'quos',
39+
event: overrides && overrides.hasOwnProperty('event') ? overrides.event! : relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit),
40+
};
41+
};
42+
43+
export const mockOtherEvent = (overrides?: Partial<OtherEvent>, _relationshipsToOmit: Set<string> = new Set()): OtherEvent => {
44+
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
45+
relationshipsToOmit.add('OtherEvent');
46+
return {
47+
endDate: overrides && overrides.hasOwnProperty('endDate') ? overrides.endDate! : 'ut',
48+
startDate: overrides && overrides.hasOwnProperty('startDate') ? overrides.startDate! : 'neque',
49+
timeZone: overrides && overrides.hasOwnProperty('timeZone') ? overrides.timeZone! : 'aut',
50+
somethingElse: overrides && overrides.hasOwnProperty('somethingElse') ? overrides.somethingElse! : 'ut',
51+
};
52+
};
53+
"
54+
`;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { buildSchema } from 'graphql';
2+
3+
export default buildSchema(/* GraphQL */ `
4+
type Query {
5+
getUser(id: String!): User
6+
}
7+
8+
type User {
9+
id: String!
10+
events: [Event!]
11+
}
12+
13+
interface Event {
14+
startDate: String
15+
endDate: String
16+
timeZone: String
17+
}
18+
19+
type MeetingEvent implements Event {
20+
endDate: String
21+
startDate: String
22+
timeZone: String
23+
event: Event!
24+
}
25+
26+
type OtherEvent implements Event {
27+
endDate: String
28+
startDate: String
29+
timeZone: String
30+
somethingElse: String!
31+
}
32+
`);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { plugin } from '../../src';
2+
import testSchema from './schema';
3+
4+
it('should support useImplementingTypes and terminateCircularRelationships at the same time', async () => {
5+
const result = await plugin(testSchema, [], {
6+
prefix: 'mock',
7+
useImplementingTypes: true,
8+
terminateCircularRelationships: true,
9+
});
10+
11+
expect(result).toBeDefined();
12+
13+
expect(result).toContain(
14+
"events: overrides && overrides.hasOwnProperty('events') ? overrides.events! : [relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)]",
15+
);
16+
17+
expect(result).toContain(
18+
"event: overrides && overrides.hasOwnProperty('event') ? overrides.event! : relationshipsToOmit.has('MeetingEvent') ? {} as MeetingEvent : mockMeetingEvent({}, relationshipsToOmit) || relationshipsToOmit.has('OtherEvent') ? {} as OtherEvent : mockOtherEvent({}, relationshipsToOmit)",
19+
);
20+
21+
expect(result).toMatchSnapshot();
22+
});

0 commit comments

Comments
 (0)