it('should include the _exchange property', function(done){ this.timeout(5000); var exchangeName = ezuuid(); var message = ezuuid(); var exchange1 = new Exchange({name: exchangeName, autoDelete: true}); exchange1.on('ready', function(){ var queue = new Queue({ autoDelete: true, exclusive: true, exchangeName: exchangeName, ready: function(){ exchange1.publish({key:message}); }, }); queue(function(msg, ack){ if (msg.key !== message) return done('got a message I shouldnt have'); if (msg._exchange !== exchangeName) return done('bad _exchangeName'); ack(); done(); }); }); });
it('should be able to bind to a single exchange', function(done){ this.timeout(5000); var exchangeName = ezuuid(); var message = ezuuid(); var exchange1 = new Exchange({name: exchangeName, autoDelete: true}); exchange1.on('ready', function(){ var queue = new Queue({ autoDelete: true, exclusive: true, exchangeName: exchangeName, ready: function(){ exchange1.publish({key:message}); }, }); queue(function(msg, ack){ if (msg.key !== message) return done('got a message I shouldnt have'); ack(); done(); }); }); });
it('should be able to push errors to xxx_error queue', function(done){ this.timeout(8000); function _readError(){ var errorQueue = new Queue({ name: queueName + '_error', }); errorQueue(function(msg, ack){ expect(msg._error).to.be.okay; expect(msg._error.message).to.be.equal(errorKey); ack(); errorQueue.destroy(); done(); }); } var exchangeName = ezuuid(); var queueName = ezuuid(); var message = ezuuid(); var errorKey = ezuuid(); var exchange1 = new Exchange({name: exchangeName, autoDelete: true}); exchange1.on('ready', function(){ var queue = new Queue({ name: queueName, autoDelete: true, exclusive: true, useErrorQueue: true, exchangeName: exchangeName, ready: function(){ console.log('pooblishing'); exchange1.publish({ key: message }); }, }); queue(function(msg, ack){ if (msg.key !== message) return done('got a message I shouldnt have'); if (msg._exchange !== exchangeName) return done('bad _exchangeName'); ack(new Error(errorKey)); queue.destroy(); _readError(); }); }); });
it('should be able to bind with different routing keys', function(done){ this.timeout(5000); var exchangeName1 = ezuuid(), exchangeName2 = ezuuid(), message1 = ezuuid(), message2 = ezuuid(); var key1 = 'some_cool_key'; var key2 = 'some_lame_key'; var exchange1 = new Exchange({name: exchangeName1, autoDelete: true, durable: false, type: 'direct'}); var exchange2 = new Exchange({name: exchangeName2, autoDelete: true, durable: false, type: 'direct'}); Promise.all([exchange1.ready, exchange2.ready]) .then(function(){ var queue = new Queue({ autoDelete: true, exclusive: true, exchanges: [ { name: exchangeName1, key: key1 }, { name: exchangeName2, key: key2 }, ], }); var gotMessage1 = false, gotMessage2 = false; queue(function(msg, ack){ if (msg.msg === message1) { gotMessage1 = true; } else if (msg.msg === message2) { gotMessage2 = true; } else { done(new Error('got a bad message')); } ack(); if (gotMessage1 && gotMessage2){ done(); } }); _.delay(exchange1.publish, 200, {msg:message1}, {key: 'some_wrong_key' }); _.delay(exchange2.publish, 200, {msg:message2}, {key: 'some_wrong_key' }); _.delay(exchange1.publish, 400, {msg:message1}, {key: key1 }); _.delay(exchange2.publish, 400, {msg:message2}, {key: key2 }); }); });
it('should be able to create an exchange on the fly if give the data', function(done){ var exchangeName1 = ezuuid(), exchangeName2 = ezuuid(), message1 = ezuuid(), message2 = ezuuid(); var key1 = 'some_cool_key'; var key2 = 'some_lame_key'; var queue = new Queue({ autoDelete: true, exclusive: true, bindings: [ { name: exchangeName1, key: key1, type: 'direct', durable: false, autoDelete: true }, { name: exchangeName2, key: key2, type: 'direct', durable: false, autoDelete: true }, ], ready: function(){ // now that the binding should have created the exchanges already var exchange1 = new Exchange({name: exchangeName1, autoDelete: true, durable: false, type: 'direct'}); var exchange2 = new Exchange({name: exchangeName2, autoDelete: true, durable: false, type: 'direct'}); _.delay(exchange1.publish, 200, {msg:message1}, {key: 'some_wrong_key' }); _.delay(exchange2.publish, 200, {msg:message2}, {key: 'some_wrong_key' }); _.delay(exchange1.publish, 400, {msg:message1}, {key: key1 }); _.delay(exchange2.publish, 400, {msg:message2}, {key: key2 }); }, }); var gotMessage1 = false, gotMessage2 = false; queue(function(msg, ack){ if (msg.msg === message1) { gotMessage1 = true; } else if (msg.msg === message2) { gotMessage2 = true; } else { done(new Error('got a bad message')); } ack(); if (gotMessage1 && gotMessage2){ done(); } }); });
it('should be able to make rpc calls', function(done){ this.timeout(4000); var METHOD_NAME = ezuuid(); var listenOnly = response(METHOD_NAME); var listen = response(METHOD_NAME); var key = ezuuid(); listenOnly.disable(); listenOnly(function(err, req, cb){ console.log('no one listens to me!: ' + req.msg); cb(null, { msg:'just listening...'}); }); listen(function(err, req, cb){ cb(null, { isResponse: true, msg:req.msg+ '_' + key}); }); listen.ready .then(function(){ return _.chain(_.range(6)) .map(function(d, i){ return new Promise(function(resolve, reject){ request(METHOD_NAME)({msg: i}, function(err, res){ console.log(err, res); if (err) return reject(err); var expected = i + '_'+key; expect(res.msg).to.be.equal(expected); console.log('i got back: ' + expected); resolve(); }); }); }) .thru(Promise.all) .value() .then(function(){ done(); }); }) .catch(done); });
it('should be able to bind to multiple exchanges', function(done){ this.timeout(5000); var exchangeName1 = ezuuid(), exchangeName2 = ezuuid(), message1 = ezuuid(), message2 = ezuuid(); var exchange1 = new Exchange({name: exchangeName1, autoDelete: true, durable: false}); var exchange2 = new Exchange({name: exchangeName2, autoDelete: true, durable: false}); Promise.all([exchange1.ready, exchange2.ready]) .then(function(){ var queue = new Queue({ autoDelete: true, exclusive: true, exchangeNames: [exchangeName1, exchangeName2] }); var gotMessage1 = false, gotMessage2 = false; queue(function(msg, ack){ if (msg.key === message1) { gotMessage1 = true; } if (msg.key === message2) { gotMessage2 = true; } ack(); if (gotMessage1 && gotMessage2){ done(); } }); _.delay(exchange1.publish, 200, {key:message1}); _.delay(exchange2.publish, 200, {key:message2}); }); });
it('should return errors properly', function(done){ this.timeout(5000); var METHOD_NAME= ezuuid(); var listen = response({methodName: METHOD_NAME, ttl: 3000, shared: true}); listen(function(err, req, cb){ cb(new Error('this is an error')); }); listen.ready .then(function(){ request({ methodName: METHOD_NAME, timeout: 4000})({code: 'a'}, function(err, res){ if (err) { done(); } }); }) .catch(function(err){ done(err); }); });
it('should be able to round robin requests if set as shared', function(done){ this.timeout(40000); var METHOD_NAME= ezuuid(); var listen1 = response({methodName: METHOD_NAME, ttl: 3000, shared: true}); var listen2 = response({methodName: METHOD_NAME, ttl: 3000, shared: true}); var listen3 = response({methodName: METHOD_NAME, ttl: 3000, shared: true}); Promise.all([listen1.ready,listen2.ready,listen3.ready]) .then(function(){ return new Promise(function(resolve){ setTimeout(function(){ resolve(); }, 1000); }); }) .then(function(){ request({appName: 'shared_test_', methodName: METHOD_NAME, timeout: 4000})({code: 'a'}, function(err, res){ if (err) return done(err); }); request({appName: 'shared_test_', methodName: METHOD_NAME, timeout: 4000})({code: 'b'}, function(err, res){ if (err) return done(err); }); request({appName: 'shared_test_', methodName: METHOD_NAME, timeout: 4000})({code: 'c'}, function(err, res){ if (err) return done(err); }); }) .catch(function(err){ done(err); }); var heard1, heard2, heard3, isDone; function allDone(){ if (isDone) return; if (heard1 && heard2 && heard3) { console.log('success'); isDone = true; done(); } } listen1(function(err, req, cb){ console.log('listen1: ' + req.code); if (heard1) return done(new Error('already heard1')); heard1 = true; cb(null, {message: 'hello1'}); allDone(); }); listen2(function(err, req, cb){ console.log('listen2: ' + req.code); if (heard2) return done(new Error('already heard2')); heard2 = true; cb(null, {message: 'hello2'}); allDone(); }); listen3(function(err, req, cb){ console.log('listen3: ' + req.code); if (heard3) return done(new Error('already heard3')); heard3 = true; cb(null, {message: 'hello3'}); allDone(); }); });