Skip to content

Commit d2c8fd3

Browse files
committed
1 parent b231b0c commit d2c8fd3

File tree

3 files changed

+66
-6
lines changed

3 files changed

+66
-6
lines changed

src/__tests__/integration-discriminators-test.ts

+43-5
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ afterAll(() => mongoose.disconnect());
1111
describe('#78 Mongoose and Discriminators', () => {
1212
const options = { discriminatorKey: 'kind' };
1313

14-
const eventSchema = new mongoose.Schema({ refId: String }, options);
14+
const eventSchema = new mongoose.Schema(
15+
{ refId: String, name: { type: String, index: true } },
16+
options
17+
);
1518
const Event = mongoose.model('Event', eventSchema);
1619

17-
const clickedLinkSchema = new mongoose.Schema({ url: String });
20+
const clickedLinkSchema = new mongoose.Schema({ url: { type: String, index: true } }, options);
1821
const ClickedLinkEvent = Event.discriminator('ClickedLinkEvent', clickedLinkSchema);
1922

2023
const EventTC = composeWithMongooseDiscriminators(Event);
@@ -23,13 +26,48 @@ describe('#78 Mongoose and Discriminators', () => {
2326
afterAll(() => Event.deleteMany({}));
2427

2528
it('creating Types from models', () => {
26-
expect(EventTC.getFieldNames()).toEqual(['_id', 'kind', 'refId']);
27-
expect(ClickedLinkEventTC.getFieldNames()).toEqual(['_id', 'kind', 'refId', 'url']);
29+
expect(EventTC.getFieldNames()).toEqual(['_id', 'kind', 'refId', 'name']);
30+
expect(ClickedLinkEventTC.getFieldNames()).toEqual(['_id', 'kind', 'refId', 'name', 'url']);
2831
});
2932

30-
it('manually override resolver output type for findMany', async () => {
33+
it('perform filter operation on a child model', async () => {
3134
// let's check graphql response
35+
await Event.deleteMany({});
36+
await Event.create({ refId: 'aaa', name: 'aName' });
37+
await Event.create({ refId: 'bbb', name: 'bName' });
38+
await ClickedLinkEvent.create({ refId: 'ccc', name: 'cName', url: 'url1' });
39+
await ClickedLinkEvent.create({ refId: 'ddd', name: 'dName', url: 'url2' });
40+
41+
schemaComposer.Query.addFields({
42+
clickedLinkEventFindMany: ClickedLinkEventTC.getResolver('findMany'),
43+
});
44+
45+
const schema = schemaComposer.buildSchema();
3246

47+
const res = await graphql.graphql(
48+
schema,
49+
`{
50+
clickedLinkEventFindMany( filter: { AND: [ { _operators: { url: { in: [ "url1", "url2" ] } } }, { name: "dName" } ] }) {
51+
__typename
52+
refId
53+
name
54+
url
55+
}
56+
}`
57+
);
58+
59+
expect(res).toEqual({
60+
data: {
61+
clickedLinkEventFindMany: [
62+
{ __typename: 'ClickedLinkEvent', refId: 'ddd', name: 'dName', url: 'url2' },
63+
],
64+
},
65+
});
66+
});
67+
68+
it('manually override resolver output type for findMany', async () => {
69+
// let's check graphql response
70+
await Event.deleteMany({});
3371
await Event.create({ refId: 'aaa' });
3472
await Event.create({ refId: 'bbb' });
3573
await ClickedLinkEvent.create({ refId: 'ccc', url: 'url1' });

src/discriminators/__tests__/prepareChildResolvers-test.ts

+18
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { schemaComposer, ObjectTypeComposer } from 'graphql-compose';
22
import { composeWithMongooseDiscriminators } from '../../composeWithMongooseDiscriminators';
33
import { getCharacterModels } from '../__mocks__/characterModels';
4+
import { OPERATORS_FIELDNAME } from '../../resolvers/helpers/filterOperators';
45

56
const DKeyFieldName = 'type';
67
const { CharacterModel, PersonModel } = getCharacterModels(DKeyFieldName);
@@ -116,5 +117,22 @@ describe('prepareChildResolvers()', () => {
116117
PersonTC.getResolver('createOne').getArgITC('record').getFieldType('kind')
117118
);
118119
});
120+
121+
it('should not copy base _operations to child', () => {
122+
expect(
123+
baseDTC
124+
.getResolver('findMany')
125+
.getArgITC('filter')
126+
.getField(OPERATORS_FIELDNAME)
127+
.type.getTypeName()
128+
).toEqual('FilterFindManyCharacterOperatorsInput');
129+
130+
expect(
131+
PersonTC.getResolver('findMany')
132+
.getArgITC('filter')
133+
.getField(OPERATORS_FIELDNAME)
134+
.type.getTypeName()
135+
).toEqual('FilterFindManyPersonOperatorsInput');
136+
});
119137
});
120138
});

src/discriminators/prepareChildResolvers.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
DiscriminatorTypeComposer,
55
} from './DiscriminatorTypeComposer';
66
import { resolverFactory } from '../resolvers';
7+
import { OPERATORS_FIELDNAME } from '../resolvers/helpers/filterOperators';
78

89
// set the DKey as a query on filter, also project it
910
// Also look at it like setting for filters, makes sure to limit
@@ -85,7 +86,10 @@ function copyResolverArgTypes<TSource, TContext>(
8586
const baseResolverArgTCFields = baseResolverArgTC.getFieldNames();
8687

8788
for (const baseArgField of baseResolverArgTCFields) {
88-
if (childResolverArgTC.hasField(baseArgField) && baseArgField !== '_id') {
89+
if (
90+
childResolverArgTC.hasField(baseArgField) &&
91+
['_id', OPERATORS_FIELDNAME, 'OR', 'AND'].indexOf(baseArgField) === -1
92+
) {
8993
childResolverArgTC.extendField(baseArgField, {
9094
type: baseResolverArgTC.getField(baseArgField).type,
9195
});

0 commit comments

Comments
 (0)