2016-06-10 17:05:39 -07:00
|
|
|
import {
|
2016-06-13 15:27:08 -07:00
|
|
|
expect,
|
2016-06-10 17:05:39 -07:00
|
|
|
} from 'chai';
|
|
|
|
|
|
|
|
import {
|
|
|
|
GraphQLSchema,
|
|
|
|
GraphQLObjectType,
|
2016-06-10 20:48:21 -04:00
|
|
|
GraphQLString,
|
2016-06-13 16:20:21 -07:00
|
|
|
GraphQLInt,
|
|
|
|
GraphQLNonNull,
|
|
|
|
parse,
|
2016-06-10 17:05:39 -07:00
|
|
|
} from 'graphql';
|
|
|
|
|
|
|
|
import { runQuery } from './runQuery';
|
|
|
|
|
|
|
|
const QueryType = new GraphQLObjectType({
|
|
|
|
name: 'QueryType',
|
|
|
|
fields: {
|
|
|
|
testString: {
|
|
|
|
type: GraphQLString,
|
2016-06-10 20:48:21 -04:00
|
|
|
resolve() {
|
2016-06-10 17:05:39 -07:00
|
|
|
return 'it works';
|
|
|
|
},
|
|
|
|
},
|
2016-06-13 16:20:21 -07:00
|
|
|
testRootValue: {
|
|
|
|
type: GraphQLString,
|
|
|
|
resolve(root) {
|
|
|
|
return root + ' works';
|
|
|
|
},
|
|
|
|
},
|
|
|
|
testContextValue: {
|
|
|
|
type: GraphQLString,
|
|
|
|
resolve(root, args, context) {
|
|
|
|
return context + ' works';
|
|
|
|
},
|
|
|
|
},
|
|
|
|
testArgumentValue: {
|
|
|
|
type: GraphQLInt,
|
|
|
|
resolve(root, args, context) {
|
|
|
|
return args['base'] + 5;
|
|
|
|
},
|
|
|
|
args: {
|
|
|
|
base: { type: new GraphQLNonNull(GraphQLInt) },
|
|
|
|
},
|
|
|
|
},
|
2016-06-10 17:05:39 -07:00
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const Schema = new GraphQLSchema({
|
|
|
|
query: QueryType,
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('runQuery', () => {
|
2016-06-13 16:20:21 -07:00
|
|
|
it('returns the right result when query is a string', () => {
|
2016-06-10 17:05:39 -07:00
|
|
|
const query = `{ testString }`;
|
2016-06-13 15:27:08 -07:00
|
|
|
const expected = { testString: 'it works' };
|
2016-06-13 16:20:21 -07:00
|
|
|
return runQuery({ schema: Schema, query: query })
|
|
|
|
.then((res) => {
|
|
|
|
return expect(res.data).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('returns the right result when query is a document', () => {
|
|
|
|
const query = parse(`{ testString }`);
|
|
|
|
const expected = { testString: 'it works' };
|
|
|
|
return runQuery({ schema: Schema, query: query })
|
|
|
|
.then((res) => {
|
|
|
|
return expect(res.data).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2016-06-13 17:16:42 -07:00
|
|
|
it('returns a syntax error if the query string contains one', () => {
|
|
|
|
const query = `query { test`;
|
|
|
|
const expected = 'Syntax Error GraphQL (1:13) Expected Name, found EOF\n\n1: query { test\n ^\n';
|
|
|
|
return runQuery({
|
|
|
|
schema: Schema,
|
|
|
|
query: query,
|
|
|
|
variables: { base: 1 },
|
|
|
|
}).then((res) => {
|
|
|
|
expect(res.data).to.be.undefined;
|
|
|
|
expect(res.errors.length).to.equal(1);
|
|
|
|
return expect(res.errors[0].message).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2016-06-13 16:20:21 -07:00
|
|
|
it('returns a validation error if the query string does not pass validation', () => {
|
|
|
|
const query = `query TestVar($base: String){ testArgumentValue(base: $base) }`;
|
|
|
|
const expected = 'Variable "$base" of type "String" used in position expecting type "Int!".';
|
|
|
|
return runQuery({
|
|
|
|
schema: Schema,
|
|
|
|
query: query,
|
|
|
|
variables: { base: 1 },
|
|
|
|
}).then((res) => {
|
|
|
|
expect(res.data).to.be.undefined;
|
|
|
|
expect(res.errors.length).to.equal(1);
|
|
|
|
return expect(res.errors[0].message).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('does not run validation if the query is a document', () => {
|
|
|
|
// this would not pass validation, because $base ought to be Int!, not String
|
|
|
|
// what effecively happens is string concatentation, but it's returned as Int
|
|
|
|
const query = parse(`query TestVar($base: String){ testArgumentValue(base: $base) }`);
|
|
|
|
const expected = { testArgumentValue: 15 };
|
|
|
|
return runQuery({
|
|
|
|
schema: Schema,
|
|
|
|
query: query,
|
|
|
|
variables: { base: 1 },
|
|
|
|
}).then((res) => {
|
|
|
|
return expect(res.data).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('correctly passes in the rootValue', () => {
|
|
|
|
const query = `{ testRootValue }`;
|
|
|
|
const expected = { testRootValue: 'it also works' };
|
|
|
|
return runQuery({ schema: Schema, query: query, rootValue: 'it also' })
|
|
|
|
.then((res) => {
|
|
|
|
return expect(res.data).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('correctly passes in the context', () => {
|
|
|
|
const query = `{ testContextValue }`;
|
|
|
|
const expected = { testContextValue: 'it still works' };
|
|
|
|
return runQuery({ schema: Schema, query: query, context: 'it still' })
|
|
|
|
.then((res) => {
|
|
|
|
return expect(res.data).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('correctly passes in variables (and arguments)', () => {
|
|
|
|
const query = `query TestVar($base: Int!){ testArgumentValue(base: $base) }`;
|
|
|
|
const expected = { testArgumentValue: 6 };
|
|
|
|
return runQuery({
|
|
|
|
schema: Schema,
|
|
|
|
query: query,
|
|
|
|
variables: { base: 1 },
|
|
|
|
}).then((res) => {
|
|
|
|
return expect(res.data).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2016-06-27 19:20:06 -04:00
|
|
|
it('throws an error if there are missing variables', () => {
|
2016-06-26 21:06:37 -04:00
|
|
|
const query = `query TestVar($base: Int!){ testArgumentValue(base: $base) }`;
|
|
|
|
const expected = 'Variable "$base" of required type "Int!" was not provided.';
|
|
|
|
return runQuery({
|
|
|
|
schema: Schema,
|
|
|
|
query: query,
|
|
|
|
}).then((res) => {
|
|
|
|
return expect(res.errors[0].message).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
2016-06-13 16:20:21 -07:00
|
|
|
it('runs the correct operation when operationName is specified', () => {
|
2016-06-26 21:06:37 -04:00
|
|
|
const query = `
|
2016-06-13 16:20:21 -07:00
|
|
|
query Q1 {
|
|
|
|
testString
|
|
|
|
}
|
|
|
|
query Q2 {
|
|
|
|
testRootValue
|
|
|
|
}`;
|
2016-06-26 21:06:37 -04:00
|
|
|
const expected = {
|
|
|
|
testString: 'it works',
|
2016-06-13 16:20:21 -07:00
|
|
|
};
|
2016-06-26 21:06:37 -04:00
|
|
|
return runQuery({ schema: Schema, query: query, operationName: 'Q1' })
|
|
|
|
.then((res) => {
|
|
|
|
return expect(res.data).to.deep.equal(expected);
|
|
|
|
});
|
|
|
|
});
|
2016-08-05 11:14:56 -07:00
|
|
|
|
|
|
|
it('calls logFunction', () => {
|
|
|
|
const query = `
|
|
|
|
query Q1 {
|
|
|
|
testString
|
|
|
|
}`;
|
|
|
|
const logs = [];
|
|
|
|
const logFn = (...args) => {
|
|
|
|
logs.push(args);
|
|
|
|
};
|
|
|
|
const expected = {
|
|
|
|
testString: 'it works',
|
|
|
|
};
|
|
|
|
return runQuery({
|
|
|
|
schema: Schema,
|
|
|
|
query: query,
|
|
|
|
operationName: 'Q1',
|
|
|
|
variables: { test: 123 },
|
|
|
|
logFunction: logFn,
|
|
|
|
})
|
|
|
|
.then((res) => {
|
|
|
|
expect(res.data).to.deep.equal(expected);
|
|
|
|
expect(logs.length).to.equals(11);
|
|
|
|
expect(logs[0][0]).to.equals('request.start');
|
|
|
|
expect(logs[1][0]).to.equals('request.query');
|
|
|
|
expect(logs[1][1]).to.deep.equals(query);
|
|
|
|
expect(logs[2][0]).to.equals('request.variables');
|
|
|
|
expect(logs[2][1]).to.deep.equals({ test: 123 });
|
|
|
|
expect(logs[3][0]).to.equals('request.operationName');
|
|
|
|
expect(logs[3][1]).to.equals('Q1');
|
|
|
|
expect(logs[10][0]).to.equals('request.end');
|
|
|
|
});
|
|
|
|
});
|
2016-06-10 20:48:21 -04:00
|
|
|
});
|