graphql-compose-mongoose
Version:
Plugin for `graphql-compose` which derive a graphql types from a mongoose model.
97 lines (93 loc) • 3.51 kB
JavaScript
import { EnumTypeComposer, schemaComposer } from 'graphql-compose';
import { sortHelperArgs, sortHelper, getSortTypeFromModel } from '../sort';
import { UserModel } from '../../../__mocks__/userModel';
import { convertModelToGraphQL } from '../../../fieldsConverter';
import { getIndexesFromModel } from '../../../utils';
describe('Resolver helper `sort` ->', () => {
let UserTC;
beforeEach(() => {
schemaComposer.clear();
UserTC = convertModelToGraphQL(UserModel, 'User', schemaComposer);
});
describe('getSortTypeFromModel()', () => {
it('should return EnumType', () => {
const typeName = 'SortType';
const etc = getSortTypeFromModel(typeName, UserModel, schemaComposer);
expect(etc).toBeInstanceOf(EnumTypeComposer);
expect(etc.getTypeName()).toBe(typeName);
});
it('should reuse existed EnumType', () => {
const typeName = 'SortType';
const existedETC = schemaComposer.getOrCreateETC(typeName);
const etc = getSortTypeFromModel(typeName, UserModel, schemaComposer);
expect(etc).toBe(existedETC);
});
it('should have proper enum values', () => {
const etc = getSortTypeFromModel('SortType', UserModel, schemaComposer);
const indexedFields = getIndexesFromModel(UserModel); // only indexed fields in enum
const ascDescNum = indexedFields.length * 2;
expect(etc.getFieldNames()).toHaveLength(ascDescNum); // should have ASC DESC keys
const enumNames = etc.getFieldNames();
expect(enumNames).toEqual(expect.arrayContaining(['_ID_ASC', '_ID_DESC'])); // should have ASC criteria for mongoose
const complexASC = etc.getField('NAME__AGE_ASC');
expect(complexASC.value).toEqual({
name: 1,
age: -1
}); // should have DESC criteria for mongoose
const complexDESC = etc.getField('NAME__AGE_DESC');
expect(complexDESC.value).toEqual({
name: -1,
age: 1
});
});
});
describe('sortHelperArgs()', () => {
it('should throw error if first arg is not TypeComposer', () => {
expect(() => {
const wrongArgs = [{}];
sortHelperArgs(...wrongArgs);
}).toThrowError('should be instance of TypeComposer');
});
it('should throw error if second arg is not Mongoose model', () => {
expect(() => {
const wrongArgs = [UserTC, {}];
sortHelperArgs(...wrongArgs);
}).toThrowError('should be instance of Mongoose Model');
});
it('should throw error if `sortTypeName` not provided in opts', () => {
expect(() => sortHelperArgs(UserTC, UserModel)).toThrowError('provide non-empty `sortTypeName`');
});
it('should return sort field', () => {
const args = sortHelperArgs(UserTC, UserModel, {
sortTypeName: 'SortInput'
});
expect(args.sort.type).toBeInstanceOf(EnumTypeComposer);
});
});
describe('sortHelper()', () => {
let spyFn;
let resolveParams;
beforeEach(() => {
spyFn = jest.fn();
resolveParams = {
query: {
sort: spyFn
}
};
});
it('should not call query.sort if args.sort is empty', () => {
sortHelper(resolveParams);
expect(spyFn).not.toHaveBeenCalled();
});
it('should call query.sort if args.sort is provided', () => {
const sortValue = {
_id: 1
};
resolveParams.args = {
sort: sortValue
};
sortHelper(resolveParams);
expect(spyFn).toBeCalledWith(sortValue);
});
});
});