Ejemplo n.º 1
0
	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();
			});

		});
	});
Ejemplo n.º 2
0
	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();
			});

		});
	});
Ejemplo n.º 3
0
	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();
			});
		});
	});
Ejemplo n.º 4
0
	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 });
			});
	});
Ejemplo n.º 5
0
	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();
			}
		});
	});
Ejemplo n.º 6
0
	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);
	});
Ejemplo n.º 7
0
	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});
			});
	});
Ejemplo n.º 8
0
	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);
			});

	});
Ejemplo n.º 9
0
	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();
		});
	});