diff --git a/test/functional/cluster.js b/test/functional/cluster.js index a6045387..57e63c53 100644 --- a/test/functional/cluster.js +++ b/test/functional/cluster.js @@ -753,24 +753,19 @@ describe('cluster', function () { describe('pub/sub', function () { it('should receive messages', function (done) { - var slotTable = [ - [0, 1, ['127.0.0.1', 30001]], - [2, 16383, ['127.0.0.1', 30002]] - ]; - var node1 = new MockServer(30001, function (argv) { - if (argv[0] === 'cluster' && argv[1] === 'slots') { - return slotTable; - } - }); - var node2 = new MockServer(30002, function (argv) { + var handler = function (argv) { if (argv[0] === 'cluster' && argv[1] === 'slots') { - return slotTable; + return [ + [0, 1, ['127.0.0.1', 30001]], + [2, 16383, ['127.0.0.1', 30002]] + ]; } - }); + }; + var node1 = new MockServer(30001, handler); + var node2 = new MockServer(30002, handler); var options = [ { host: '127.0.0.1', port: '30001' } ]; var sub = new Redis.Cluster(options); - var pub = new Redis.Cluster(options); sub.subscribe('test cluster', function () { node1.write(node1.clients[0], ['message', 'test channel', 'hi']); @@ -779,10 +774,65 @@ describe('cluster', function () { expect(channel).to.eql('test channel'); expect(message).to.eql('hi'); sub.disconnect(); - pub.disconnect(); disconnect([node1, node2], done); }); }); + + it('should re-subscribe after reconnection', function (done) { + var server = new MockServer(30001, function (argv) { + if (argv[0] === 'cluster' && argv[1] === 'slots') { + return [ + [0, 16383, ['127.0.0.1', 30001]] + ]; + } else if (argv[0] === 'subscribe' || argv[0] === 'psubscribe') { + return [argv[0], argv[1]]; + } + }); + var client = new Redis.Cluster([{ host: '127.0.0.1', port: '30001' }]); + + client.subscribe('test cluster', function () { + var subscribe = Redis.prototype.subscribe; + stub(Redis.prototype, 'subscribe', function (channels) { + expect(channels).to.eql(['test cluster']); + Redis.prototype.subscribe.restore(); + client.disconnect(); + disconnect([server], done); + return Redis.prototype.subscribe.apply(this, arguments); + }); + client.on('end', function () { + client.connect(); + }); + client.disconnect(); + }); + }); + + it('should re-psubscribe after reconnection', function (done) { + var server = new MockServer(30001, function (argv) { + if (argv[0] === 'cluster' && argv[1] === 'slots') { + return [ + [0, 16383, ['127.0.0.1', 30001]] + ]; + } else if (argv[0] === 'subscribe' || argv[0] === 'psubscribe') { + return [argv[0], argv[1]]; + } + }); + var client = new Redis.Cluster([{ host: '127.0.0.1', port: '30001' }]); + + client.psubscribe('test?', function () { + var psubscribe = Redis.prototype.psubscribe; + stub(Redis.prototype, 'psubscribe', function (channels) { + expect(channels).to.eql(['test?']); + Redis.prototype.psubscribe.restore(); + client.disconnect(); + disconnect([server], done); + return Redis.prototype.psubscribe.apply(this, arguments); + }); + client.on('end', function () { + client.connect(); + }); + client.disconnect(); + }); + }); }); describe('readonly', function() {