UNPKG

graphql-compose-mongoose

Version:

Plugin for `graphql-compose` which derive a graphql types from a mongoose model.

251 lines (231 loc) 8.11 kB
"use strict"; var _index = require("graphql-compose/lib/index"); var _mongooseCommon = require("../__mocks__/mongooseCommon"); var _characterModels = require("../discriminators/__mocks__/characterModels"); var _composeWithMongooseDiscriminators = require("../composeWithMongooseDiscriminators"); const { CharacterModel, PersonModel, DroidModel } = (0, _characterModels.getCharacterModels)('type'); beforeAll(() => _mongooseCommon.mongoose.connect()); afterAll(() => _mongooseCommon.mongoose.disconnect()); describe('#78 Mongoose and Discriminators', () => { const options = { discriminatorKey: 'kind' }; const eventSchema = new _mongooseCommon.mongoose.Schema({ refId: String }, options); const Event = _mongooseCommon.mongoose.model('Event', eventSchema); const clickedLinkSchema = new _mongooseCommon.mongoose.Schema({ url: String }); const ClickedLinkEvent = Event.discriminator('ClickedLinkEvent', clickedLinkSchema); const EventTC = (0, _composeWithMongooseDiscriminators.composeWithMongooseDiscriminators)(Event); const ClickedLinkEventTC = EventTC.discriminator(ClickedLinkEvent); afterAll(() => Event.deleteMany({})); it('creating Types from models', () => { expect(EventTC.getFieldNames()).toEqual(['_id', 'kind', 'refId']); expect(ClickedLinkEventTC.getFieldNames()).toEqual(['_id', 'kind', 'refId', 'url']); }); it('manually override resolver output type for findMany', async () => { // let's check graphql response await Event.create({ refId: 'aaa' }); await Event.create({ refId: 'bbb' }); await ClickedLinkEvent.create({ refId: 'ccc', url: 'url1' }); await ClickedLinkEvent.create({ refId: 'ddd', url: 'url2' }); _index.schemaComposer.Query.addFields({ eventFindMany: EventTC.getResolver('findMany') }); const schema = _index.schemaComposer.buildSchema(); const res = await _index.graphql.graphql(schema, `{ eventFindMany { __typename ... on Event { refId } ... on ClickedLinkEvent { kind refId url } } }`); expect(res).toEqual({ data: { eventFindMany: [{ __typename: 'Event', refId: 'aaa' }, { __typename: 'Event', refId: 'bbb' }, { __typename: 'ClickedLinkEvent', kind: 'ClickedLinkEvent', refId: 'ccc', url: 'url1' }, { __typename: 'ClickedLinkEvent', kind: 'ClickedLinkEvent', refId: 'ddd', url: 'url2' }] } }); }); }); describe('depicting other Enhancements to resolvers', () => { const CharacterDTC = (0, _composeWithMongooseDiscriminators.composeWithMongooseDiscriminators)(CharacterModel); const DroidCTC = CharacterDTC.discriminator(DroidModel); const PersonCTC = CharacterDTC.discriminator(PersonModel); _index.schemaComposer.Query.addFields({ characterById: CharacterDTC.getResolver('findById'), characterByIds: CharacterDTC.getResolver('findByIds'), characterOne: CharacterDTC.getResolver('findOne'), characterMany: CharacterDTC.getResolver('findMany'), characterCount: CharacterDTC.getResolver('count'), characterConnection: CharacterDTC.getResolver('connection'), characterPagination: CharacterDTC.getResolver('pagination') }); _index.schemaComposer.Mutation.addFields({ characterCreate: CharacterDTC.getResolver('createOne'), characterUpdateById: CharacterDTC.getResolver('updateById'), characterUpdateOne: CharacterDTC.getResolver('updateOne'), characterUpdateMany: CharacterDTC.getResolver('updateMany'), characterRemoveById: CharacterDTC.getResolver('removeById'), characterRemoveOne: CharacterDTC.getResolver('removeOne'), characterRemoveMany: CharacterDTC.getResolver('removeMany') }); _index.schemaComposer.Query.addFields({ droidById: DroidCTC.getResolver('findById'), droidByIds: DroidCTC.getResolver('findByIds'), // droidOne: DroidCTC.getResolver('findOne'), droidMany: DroidCTC.getResolver('findMany'), droidCount: DroidCTC.getResolver('count'), droidConnection: DroidCTC.getResolver('connection'), droidPagination: DroidCTC.getResolver('pagination') }); _index.schemaComposer.Mutation.addFields({ droidCreate: DroidCTC.getResolver('createOne'), droidUpdateById: DroidCTC.getResolver('updateById'), droidUpdateOne: DroidCTC.getResolver('updateOne'), droidUpdateMany: DroidCTC.getResolver('updateMany'), droidRemoveById: DroidCTC.getResolver('removeById'), droidRemoveOne: DroidCTC.getResolver('removeOne'), droidRemoveMany: DroidCTC.getResolver('removeMany') }); _index.schemaComposer.Query.addFields({ personById: PersonCTC.getResolver('findById'), personByIds: PersonCTC.getResolver('findByIds'), // personOne: PersonCTC.getResolver('findOne'), personMany: PersonCTC.getResolver('findMany'), personCount: PersonCTC.getResolver('count'), personConnection: PersonCTC.getResolver('connection'), personPagination: PersonCTC.getResolver('pagination') }); _index.schemaComposer.Mutation.addFields({ personCreate: PersonCTC.getResolver('createOne'), personUpdateById: PersonCTC.getResolver('updateById'), personUpdateOne: PersonCTC.getResolver('updateOne'), personUpdateMany: PersonCTC.getResolver('updateMany'), personRemoveById: PersonCTC.getResolver('removeById'), personRemoveOne: PersonCTC.getResolver('removeOne'), personRemoveMany: PersonCTC.getResolver('removeMany') }); const schema = _index.schemaComposer.buildSchema(); describe('baseResolvers Enhancements', () => { describe('createOne', () => { it('should create base document with DKey provided, generic fields', async () => { const res = await _index.graphql.graphql(schema, `mutation CreateCharacters { droidCreate: characterCreate(record: {name: "Queue XL", type: Droid }) { record { __typename type name } } personCreate: characterCreate(record: {name: "mernxl", type: Person }) { record { __typename type name } } }`); expect(res).toEqual({ data: { droidCreate: { record: { __typename: 'Droid', type: 'Droid', name: 'Queue XL' } }, personCreate: { record: { __typename: 'Person', type: 'Person', name: 'mernxl' } } } }); }); }); }); describe('childResolvers Enhancements', () => { describe('createOne', () => { it('should create child document without specifying DKey', async () => { const res = await _index.graphql.graphql(schema, `mutation CreateCharacters { droidCreate(record: {name: "Queue XL", modelNumber: 360 }) { record { __typename type name modelNumber } } personCreate(record: {name: "mernxl", dob: 57275272}) { record { __typename type name dob } } }`); expect(res).toEqual({ data: { droidCreate: { record: { __typename: 'Droid', type: 'Droid', name: 'Queue XL', modelNumber: 360 } }, personCreate: { record: { __typename: 'Person', type: 'Person', name: 'mernxl', dob: 57275272 } } } }); }); }); }); });