UNPKG

graphql-compose-mongoose

Version:

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

168 lines (152 loc) 4.82 kB
"use strict"; var _graphqlCompose = require("graphql-compose"); var _graphql = require("graphql-compose/lib/graphql"); var _userModel = require("../__mocks__/userModel"); var _index = require("../index"); beforeAll(() => _userModel.UserModel.base.connect()); afterAll(() => _userModel.UserModel.base.disconnect()); describe('integration tests', () => { beforeEach(() => { _graphqlCompose.schemaComposer.clear(); }); describe('check subdocuments', () => { it('should return null if subdocument is empty', async () => { const UserTC = (0, _index.composeWithMongoose)(_userModel.UserModel); _graphqlCompose.schemaComposer.Query.addFields({ user: UserTC.getResolver('findById') }); const schema = _graphqlCompose.schemaComposer.buildSchema(); const user = new _userModel.UserModel({ name: 'Test empty subDoc' }); await user.save(); const result = await (0, _graphql.graphql)(schema, `{ user(_id: "${user._id}") { name subDoc { field1 field2 { field21 } } } }`); expect(result.data.user).toEqual({ name: 'Test empty subDoc', subDoc: null }); }); it('should return subdocument if it is non-empty', async () => { const UserTC = (0, _index.composeWithMongoose)(_userModel.UserModel); // UserTC.get('$findById.subDoc').extendField('field2', { // resolve: (source) => { // console.log('$findById.subDoc.field2 source:', source) // return source.field2; // } // }) _graphqlCompose.schemaComposer.Query.addFields({ user: UserTC.getResolver('findById') }); const schema = _graphqlCompose.schemaComposer.buildSchema(); const user2 = new _userModel.UserModel({ name: 'Test non empty subDoc', subDoc: { field2: { field21: 'ok' } } }); await user2.save(); const result2 = await (0, _graphql.graphql)(schema, `{ user(_id: "${user2._id}") { name subDoc { field1 field2 { field21 } } } }`); expect(result2.data.user).toEqual({ name: 'Test non empty subDoc', subDoc: { field1: null, field2: { field21: 'ok' } } }); }); }); describe('check mixed field', () => { it('should properly return data via graphql query', async () => { const UserTC = (0, _index.composeWithMongoose)(_userModel.UserModel, { schemaComposer: _graphqlCompose.schemaComposer }); const user = new _userModel.UserModel({ name: 'nodkz', someDynamic: { a: 123, b: [1, 2, true, false, 'ok'], c: { c: 1 }, d: null, e: 'str', f: true, g: false } }); await user.save(); _graphqlCompose.schemaComposer.Query.addFields({ user: UserTC.getResolver('findById') }); const schema = _graphqlCompose.schemaComposer.buildSchema(); const query = `{ user(_id: "${user._id}") { name someDynamic } }`; const result = await (0, _graphql.graphql)(schema, query); expect(result.data.user.name).toBe(user.name); expect(result.data.user.someDynamic).toEqual(user.someDynamic); }); }); describe('projection', () => { let schema; let UserTC; beforeAll(async () => { UserTC = (0, _index.composeWithMongoose)(_userModel.UserModel); UserTC.addFields({ rawData: { type: 'JSON', resolve: source => source.toJSON(), projection: { '*': true } } }); _graphqlCompose.schemaComposer.Query.addFields({ user: UserTC.getResolver('findById') }); schema = _graphqlCompose.schemaComposer.buildSchema(); await _userModel.UserModel.create({ _id: '100000000000000000000000', name: 'Name', age: 20, gender: 'male', skills: ['a', 'b', 'c'], relocation: true }); }); it('should request only fields from query', async () => { const res = await (0, _graphql.graphql)(schema, '{ user(_id: "100000000000000000000000") { name } }'); expect(res).toMatchSnapshot('projection from query fields'); }); it('should request all fields to rawData field', async () => { const res = await (0, _graphql.graphql)(schema, '{ user(_id: "100000000000000000000000") { rawData } }'); expect(Object.keys(res.data.user.rawData)).toMatchSnapshot('projection from all fields'); }); }); });