mirror of
https://github.com/node-red/node-red.git
synced 2025-03-01 10:36:34 +00:00
Let trigger node support per topic mode (#1398)
* Let trigger node support per topic mode * ensure trigger node clones repeating message * Add some tests for trigger by topic * test trigger repeat for pass by ref error * trigger test - add missing try/catch to all test with callback * boost trigger node test coverage
This commit is contained in:
committed by
Nick O'Leary
parent
b81940351f
commit
cc88ebd2b9
@@ -15,8 +15,10 @@
|
||||
**/
|
||||
|
||||
var should = require("should");
|
||||
var sinon = require("sinon");
|
||||
var helper = require("../../helper.js");
|
||||
var triggerNode = require("../../../../nodes/core/core/89-trigger.js");
|
||||
var RED = require("../../../../red/red.js");
|
||||
|
||||
describe('trigger node', function() {
|
||||
|
||||
@@ -81,14 +83,17 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", '1');
|
||||
c+=1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", '0');
|
||||
done();
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", '1');
|
||||
c+=1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", '0');
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.emit("input", {payload:null});
|
||||
});
|
||||
@@ -161,6 +166,155 @@ describe('trigger node', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle multiple topics as one if not asked to handle', function(done) {
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", bytopic:"all", op1:"1", op2:"0", op1type:"num", op2type:"num", duration:"30", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(triggerNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
c += 1;
|
||||
if (c === 1) {
|
||||
msg.should.have.a.property("payload", 1);
|
||||
msg.should.have.a.property("topic", "A");
|
||||
}
|
||||
else if (c === 2) {
|
||||
msg.should.have.a.property("payload", 0);
|
||||
msg.should.have.a.property("topic", "A");
|
||||
done();
|
||||
}
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
n1.emit("input", {payload:1,topic:"A"});
|
||||
n1.emit("input", {payload:2,topic:"B"});
|
||||
n1.emit("input", {payload:3,topic:"C"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle multiple topics individually if asked to do so', function(done) {
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", bytopic:"topic", op1:"1", op2:"0", op1type:"num", op2type:"num", duration:"30", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(triggerNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
c += 1;
|
||||
if (c === 1) {
|
||||
msg.should.have.a.property("payload", 1);
|
||||
msg.should.have.a.property("topic", "A");
|
||||
}
|
||||
else if (c === 2) {
|
||||
msg.should.have.a.property("payload", 1);
|
||||
msg.should.have.a.property("topic", "B");
|
||||
}
|
||||
else if (c === 3) {
|
||||
msg.should.have.a.property("payload", 1);
|
||||
msg.should.have.a.property("topic", "C");
|
||||
}
|
||||
else if (c === 4) {
|
||||
msg.should.have.a.property("payload", 0);
|
||||
msg.should.have.a.property("topic", "A");
|
||||
}
|
||||
else if (c === 5) {
|
||||
msg.should.have.a.property("payload", 0);
|
||||
msg.should.have.a.property("topic", "B");
|
||||
}
|
||||
else if (c === 6) {
|
||||
msg.should.have.a.property("payload", 0);
|
||||
msg.should.have.a.property("topic", "C");
|
||||
done();
|
||||
}
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
n1.emit("input", {payload:1,topic:"A"});
|
||||
n1.emit("input", {payload:2,topic:"B"});
|
||||
n1.emit("input", {payload:3,topic:"C"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle multiple topics individually, and extend one, if asked to do so', function(done) {
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", bytopic:"topic", extend:"true", op1:"1", op2:"0", op1type:"num", op2type:"num", duration:"30", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(triggerNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
c += 1;
|
||||
if (c === 1) {
|
||||
msg.should.have.a.property("payload", 1);
|
||||
msg.should.have.a.property("topic", "A");
|
||||
}
|
||||
else if (c === 2) {
|
||||
msg.should.have.a.property("payload", 1);
|
||||
msg.should.have.a.property("topic", "B");
|
||||
}
|
||||
else if (c === 3) {
|
||||
msg.should.have.a.property("payload", 1);
|
||||
msg.should.have.a.property("topic", "C");
|
||||
}
|
||||
else if (c === 4) {
|
||||
msg.should.have.a.property("payload", 0);
|
||||
msg.should.have.a.property("topic", "A");
|
||||
}
|
||||
else if (c === 5) {
|
||||
msg.should.have.a.property("payload", 0);
|
||||
msg.should.have.a.property("topic", "C");
|
||||
}
|
||||
else if (c === 6) {
|
||||
msg.should.have.a.property("payload", 0);
|
||||
msg.should.have.a.property("topic", "B");
|
||||
done();
|
||||
}
|
||||
} catch(err) {
|
||||
done(err);
|
||||
}
|
||||
});
|
||||
n1.emit("input", {payload:1,topic:"A"});
|
||||
n1.emit("input", {payload:2,topic:"B"});
|
||||
n1.emit("input", {payload:3,topic:"C"});
|
||||
setTimeout( function() { n1.emit("input", {payload:2,topic:"B"})}, 25 );
|
||||
});
|
||||
});
|
||||
|
||||
it('should be able to return things from flow and global context variables', function(done) {
|
||||
var spy = sinon.stub(RED.util, 'evaluateNodeProperty',
|
||||
function(arg1, arg2, arg3, arg4) { return arg1; }
|
||||
);
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", op1:"foo", op1type:"flow", op2:"bar", op2type:"global", duration:"20", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(triggerNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "foo");
|
||||
c+=1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "bar");
|
||||
spy.restore();
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { spy.restore(); done(err); }
|
||||
});
|
||||
n1.emit("input", {payload:null});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
it('should be able to not output anything on first trigger', function(done) {
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", op1type:"nul", op1:"true",op2:"false",op2type:"val",duration:"30", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
@@ -187,8 +341,11 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
msg.should.have.a.property("payload", true);
|
||||
c += 1;
|
||||
try {
|
||||
msg.should.have.a.property("payload", true);
|
||||
c += 1;
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
setTimeout( function() {
|
||||
c.should.equal(1); // should only have had one output.
|
||||
@@ -199,23 +356,30 @@ describe('trigger node', function() {
|
||||
});
|
||||
|
||||
it('should be able to extend the delay', function(done) {
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", extend:"true", op1type:"pay", op1:"false", op2:"true", duration:"100", wires:[["n2"]] },
|
||||
var spy = sinon.stub(RED.util, 'evaluateNodeProperty',
|
||||
function(arg1, arg2, arg3, arg4) { return arg1; }
|
||||
);
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", extend:"true", op1type:"flow", op1:"foo", op2:"bar", op2type:"global", duration:"100", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(triggerNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Hello");
|
||||
c += 1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "true");
|
||||
//console.log(Date.now() - ss);
|
||||
(Date.now() - ss).should.be.greaterThan(149);
|
||||
done();
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "foo");
|
||||
c += 1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "bar");
|
||||
//console.log(Date.now() - ss);
|
||||
(Date.now() - ss).should.be.greaterThan(149);
|
||||
spy.restore();
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { spy.restore(); done(err); }
|
||||
});
|
||||
var ss = Date.now();
|
||||
n1.emit("input", {payload:"Hello"});
|
||||
@@ -233,16 +397,19 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Hello");
|
||||
c += 1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
//console.log(Date.now() - ss);
|
||||
(Date.now() - ss).should.be.greaterThan(70);
|
||||
done();
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Hello");
|
||||
c += 1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
//console.log(Date.now() - ss);
|
||||
(Date.now() - ss).should.be.greaterThan(70);
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
var ss = Date.now();
|
||||
n1.emit("input", {payload:"Hello"});
|
||||
@@ -263,15 +430,18 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Goodbye");
|
||||
c += 1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
(Date.now() - ss).should.be.greaterThan(70);
|
||||
done();
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Goodbye");
|
||||
c += 1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
(Date.now() - ss).should.be.greaterThan(70);
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
var ss = Date.now();
|
||||
n1.emit("input", {payload:"Hello"});
|
||||
@@ -292,15 +462,18 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Goodbye");
|
||||
c += 1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
(Date.now() - ss).should.be.greaterThan(70);
|
||||
done();
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Goodbye");
|
||||
c += 1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
(Date.now() - ss).should.be.greaterThan(70);
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
var ss = Date.now();
|
||||
n1.emit("input", {payload:"Hello"});
|
||||
@@ -321,14 +494,17 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Hello");
|
||||
c+=1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
done();
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", "Hello");
|
||||
c+=1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.emit("input", {payload:"Hello",topic:"World"});
|
||||
});
|
||||
@@ -342,19 +518,46 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", null);
|
||||
c+=1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
done();
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", null);
|
||||
c+=1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", "World");
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.emit("input", {payload:"World"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should handle string null as null on op2', function(done) {
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", op1type:"val", op2type:"val", op1:"null", op2:"null", duration:"40", wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(triggerNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
try {
|
||||
if (c === 0) {
|
||||
msg.should.have.a.property("payload", null);
|
||||
c+=1;
|
||||
}
|
||||
else {
|
||||
msg.should.have.a.property("payload", null);
|
||||
done();
|
||||
}
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.emit("input", {payload:"null"});
|
||||
});
|
||||
});
|
||||
|
||||
it('should be able to set infinite timeout, and clear timeout', function(done) {
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", duration:"0", extend: false, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
@@ -363,8 +566,11 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
c += 1;
|
||||
msg.should.have.a.property("payload", 1);
|
||||
try {
|
||||
c += 1;
|
||||
msg.should.have.a.property("payload", "1");
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
setTimeout( function() {
|
||||
if (c === 2) { done(); }
|
||||
@@ -388,8 +594,11 @@ describe('trigger node', function() {
|
||||
var n2 = helper.getNode("n2");
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
c += 1;
|
||||
msg.should.have.a.property("payload", 1);
|
||||
try {
|
||||
c += 1;
|
||||
msg.should.have.a.property("payload", "1");
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
setTimeout( function() {
|
||||
if (c === 2) { done(); }
|
||||
@@ -406,7 +615,7 @@ describe('trigger node', function() {
|
||||
});
|
||||
|
||||
it('should be able to set a repeat, and clear loop by reset', function(done) {
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", reset:"boo", duration:-25, wires:[["n2"]] },
|
||||
var flow = [{"id":"n1", "type":"trigger", "name":"triggerNode", reset:"boo", op1:"", op1type:"pay", duration:-25, wires:[["n2"]] },
|
||||
{id:"n2", type:"helper"} ];
|
||||
helper.load(triggerNode, flow, function() {
|
||||
var n1 = helper.getNode("n1");
|
||||
@@ -414,9 +623,14 @@ describe('trigger node', function() {
|
||||
var c = 0;
|
||||
n2.on("input", function(msg) {
|
||||
c += 1;
|
||||
msg.should.have.a.property("payload", "foo");
|
||||
try {
|
||||
msg.should.have.property('payload','foo');
|
||||
msg.payload = "bar"; // try to provoke pass by reference error
|
||||
}
|
||||
catch(err) { done(err); }
|
||||
});
|
||||
n1.emit("input", {payload:"foo"}); // trigger
|
||||
n1.emit("input", {payload:"foo"}); // trigger
|
||||
setTimeout( function() {
|
||||
n1.emit("input", {reset:true}); // reset
|
||||
},90);
|
||||
|
Reference in New Issue
Block a user