Skip to content

Commit

Permalink
feat(TypeComposer InputTypeComposer Resolver): Make set methods chain…
Browse files Browse the repository at this point in the history
…able
  • Loading branch information
nodkz committed Mar 13, 2017
1 parent 3b02947 commit 6f775e7
Show file tree
Hide file tree
Showing 6 changed files with 289 additions and 196 deletions.
42 changes: 28 additions & 14 deletions src/__tests__/inputTypeComposer-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import {
} from 'graphql';
import InputTypeComposer from '../inputTypeComposer';


describe('InputTypeComposer', () => {
let objectType;

Expand Down Expand Up @@ -81,8 +80,7 @@ describe('InputTypeComposer', () => {
expect(tc.getFieldType('input3')).to.equal(typeAsFn);

// show provide unwrapped/unhoisted type for graphql
expect(tc.getType()._typeConfig.fields().input3.type)
.to.equal(GraphQLString);
expect(tc.getType()._typeConfig.fields().input3.type).to.equal(GraphQLString);
});
});

Expand All @@ -92,8 +90,7 @@ describe('InputTypeComposer', () => {
input3: { type: GraphQLString },
input4: { type: GraphQLString },
});
expect(tc.getFieldNames())
.to.have.members(['input1', 'input2', 'input3', 'input4']);
expect(tc.getFieldNames()).to.have.members(['input1', 'input2', 'input3', 'input4']);
});

it('removeField()', () => {
Expand Down Expand Up @@ -208,13 +205,15 @@ describe('InputTypeComposer', () => {
});

it('should create ITC by type template string', () => {
const TC = InputTypeComposer.create(`
const TC = InputTypeComposer.create(
`
input TestTypeTplInput {
f1: String
# Description for some required Int field
f2: Int!
}
`);
`
);
expect(TC).instanceof(InputTypeComposer);
expect(TC.getTypeName()).equal('TestTypeTplInput');
expect(TC.getFieldType('f1')).equal(GraphQLString);
Expand Down Expand Up @@ -255,15 +254,30 @@ describe('InputTypeComposer', () => {
});

it('get() should return type by path', () => {
const tc = new InputTypeComposer(new GraphQLInputObjectType({
name: 'Writable',
fields: {
field1: {
type: GraphQLString,
const tc = new InputTypeComposer(
new GraphQLInputObjectType({
name: 'Writable',
fields: {
field1: {
type: GraphQLString,
},
},
},
}));
})
);

expect(tc.get('field1')).equal(GraphQLString);
});

it('should have chainable methods', () => {
const itc = InputTypeComposer.create('InputType');
expect(itc.setFields({})).equal(itc);
expect(itc.setField('f1', 'String')).equal(itc);
expect(itc.addFields({})).equal(itc);
expect(itc.removeField('f1')).equal(itc);
expect(itc.extendField('f1', {})).equal(itc);
expect(itc.makeRequired('f1')).equal(itc);
expect(itc.makeOptional('f1')).equal(itc);
expect(itc.setTypeName('InputType2')).equal(itc);
expect(itc.setDescription('Test')).equal(itc);
});
});
79 changes: 45 additions & 34 deletions src/__tests__/resolver-test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* eslint-disable no-new */
/* eslint-disable no-new, no-unused-vars */

import { expect } from 'chai';
import {
Expand All @@ -16,20 +16,19 @@ import Resolver from '../resolver';
import TypeComposer from '../typeComposer';
import InputTypeComposer from '../inputTypeComposer';


describe('Resolver', () => {
let resolver;

beforeEach(() => {
resolver = new Resolver({ name: 'find' });
});


it('should throw error if not passed name in opts', () => {
expect(() => { new Resolver({}); }).to.throw();
expect(() => {
new Resolver({});
}).to.throw();
});


it('should have getDescription/setDescription methods', () => {
resolver.setDescription('Find users');
expect(resolver.getDescription()).equal('Find users');
Expand All @@ -50,10 +49,12 @@ describe('Resolver', () => {
expect(resolver.getType()).equal(GraphQLString);

expect(() => {
resolver.setType(new GraphQLInputObjectType({
name: 'MyInput',
fields: () => ({}),
}));
resolver.setType(
new GraphQLInputObjectType({
name: 'MyInput',
fields: () => ({}),
})
);
}).to.throw('provide correct OutputType');
});

Expand All @@ -66,7 +67,6 @@ describe('Resolver', () => {
expect(myResolver.type.ofType).equal(GraphQLString);
});


it('should convert type definition to GraphQLType', () => {
const myResolver = new Resolver({
name: 'myResolver',
Expand Down Expand Up @@ -119,7 +119,8 @@ describe('Resolver', () => {
});

it('should have wrapType() method', () => {
const newResolver = resolver.wrapType((prevType) => { // eslint-disable-line
const newResolver = resolver.wrapType((prevType) => {
// eslint-disable-line
return 'String';
});

Expand Down Expand Up @@ -184,7 +185,7 @@ describe('Resolver', () => {
});

it('should have wrapArgs() method', () => {
const newResolver = resolver.wrapArgs((prevArgs) => {
const newResolver = resolver.wrapArgs(prevArgs => {
return { ...prevArgs, arg1: 'String' };
});

Expand Down Expand Up @@ -263,10 +264,8 @@ describe('Resolver', () => {

it('should clone arg type', () => {
resolver.cloneArg('filter', 'NewFilterInput');
expect(resolver.getArgType('filter').name)
.to.equal('NewFilterInput');
expect(resolver.getArg('filter').description)
.to.equal('Data filtering arg');
expect(resolver.getArgType('filter').name).to.equal('NewFilterInput');
expect(resolver.getArg('filter').description).to.equal('Data filtering arg');
});
});
});
Expand Down Expand Up @@ -323,9 +322,7 @@ describe('Resolver', () => {

const schema = GQC.buildSchema();
const result = await graphql(schema, '{ resolveUser { name } }');
expect(
result
).to.deep.equal({
expect(result).to.deep.equal({
data: {
resolveUser: {
name: 'Nodkz',
Expand All @@ -334,7 +331,6 @@ describe('Resolver', () => {
});
});


describe('addFilterArg', () => {
it('should add arg to filter and setup default value', () => {
const newResolver = resolver.addFilterArg({
Expand All @@ -361,7 +357,7 @@ describe('Resolver', () => {
it('should prepare resolveParams.rawQuery when `resolve` called', () => {
let rpSnap;
const resolve = resolver.resolve;
resolver.resolve = (rp) => {
resolver.resolve = rp => {
rpSnap = rp;
return resolve(rp);
};
Expand Down Expand Up @@ -402,8 +398,7 @@ describe('Resolver', () => {
filterTypeNameFallback: 'FilterUniqueNameInput',
});

expect(newResolver.getArg('filter').defaultValue)
.deep.equal({ name: 'User', age: 33 });
expect(newResolver.getArg('filter').defaultValue).deep.equal({ name: 'User', age: 33 });
});

it('should throw errors if provided incorrect options', () => {
Expand All @@ -428,24 +423,27 @@ describe('Resolver', () => {

it('should return nested name for Resolver', () => {
const r1 = new Resolver({ name: 'find' });
const r2 = r1.wrapResolve(next => (resolveParams) => { // eslint-disable-line
return 'function code';
});
const r2 = r1.wrapResolve(next =>
resolveParams => {
// eslint-disable-line
return 'function code';
});

expect(r1.getNestedName()).equal('find');
expect(r2.getNestedName()).equal('wrapResolve(find)');
});

it('should on toString() call provide debug info with source code', () => {
const r1 = new Resolver({ name: 'find' });
const r2 = r1.wrapResolve(next => (resolveParams) => { // eslint-disable-line
return 'function code';
});
const r2 = r1.wrapResolve(next =>
resolveParams => {
// eslint-disable-line
return 'function code';
});

expect(r2.toString()).to.have.string('function code');
});


it('should return type by path', () => {
const rsv = new Resolver({
name: 'find',
Expand All @@ -459,7 +457,6 @@ describe('Resolver', () => {
expect(rsv.get('@distance')).equal(GraphQLInt);
});


describe('addSortArg', () => {
it('should extend SortEnum by new value', () => {
resolver.setArg('sort', {
Expand All @@ -485,21 +482,21 @@ describe('Resolver', () => {
it('should prepare sort value when `resolve` called', () => {
let rpSnap;
const resolve = resolver.resolve;
resolver.resolve = (rp) => {
resolver.resolve = rp => {
rpSnap = rp;
return resolve(rp);
};
let whereSnap;
const query = {
where: (condition) => {
where: condition => {
whereSnap = condition;
},
};

const newResolver = resolver.addSortArg({
name: 'PRICE_ASC',
description: 'Asc sort by non-null price',
value: (resolveParams) => {
value: resolveParams => {
resolveParams.query.where({ price: { $gt: 0 } }); // eslint-disable-line no-param-reassign
return { price: 1 };
},
Expand Down Expand Up @@ -538,4 +535,18 @@ describe('Resolver', () => {
}).to.throw('should have `sort` arg with type GraphQLEnumType');
});
});

it('should have chainable methods', () => {
expect(resolver.setArgs({})).equal(resolver);
expect(resolver.setArg('a1', 'String')).equal(resolver);
expect(resolver.addArgs({ a2: 'input LL { f1: Int, f2: Int }' })).equal(resolver);
expect(resolver.removeArg('a1')).equal(resolver);
expect(resolver.cloneArg('a2', 'a3')).equal(resolver);
expect(resolver.makeRequired('a2')).equal(resolver);
expect(resolver.makeOptional('a2')).equal(resolver);
expect(resolver.setResolve(() => {})).equal(resolver);
expect(resolver.setType('String')).equal(resolver);
expect(resolver.setKind('query')).equal(resolver);
expect(resolver.setDescription('Find method')).equal(resolver);
});
});

0 comments on commit 6f775e7

Please sign in to comment.