Skip to content

Commit 9b0d2aa

Browse files
author
Daniel Playfair Cal
committed
fix input types containing fields which are input objects with oneOf directive
1 parent 0e592ed commit 9b0d2aa

File tree

3 files changed

+144
-2
lines changed

3 files changed

+144
-2
lines changed

src/index.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { parse, TypeNode, ASTKindToNode, ListTypeNode, NamedTypeNode, ObjectTypeDefinitionNode } from 'graphql';
1+
import { parse, TypeNode, ASTKindToNode, ListTypeNode, NamedTypeNode, ObjectTypeDefinitionNode, Kind } from 'graphql';
22
import * as allFakerLocales from '@faker-js/faker';
33
import casual from 'casual';
44
import { oldVisit, PluginFunction, resolveExternalModuleAndFn } from '@graphql-codegen/plugin-helpers';
@@ -409,6 +409,7 @@ const getNamedType = (opts: Options<NamedTypeNode | ObjectTypeDefinitionNode>):
409409
throw `foundType is unknown: ${foundType.name}: ${foundType.type}`;
410410
}
411411
}
412+
412413
if (opts.terminateCircularRelationships) {
413414
return handleValueGeneration(opts, null, () => {
414415
if (opts.typesPrefix) {
@@ -801,12 +802,28 @@ export const plugin: PluginFunction<TypescriptMocksPluginConfig> = (schema, docu
801802
} else if (node.fields) {
802803
mockFieldsString = node.fields
803804
.map((field) => {
805+
const typeName = field.type.kind === Kind.NAMED_TYPE ? field.type.name.value : null;
806+
const fieldIsOneOfType = Boolean(
807+
typeName &&
808+
astNode.definitions.find(
809+
(definition) =>
810+
definition.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION &&
811+
definition.name.value === typeName &&
812+
definition.directives.some(
813+
(directive) => directive.name.value === 'oneOf',
814+
),
815+
),
816+
);
817+
804818
const value = generateMockValue({
805819
typeName: fieldName,
806820
fieldName: field.name.value,
807821
currentType: field.type,
808822
generatorMode: 'input',
809823
...sharedGenerateMockOpts,
824+
terminateCircularRelationships: fieldIsOneOfType
825+
? false
826+
: sharedGenerateMockOpts.terminateCircularRelationships,
810827
});
811828

812829
const valueWithOverride = `overrides && overrides.hasOwnProperty('${field.name.value}') ? overrides.${field.name.value}! : ${value}`;

tests/__snapshots__/typescript-mock-data.spec.ts.snap

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1378,6 +1378,121 @@ export const seedMocks = (seed: number) => casual.seed(seed);
13781378
"
13791379
`;
13801380

1381+
exports[`should generate mock data for an input type containing a field with a oneOf directive 1`] = `
1382+
"
1383+
export const anAvatar = (overrides?: Partial<Avatar>, _relationshipsToOmit: Set<string> = new Set()): Avatar => {
1384+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1385+
relationshipsToOmit.add('Avatar');
1386+
return {
1387+
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : '15f9c394-c8fc-46bc-a882-b3b853f28c03',
1388+
url: overrides && overrides.hasOwnProperty('url') ? overrides.url! : 'consectetur',
1389+
};
1390+
};
1391+
1392+
export const aUser = (overrides?: Partial<User>, _relationshipsToOmit: Set<string> = new Set()): User => {
1393+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1394+
relationshipsToOmit.add('User');
1395+
return {
1396+
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : 'b7605a2a-ad1e-4667-801e-5e47e5de933b',
1397+
creationDate: overrides && overrides.hasOwnProperty('creationDate') ? overrides.creationDate! : '2021-07-07T09:30:34.236Z',
1398+
login: overrides && overrides.hasOwnProperty('login') ? overrides.login! : 'sordeo',
1399+
avatar: overrides && overrides.hasOwnProperty('avatar') ? overrides.avatar! : relationshipsToOmit.has('Avatar') ? {} as Avatar : anAvatar({}, relationshipsToOmit),
1400+
status: overrides && overrides.hasOwnProperty('status') ? overrides.status! : Status.Online,
1401+
customStatus: overrides && overrides.hasOwnProperty('customStatus') ? overrides.customStatus! : AbcStatus.HasXyzStatus,
1402+
scalarValue: overrides && overrides.hasOwnProperty('scalarValue') ? overrides.scalarValue! : 'arx',
1403+
camelCaseThing: overrides && overrides.hasOwnProperty('camelCaseThing') ? overrides.camelCaseThing! : relationshipsToOmit.has('CamelCaseThing') ? {} as CamelCaseThing : aCamelCaseThing({}, relationshipsToOmit),
1404+
unionThing: overrides && overrides.hasOwnProperty('unionThing') ? overrides.unionThing! : relationshipsToOmit.has('Avatar') ? {} as Avatar : anAvatar({}, relationshipsToOmit),
1405+
prefixedEnum: overrides && overrides.hasOwnProperty('prefixedEnum') ? overrides.prefixedEnum! : PrefixedEnum.PrefixedValue,
1406+
};
1407+
};
1408+
1409+
export const aWithAvatar = (overrides?: Partial<WithAvatar>, _relationshipsToOmit: Set<string> = new Set()): WithAvatar => {
1410+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1411+
relationshipsToOmit.add('WithAvatar');
1412+
return {
1413+
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : '9f1e2e6d-2047-44ac-ac43-58f18eff5255',
1414+
avatar: overrides && overrides.hasOwnProperty('avatar') ? overrides.avatar! : relationshipsToOmit.has('Avatar') ? {} as Avatar : anAvatar({}, relationshipsToOmit),
1415+
};
1416+
};
1417+
1418+
export const aCamelCaseThing = (overrides?: Partial<CamelCaseThing>, _relationshipsToOmit: Set<string> = new Set()): CamelCaseThing => {
1419+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1420+
relationshipsToOmit.add('CamelCaseThing');
1421+
return {
1422+
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : '259f1f94-0fee-4e7d-8280-96dd5d8d9177',
1423+
};
1424+
};
1425+
1426+
export const aPrefixedResponse = (overrides?: Partial<PrefixedResponse>, _relationshipsToOmit: Set<string> = new Set()): PrefixedResponse => {
1427+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1428+
relationshipsToOmit.add('PrefixedResponse');
1429+
return {
1430+
ping: overrides && overrides.hasOwnProperty('ping') ? overrides.ping! : 'nam',
1431+
};
1432+
};
1433+
1434+
export const anAbcType = (overrides?: Partial<AbcType>, _relationshipsToOmit: Set<string> = new Set()): AbcType => {
1435+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1436+
relationshipsToOmit.add('AbcType');
1437+
return {
1438+
abc: overrides && overrides.hasOwnProperty('abc') ? overrides.abc! : 'accommodo',
1439+
};
1440+
};
1441+
1442+
export const aListType = (overrides?: Partial<ListType>, _relationshipsToOmit: Set<string> = new Set()): ListType => {
1443+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1444+
relationshipsToOmit.add('ListType');
1445+
return {
1446+
stringList: overrides && overrides.hasOwnProperty('stringList') ? overrides.stringList! : ['accusator'],
1447+
nullableStringList: overrides && overrides.hasOwnProperty('nullableStringList') ? overrides.nullableStringList! : ['tricesimus'],
1448+
};
1449+
};
1450+
1451+
export const anUpdateUserInput = (overrides?: Partial<UpdateUserInput>, _relationshipsToOmit: Set<string> = new Set()): UpdateUserInput => {
1452+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1453+
relationshipsToOmit.add('UpdateUserInput');
1454+
return {
1455+
id: overrides && overrides.hasOwnProperty('id') ? overrides.id! : '0696d260-ef45-407d-ac64-e375cbd7e441',
1456+
login: overrides && overrides.hasOwnProperty('login') ? overrides.login! : 'apud',
1457+
avatar: overrides && overrides.hasOwnProperty('avatar') ? overrides.avatar! : relationshipsToOmit.has('Avatar') ? {} as Avatar : anAvatar({}, relationshipsToOmit),
1458+
};
1459+
};
1460+
1461+
export const aOneOfInput = (override?: OneOfInput, _relationshipsToOmit: Set<string> = new Set()): OneOfInput => {
1462+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1463+
relationshipsToOmit.add('OneOfInput');
1464+
return {
1465+
...(override ? override : {oneOfFieldA : 'tibi'}),
1466+
};
1467+
};
1468+
1469+
export const aContainsOneOfInput = (overrides?: Partial<ContainsOneOfInput>, _relationshipsToOmit: Set<string> = new Set()): ContainsOneOfInput => {
1470+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1471+
relationshipsToOmit.add('ContainsOneOfInput');
1472+
return {
1473+
field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : aOneOfInput(),
1474+
};
1475+
};
1476+
1477+
export const aMutation = (overrides?: Partial<Mutation>, _relationshipsToOmit: Set<string> = new Set()): Mutation => {
1478+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1479+
relationshipsToOmit.add('Mutation');
1480+
return {
1481+
updateUser: overrides && overrides.hasOwnProperty('updateUser') ? overrides.updateUser! : relationshipsToOmit.has('User') ? {} as User : aUser({}, relationshipsToOmit),
1482+
};
1483+
};
1484+
1485+
export const aQuery = (overrides?: Partial<Query>, _relationshipsToOmit: Set<string> = new Set()): Query => {
1486+
const relationshipsToOmit: Set<string> = _relationshipsToOmit;
1487+
relationshipsToOmit.add('Query');
1488+
return {
1489+
user: overrides && overrides.hasOwnProperty('user') ? overrides.user! : relationshipsToOmit.has('User') ? {} as User : aUser({}, relationshipsToOmit),
1490+
prefixed_query: overrides && overrides.hasOwnProperty('prefixed_query') ? overrides.prefixed_query! : relationshipsToOmit.has('PrefixedResponse') ? {} as PrefixedResponse : aPrefixedResponse({}, relationshipsToOmit),
1491+
};
1492+
};
1493+
"
1494+
`;
1495+
13811496
exports[`should generate mock data functions 1`] = `
13821497
"
13831498
export const anAvatar = (overrides?: Partial<Avatar>): Avatar => {
@@ -3882,7 +3997,7 @@ export const aContainsOneOfInput = (overrides?: Partial<ContainsOneOfInput>, _re
38823997
const relationshipsToOmit: Set<string> = new Set(_relationshipsToOmit);
38833998
relationshipsToOmit.add('ContainsOneOfInput');
38843999
return {
3885-
field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : relationshipsToOmit.has('OneOfInput') ? {} as OneOfInput : aOneOfInput({}, relationshipsToOmit),
4000+
field: overrides && overrides.hasOwnProperty('field') ? overrides.field! : aOneOfInput(),
38864001
};
38874002
};
38884003

tests/typescript-mock-data.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,16 @@ it('should generate mock data for an input type with a oneOf directive', async (
135135
expect(result).toContain(`...(override ? override : {oneOfFieldA : 'tibi'}),`);
136136
});
137137

138+
it('should generate mock data for an input type containing a field with a oneOf directive', async () => {
139+
const result = await plugin(testSchema, [], {
140+
terminateCircularRelationships: 'immediate',
141+
});
142+
143+
expect(result).toBeDefined();
144+
145+
expect(result).toMatchSnapshot();
146+
});
147+
138148
it('should generate mock data functions with external types file import', async () => {
139149
const result = await plugin(testSchema, [], { typesFile: './types/graphql.ts' });
140150

0 commit comments

Comments
 (0)