subscriptions-transport-ws
Version:
A websocket transport for GraphQL subscriptions
274 lines • 10.4 kB
JavaScript
;
var chai_1 = require('chai');
var graphql_1 = require('graphql');
var graphql_subscriptions_1 = require('graphql-subscriptions');
var messageTypes_1 = require('../messageTypes');
var http_1 = require('http');
var server_1 = require('../server');
var client_1 = require('../client');
var data = {
'1': {
'id': '1',
'name': 'Dan',
},
'2': {
'id': '2',
'name': 'Marie',
},
'3': {
'id': '3',
'name': 'Jessie',
},
};
var userType = new graphql_1.GraphQLObjectType({
name: 'User',
fields: {
id: { type: graphql_1.GraphQLString },
name: { type: graphql_1.GraphQLString },
},
});
var schema = new graphql_1.GraphQLSchema({
query: new graphql_1.GraphQLObjectType({
name: 'Query',
fields: {
testString: { type: graphql_1.GraphQLString },
},
}),
subscription: new graphql_1.GraphQLObjectType({
name: 'Subscription',
fields: {
user: {
type: userType,
args: {
id: { type: graphql_1.GraphQLString },
},
resolve: function (_, _a) {
var id = _a.id;
return data[id];
},
},
userFiltered: {
type: userType,
args: {
id: { type: graphql_1.GraphQLString },
},
resolve: function (_, _a) {
var id = _a.id;
return data[id];
},
},
error: { type: graphql_1.GraphQLString, resolve: function () { throw new Error('E1'); } },
},
}),
});
var subscriptionManager = new graphql_subscriptions_1.SubscriptionManager({
schema: schema,
setupFunctions: {
'userFiltered': function (options, args) { return ({
'userFiltered': function (user) {
return !args.id || user.id === args.id;
},
}); },
},
});
var options = {
subscriptionManager: subscriptionManager,
onSubscribe: function (msg, params) { return params; },
};
var httpServer = http_1.createServer(function (request, response) {
response.writeHead(404);
response.end();
});
httpServer.listen(8080, function () {
});
new server_1.default(options, httpServer);
describe('Client', function () {
it('removes subscription when it unsubscribes from it', function () {
var client = new client_1.default('ws://localhost:8080/');
setTimeout(function () {
var subId = client.subscribe({
query: "subscription useInfo($id: String) {\n user(id: $id) {\n id\n name\n }\n }",
operationName: 'useInfo',
variables: {
id: 3,
},
}, function (error, result) {
});
client.unsubscribe(subId);
chai_1.assert.notProperty(client.subscriptionHandlers, "" + subId);
}, 100);
});
it('should call error handler when graphql result has errors', function (done) {
var client = new client_1.default('ws://localhost:8080/');
setTimeout(function () {
client.subscribe({
query: "subscription useInfo{\n error\n }",
operationName: 'useInfo',
variables: {},
}, function (error, result) {
if (error) {
client.unsubscribeAll();
done();
}
if (result) {
client.unsubscribeAll();
chai_1.assert(false);
}
});
}, 100);
setTimeout(function () {
subscriptionManager.publish('error', {});
}, 200);
});
});
describe('Server', function () {
it('should send correct results to multiple clients with subscriptions', function (done) {
var client = new client_1.default('ws://localhost:8080/');
var client1 = new client_1.default('ws://localhost:8080');
var numResults = 0;
setTimeout(function () {
client.subscribe({
query: "subscription useInfo($id: String) {\n user(id: $id) {\n id\n name\n }\n }",
operationName: 'useInfo',
variables: {
id: 3,
},
}, function (error, result) {
if (error) {
chai_1.assert(false);
}
if (result) {
chai_1.assert.property(result, 'user');
chai_1.assert.equal(result.user.id, '3');
chai_1.assert.equal(result.user.name, 'Jessie');
numResults++;
}
else {
}
});
}, 100);
var client11 = new client_1.default('ws://localhost:8080/');
var numResults1 = 0;
setTimeout(function () {
client11.subscribe({
query: "subscription useInfo($id: String) {\n user(id: $id) {\n id\n name\n }\n }",
operationName: 'useInfo',
variables: {
id: 2,
},
}, function (error, result) {
if (error) {
chai_1.assert(false);
}
if (result) {
chai_1.assert.property(result, 'user');
chai_1.assert.equal(result.user.id, '2');
chai_1.assert.equal(result.user.name, 'Marie');
numResults1++;
}
});
}, 100);
setTimeout(function () {
subscriptionManager.publish('user', {});
}, 200);
setTimeout(function () {
client.unsubscribeAll();
chai_1.expect(numResults).to.equals(1);
client1.unsubscribeAll();
chai_1.expect(numResults1).to.equals(1);
done();
}, 300);
});
it('should send a subscription_fail message to client with invalid query', function (done) {
var client1 = new client_1.default('ws://localhost:8080/');
setTimeout(function () {
client1.client.onmessage = function (message) {
var messageData = JSON.parse(message.data);
chai_1.assert.equal(messageData.type, messageTypes_1.SUBSCRIPTION_FAIL);
chai_1.assert.isAbove(messageData.payload.errors.length, 0, 'Number of errors is greater than 0.');
done();
};
client1.subscribe({
query: "subscription useInfo($id: String) {\n user(id: $id) {\n id\n birthday\n }\n }",
operationName: 'useInfo',
variables: {
id: 3,
},
}, function (error, result) {
});
}, 100);
});
it('should set up the proper filters when subscribing', function (done) {
var numTriggers = 0;
var client3 = new client_1.default('ws://localhost:8080/');
var client4 = new client_1.default('ws://localhost:8080/');
setTimeout(function () {
client3.subscribe({
query: "subscription userInfoFilter1($id: String) {\n userFiltered(id: $id) {\n id\n name\n }\n }",
operationName: 'userInfoFilter1',
variables: {
id: 3,
},
}, function (error, result) {
if (error) {
chai_1.assert(false);
}
if (result) {
numTriggers += 1;
chai_1.assert.property(result, 'userFiltered');
chai_1.assert.equal(result.userFiltered.id, '3');
chai_1.assert.equal(result.userFiltered.name, 'Jessie');
}
});
client4.subscribe({
query: "subscription userInfoFilter1($id: String) {\n userFiltered(id: $id) {\n id\n name\n }\n }",
operationName: 'userInfoFilter1',
variables: {
id: 1,
},
}, function (error, result) {
if (result) {
numTriggers += 1;
chai_1.assert.property(result, 'userFiltered');
chai_1.assert.equal(result.userFiltered.id, '1');
chai_1.assert.equal(result.userFiltered.name, 'Dan');
}
if (error) {
chai_1.assert(false);
}
});
}, 100);
setTimeout(function () {
subscriptionManager.publish('userFiltered', { id: 1 });
subscriptionManager.publish('userFiltered', { id: 2 });
subscriptionManager.publish('userFiltered', { id: 3 });
}, 200);
setTimeout(function () {
chai_1.assert.equal(numTriggers, 2);
done();
}, 300);
});
it('does not send more subscription data after client unsubscribes', function () {
var client4 = new client_1.default('ws://localhost:8080/');
setTimeout(function () {
var subId = client4.subscribe({
query: "subscription useInfo($id: String) {\n user(id: $id) {\n id\n name\n }\n }",
operationName: 'useInfo',
variables: {
id: 3,
},
}, function (error, result) {
});
client4.unsubscribe(subId);
}, 100);
setTimeout(function () {
subscriptionManager.publish('user', {});
}, 200);
client4.client.onmessage = function (message) {
if (JSON.parse(message.data).type === messageTypes_1.SUBSCRIPTION_DATA) {
chai_1.assert(false);
}
};
});
});
//# sourceMappingURL=tests.js.map