Skip to content

Commit 88451fd

Browse files
mernxlnodkz
authored andcommitted
fix(Discriminators): copying base InputTypes to base resolver ArgTypes
* test(discriminator): add more test cases for `mergeCustomizationOptions()` * fix: fix copying base `InputTypes` to copying base resolver `ArgTypes` Refactor: rename fn `setBaseInputTypesOnChildInputTypes` to `copyResolverArgTypes` * test(discriminator): add more test cases for customization Options
1 parent 8fb2928 commit 88451fd

File tree

5 files changed

+128
-25
lines changed

5 files changed

+128
-25
lines changed

src/__tests__/composeWithMongooseDiscriminators-test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,21 @@ describe('composeWithMongooseDiscriminators ->', () => {
5656
expect(itc.isRequired('name')).toBe(true);
5757
expect(itc.isRequired('friends')).toBe(true);
5858
});
59+
60+
it('should be passed down record opts to resolvers', () => {
61+
const typeComposer = composeWithMongooseDiscriminators(CharacterModel, {
62+
resolvers: {
63+
createOne: {
64+
record: {
65+
removeFields: ['friends'],
66+
requiredFields: ['name'],
67+
},
68+
},
69+
},
70+
});
71+
const createOneRecordArgTC = typeComposer.getResolver('createOne').getArgTC('record');
72+
expect(createOneRecordArgTC.isRequired('name')).toBe(true);
73+
expect(createOneRecordArgTC.hasField('friends')).toBe(false);
74+
});
5975
});
6076
});

src/discriminators/__tests__/DiscriminatorTypeComposer-test.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
/* @flow */
22

3-
import { schemaComposer, graphql, TypeComposer, InterfaceTypeComposer } from 'graphql-compose';
3+
import {
4+
SchemaComposer,
5+
schemaComposer,
6+
graphql,
7+
TypeComposer,
8+
InterfaceTypeComposer,
9+
} from 'graphql-compose';
410
import { getCharacterModels } from '../__mocks__/characterModels';
511
import { MovieModel } from '../__mocks__/movieModel';
612
import { composeWithMongoose } from '../../composeWithMongoose';
@@ -498,5 +504,31 @@ describe('DiscriminatorTypeComposer', () => {
498504

499505
expect(tc.getFieldNames()).not.toEqual(expect.arrayContaining(['dob', 'starShips']));
500506
});
507+
508+
it('should pass down baseTypeComposerResolverOptions', () => {
509+
const personTC = composeWithMongooseDiscriminators(CharacterModel, {
510+
schemaComposer: new SchemaComposer(),
511+
resolvers: {
512+
createOne: {
513+
record: {
514+
removeFields: ['friends'],
515+
requiredFields: ['name'],
516+
},
517+
},
518+
},
519+
}).discriminator(PersonModel, {
520+
resolvers: {
521+
createOne: {
522+
record: {
523+
requiredFields: ['dob'],
524+
},
525+
},
526+
},
527+
});
528+
const createOneRecordArgTC = personTC.getResolver('createOne').getArgTC('record');
529+
expect(createOneRecordArgTC.isRequired('name')).toBe(true);
530+
expect(createOneRecordArgTC.isRequired('dob')).toBe(true);
531+
expect(createOneRecordArgTC.hasField('friends')).toBe(false);
532+
});
501533
});
502534
});
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/* @flow */
2+
3+
import { schemaComposer } from 'graphql-compose';
4+
import { getCharacterModels } from '../__mocks__/characterModels';
5+
import { composeWithMongooseDiscriminators } from '../../composeWithMongooseDiscriminators';
6+
7+
const { CharacterModel, PersonModel } = getCharacterModels('type');
8+
9+
describe('prepareChildResolvers()', () => {
10+
describe('copyResolverArgTypes()', () => {
11+
afterAll(() => {
12+
schemaComposer.clear();
13+
});
14+
// Note childResolver Arg fields are copied from baseResolver
15+
const baseDTC = composeWithMongooseDiscriminators(CharacterModel, {
16+
resolvers: {
17+
createOne: {
18+
requiredFields: ['kind'],
19+
},
20+
},
21+
});
22+
const PersonTC = baseDTC.discriminator(PersonModel);
23+
24+
it('should copy base common ResolverArgTypes to child', () => {
25+
expect(
26+
baseDTC
27+
.getResolver('createOne')
28+
.getArgTC('record')
29+
.getFieldType('kind')
30+
).toEqual(
31+
PersonTC.getResolver('createOne')
32+
.getArgTC('record')
33+
.getFieldType('kind')
34+
);
35+
});
36+
});
37+
});

src/discriminators/prepareChildResolvers.js

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -59,30 +59,32 @@ function hideDKey<TContext>(
5959
}
6060
}
6161

62-
// makes sure that all input fields are same as that on Interface,
63-
// that is all should be same as base typeComposer types
64-
// only changes for common properties, executed only once, on discriminator creation
65-
function setBaseInputTypesOnChildInputTypes<TContext>(
62+
// Set baseDTC resolver argTypes on childTC fields shared with DInterface
63+
function copyResolverArgTypes<TContext>(
6664
resolver: ResolverClass<any, TContext>,
6765
baseDTC: DiscriminatorTypeComposer<TContext>,
68-
fromField: string[] | string
66+
fromArg: string[] | string
6967
) {
70-
// set sharedField types on input types
7168
if (resolver && baseDTC.hasInputTypeComposer()) {
72-
if (Array.isArray(fromField)) {
73-
for (const field of fromField) {
74-
setBaseInputTypesOnChildInputTypes(resolver, baseDTC, field);
69+
if (Array.isArray(fromArg)) {
70+
for (const field of fromArg) {
71+
copyResolverArgTypes(resolver, baseDTC, field);
7572
}
76-
} else if (fromField && resolver.hasArg(fromField)) {
77-
const argTc = resolver.getArgTC(fromField);
78-
79-
const baseITCFields = baseDTC.getInputTypeComposer().getFieldNames();
80-
81-
for (const baseField of baseITCFields) {
82-
if (argTc.hasField(baseField) && baseField !== '_id') {
83-
argTc.extendField(baseField, {
84-
type: baseDTC.getInputTypeComposer().getFieldType(baseField),
85-
});
73+
} else if (fromArg && resolver.hasArg(fromArg)) {
74+
if (
75+
baseDTC.hasResolver(resolver.name) &&
76+
baseDTC.getResolver(resolver.name).hasArg(fromArg)
77+
) {
78+
const childResolverArgTc = resolver.getArgTC(fromArg);
79+
const baseResolverArgTC = baseDTC.getResolver(resolver.name).getArgTC(fromArg);
80+
const baseResolverArgTCFields = baseResolverArgTC.getFieldNames();
81+
82+
for (const baseArgField of baseResolverArgTCFields) {
83+
if (childResolverArgTc.hasField(baseArgField) && baseArgField !== '_id') {
84+
childResolverArgTc.extendField(baseArgField, {
85+
type: baseResolverArgTC.getFieldType(baseArgField),
86+
});
87+
}
8688
}
8789
}
8890
}
@@ -167,7 +169,7 @@ export function prepareChildResolvers<TContext>(
167169
default:
168170
}
169171

170-
setBaseInputTypesOnChildInputTypes(resolver, baseDTC, ['filter', 'record']);
172+
copyResolverArgTypes(resolver, baseDTC, ['filter', 'record']);
171173
reorderFieldsRecordFilter(resolver, baseDTC, opts.reorderFields, ['filter', 'record']);
172174
}
173175
}

src/discriminators/utils/__tests__/mergeCustomizationOptions-test.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@ describe('mergeCustomizationOptions()', () => {
147147
removeFields: ['parent', 'child'],
148148
},
149149
},
150+
updateById: {
151+
record: {
152+
removeFields: ['one', 'two'],
153+
requiredFields: ['eight'],
154+
},
155+
},
150156
findMany: {
151157
limit: { defaultValue: 20 },
152158
// sort: false,
@@ -191,9 +197,9 @@ describe('mergeCustomizationOptions()', () => {
191197
},
192198
},
193199
updateById: {
194-
input: {
195-
removeFields: ['one', 'two', 'five'],
196-
requiredFields: ['eight', 'two', 'five'],
200+
record: {
201+
removeFields: ['five'],
202+
requiredFields: ['two', 'five'],
197203
},
198204
},
199205
},
@@ -228,14 +234,24 @@ describe('mergeCustomizationOptions()', () => {
228234
},
229235
findById: false,
230236
updateById: {
231-
input: {
237+
record: {
232238
removeFields: ['one', 'two', 'five'],
233239
requiredFields: ['eight', 'two', 'five'],
234240
},
235241
},
236242
},
237243
};
238244

245+
it('should return most base options if no child', () => {
246+
expect((mergeCustomizationOptions(baseCustomOptions): any).resolvers).toEqual(
247+
baseCustomOptions.resolvers
248+
);
249+
});
250+
251+
it('should return child if no base is found', () => {
252+
expect(mergeCustomizationOptions({}, childCustomOptions)).toEqual(childCustomOptions);
253+
});
254+
239255
it('should merge customisation Options', () => {
240256
expect(mergeCustomizationOptions(baseCustomOptions, childCustomOptions)).toEqual(expected);
241257
});

0 commit comments

Comments
 (0)