mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Add tests for runtime util
This commit is contained in:
parent
e50cd5b745
commit
90e7f30247
@ -286,7 +286,7 @@ function setMessageProperty(msg,prop,value,createMissing) {
|
|||||||
}
|
}
|
||||||
obj = obj[key];
|
obj = obj[key];
|
||||||
} else {
|
} else {
|
||||||
return null
|
return null;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj = obj[key];
|
obj = obj[key];
|
||||||
@ -563,9 +563,6 @@ function encodeObject(msg,opts) {
|
|||||||
} else if (msgType === "number") {
|
} else if (msgType === "number") {
|
||||||
msg.format = "number";
|
msg.format = "number";
|
||||||
msg.msg = msg.msg.toString();
|
msg.msg = msg.msg.toString();
|
||||||
} else if (msg.msg === 0) {
|
|
||||||
msg.format = "number";
|
|
||||||
msg.msg = "0";
|
|
||||||
} else if (msg.msg === null || msgType === "undefined") {
|
} else if (msg.msg === null || msgType === "undefined") {
|
||||||
msg.format = (msg.msg === null)?"null":"undefined";
|
msg.format = (msg.msg === null)?"null":"undefined";
|
||||||
msg.msg = "(undefined)";
|
msg.msg = "(undefined)";
|
||||||
|
@ -191,6 +191,11 @@ describe("red/util", function() {
|
|||||||
util.setMessageProperty(msg,"msg.a.b.c","bar",false);
|
util.setMessageProperty(msg,"msg.a.b.c","bar",false);
|
||||||
should.not.exist(msg.a.b);
|
should.not.exist(msg.a.b);
|
||||||
})
|
})
|
||||||
|
it('does not create missing parent properties with array', function () {
|
||||||
|
var msg = {a:{}};
|
||||||
|
util.setMessageProperty(msg, "msg.a.b[1].c", "bar", false);
|
||||||
|
should.not.exist(msg.a.b);
|
||||||
|
})
|
||||||
it('deletes property if value is undefined', function() {
|
it('deletes property if value is undefined', function() {
|
||||||
var msg = {a:{b:{c:"foo"}}};
|
var msg = {a:{b:{c:"foo"}}};
|
||||||
util.setMessageProperty(msg,"msg.a.b.c",undefined);
|
util.setMessageProperty(msg,"msg.a.b.c",undefined);
|
||||||
@ -227,6 +232,11 @@ describe("red/util", function() {
|
|||||||
msg.a[2].should.be.instanceOf(Array);
|
msg.a[2].should.be.instanceOf(Array);
|
||||||
msg.a[2][2].should.eql("bar");
|
msg.a[2][2].should.eql("bar");
|
||||||
});
|
});
|
||||||
|
it('does not create missing array elements - mid property', function () {
|
||||||
|
var msg = {a:[]};
|
||||||
|
util.setMessageProperty(msg, "msg.a[1][1]", "bar", false);
|
||||||
|
msg.a.should.empty();
|
||||||
|
});
|
||||||
it('does not create missing array elements - final property', function() {
|
it('does not create missing array elements - final property', function() {
|
||||||
var msg = {a:{}};
|
var msg = {a:{}};
|
||||||
util.setMessageProperty(msg,"msg.a.b[2]","bar",false);
|
util.setMessageProperty(msg,"msg.a.b[2]","bar",false);
|
||||||
@ -275,10 +285,23 @@ describe("red/util", function() {
|
|||||||
var result = util.evaluateNodeProperty('','date');
|
var result = util.evaluateNodeProperty('','date');
|
||||||
(Date.now() - result).should.be.approximately(0,50);
|
(Date.now() - result).should.be.approximately(0,50);
|
||||||
});
|
});
|
||||||
|
it('returns bin', function () {
|
||||||
|
var result = util.evaluateNodeProperty('[1, 2]','bin');
|
||||||
|
result[0].should.eql(1);
|
||||||
|
result[1].should.eql(2);
|
||||||
|
});
|
||||||
it('returns msg property',function() {
|
it('returns msg property',function() {
|
||||||
var result = util.evaluateNodeProperty('foo.bar','msg',{},{foo:{bar:"123"}});
|
var result = util.evaluateNodeProperty('foo.bar','msg',{},{foo:{bar:"123"}});
|
||||||
result.should.eql("123");
|
result.should.eql("123");
|
||||||
});
|
});
|
||||||
|
it('throws an error if callback is not defined', function (done) {
|
||||||
|
try {
|
||||||
|
util.evaluateNodeProperty(' ','msg',{},{foo:{bar:"123"}});
|
||||||
|
done("should throw an error");
|
||||||
|
} catch (err) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
it('returns flow property',function() {
|
it('returns flow property',function() {
|
||||||
var result = util.evaluateNodeProperty('foo.bar','flow',{
|
var result = util.evaluateNodeProperty('foo.bar','flow',{
|
||||||
context:function() { return {
|
context:function() { return {
|
||||||
@ -307,6 +330,10 @@ describe("red/util", function() {
|
|||||||
},{});
|
},{});
|
||||||
result.should.eql("123");
|
result.should.eql("123");
|
||||||
});
|
});
|
||||||
|
it('returns jsonata result', function () {
|
||||||
|
var result = util.evaluateNodeProperty('$abs(-1)','jsonata',{},{});
|
||||||
|
result.should.eql(1);
|
||||||
|
});
|
||||||
it('returns null', function() {
|
it('returns null', function() {
|
||||||
var result = util.evaluateNodeProperty(null,'null');
|
var result = util.evaluateNodeProperty(null,'null');
|
||||||
(result === null).should.be.true();
|
(result === null).should.be.true();
|
||||||
@ -448,6 +475,12 @@ describe("red/util", function() {
|
|||||||
var result = util.evaluateJSONataExpression(expr,{payload:"hello"});
|
var result = util.evaluateJSONataExpression(expr,{payload:"hello"});
|
||||||
result.should.eql("bar");
|
result.should.eql("bar");
|
||||||
});
|
});
|
||||||
|
it('accesses environment variable from an expression', function() {
|
||||||
|
process.env.UTIL_ENV = 'foo';
|
||||||
|
var expr = util.prepareJSONataExpression('$env("UTIL_ENV")',{});
|
||||||
|
var result = util.evaluateJSONataExpression(expr,{});
|
||||||
|
result.should.eql('foo');
|
||||||
|
});
|
||||||
it('handles non-existant flow context variable', function() {
|
it('handles non-existant flow context variable', function() {
|
||||||
var expr = util.prepareJSONataExpression('$flowContext("nonExistant")',{context:function() { return {flow:{get: function(key) { return {'foo':'bar'}[key]}}}}});
|
var expr = util.prepareJSONataExpression('$flowContext("nonExistant")',{context:function() { return {flow:{get: function(key) { return {'foo':'bar'}[key]}}}}});
|
||||||
var result = util.evaluateJSONataExpression(expr,{payload:"hello"});
|
var result = util.evaluateJSONataExpression(expr,{payload:"hello"});
|
||||||
@ -510,7 +543,215 @@ describe("red/util", function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
it('callbacks with error when invalid expression was specified', function (done) {
|
||||||
|
var expr = util.prepareJSONataExpression('$abc(1)',{});
|
||||||
|
var result = util.evaluateJSONataExpression(expr,{payload:"hello"},function(err,value){
|
||||||
|
should.exist(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('encodeObject', function () {
|
||||||
|
it('encodes Error with message', function() {
|
||||||
|
var err = new Error("encode error");
|
||||||
|
err.name = 'encodeError';
|
||||||
|
var msg = {msg:err};
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("error");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.name.should.eql('encodeError');
|
||||||
|
resultJson.message.should.eql('encode error');
|
||||||
|
});
|
||||||
|
it('encodes Error without message', function() {
|
||||||
|
var err = new Error();
|
||||||
|
err.name = 'encodeError';
|
||||||
|
err.toString = function(){return 'error message';}
|
||||||
|
var msg = {msg:err};
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("error");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.name.should.eql('encodeError');
|
||||||
|
resultJson.message.should.eql('error message');
|
||||||
|
});
|
||||||
|
it('encodes Buffer', function() {
|
||||||
|
var msg = {msg:Buffer.from("abc")};
|
||||||
|
var result = util.encodeObject(msg,{maxLength:4});
|
||||||
|
result.format.should.eql("buffer[3]");
|
||||||
|
result.msg[0].should.eql('6');
|
||||||
|
result.msg[1].should.eql('1');
|
||||||
|
result.msg[2].should.eql('6');
|
||||||
|
result.msg[3].should.eql('2');
|
||||||
|
});
|
||||||
|
it('encodes function', function() {
|
||||||
|
var msg = {msg:function(){}};
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("function");
|
||||||
|
result.msg.should.eql('[function]');
|
||||||
|
});
|
||||||
|
it('encodes boolean', function() {
|
||||||
|
var msg = {msg:true};
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("boolean");
|
||||||
|
result.msg.should.eql('true');
|
||||||
|
});
|
||||||
|
it('encodes number', function() {
|
||||||
|
var msg = {msg:123};
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("number");
|
||||||
|
result.msg.should.eql('123');
|
||||||
|
});
|
||||||
|
it('encodes 0', function() {
|
||||||
|
var msg = {msg:0};
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("number");
|
||||||
|
result.msg.should.eql('0');
|
||||||
|
});
|
||||||
|
it('encodes null', function() {
|
||||||
|
var msg = {msg:null};
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("null");
|
||||||
|
result.msg.should.eql('(undefined)');
|
||||||
|
});
|
||||||
|
it('encodes undefined', function() {
|
||||||
|
var msg = {msg:undefined};
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("undefined");
|
||||||
|
result.msg.should.eql('(undefined)');
|
||||||
|
});
|
||||||
|
it('encodes string', function() {
|
||||||
|
var msg = {msg:'1234567890'};
|
||||||
|
var result = util.encodeObject(msg,{maxLength:6});
|
||||||
|
result.format.should.eql("string[10]");
|
||||||
|
result.msg.should.eql('123456...');
|
||||||
|
});
|
||||||
|
describe('encode object', function() {
|
||||||
|
it('object', function() {
|
||||||
|
var msg = { msg:{"foo":"bar"} };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("Object");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.foo.should.eql('bar');
|
||||||
|
});
|
||||||
|
it('object whose name includes error', function() {
|
||||||
|
function MyErrorObj(){
|
||||||
|
this.name = 'my error obj';
|
||||||
|
this.message = 'my error message';
|
||||||
|
};
|
||||||
|
var msg = { msg:new MyErrorObj() };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("MyErrorObj");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.name.should.eql('my error obj');
|
||||||
|
resultJson.message.should.eql('my error message');
|
||||||
|
});
|
||||||
|
it('constructor of IncomingMessage', function() {
|
||||||
|
function IncomingMessage(){};
|
||||||
|
var msg = { msg:new IncomingMessage() };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("Object");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.should.empty();
|
||||||
|
});
|
||||||
|
it('_req key in msg', function() {
|
||||||
|
function Socket(){};
|
||||||
|
var msg = { msg:{"_req":123} };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("Object");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson._req.__enc__.should.eql(true);
|
||||||
|
resultJson._req.type.should.eql('internal');
|
||||||
|
});
|
||||||
|
it('_res key in msg', function() {
|
||||||
|
function Socket(){};
|
||||||
|
var msg = { msg:{"_res":123} };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("Object");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson._res.__enc__.should.eql(true);
|
||||||
|
resultJson._res.type.should.eql('internal');
|
||||||
|
});
|
||||||
|
it('array of error', function() {
|
||||||
|
var msg = { msg:[new Error("encode error")] };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("array[1]");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson[0].should.eql('Error: encode error');
|
||||||
|
});
|
||||||
|
it('long array in msg', function() {
|
||||||
|
var msg = {msg:{array:[1,2,3,4]}};
|
||||||
|
var result = util.encodeObject(msg,{maxLength:2});
|
||||||
|
result.format.should.eql("Object");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.array.__enc__.should.eql(true);
|
||||||
|
resultJson.array.data[0].should.eql(1);
|
||||||
|
resultJson.array.data[1].should.eql(2);
|
||||||
|
resultJson.array.length.should.eql(4);
|
||||||
|
});
|
||||||
|
it('array of string', function() {
|
||||||
|
var msg = { msg:["abcde","12345"] };
|
||||||
|
var result = util.encodeObject(msg,{maxLength:3});
|
||||||
|
result.format.should.eql("array[2]");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson[0].should.eql('abc...');
|
||||||
|
resultJson[1].should.eql('123...');
|
||||||
|
});
|
||||||
|
it('array of function', function() {
|
||||||
|
var msg = { msg:[function(){}] };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("array[1]");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson[0].__enc__.should.eql(true);
|
||||||
|
resultJson[0].type.should.eql('function');
|
||||||
|
});
|
||||||
|
it('array of number', function() {
|
||||||
|
var msg = { msg:[1,2,3] };
|
||||||
|
var result = util.encodeObject(msg,{maxLength:2});
|
||||||
|
result.format.should.eql("array[3]");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.__enc__.should.eql(true);
|
||||||
|
resultJson.data[0].should.eql(1);
|
||||||
|
resultJson.data[1].should.eql(2);
|
||||||
|
resultJson.data.length.should.eql(2);
|
||||||
|
resultJson.length.should.eql(3);
|
||||||
|
});
|
||||||
|
it('array of special number', function() {
|
||||||
|
var msg = { msg:[NaN,Infinity,-Infinity] };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("array[3]");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson[0].__enc__.should.eql(true);
|
||||||
|
resultJson[0].type.should.eql('number');
|
||||||
|
resultJson[0].data.should.eql('NaN');
|
||||||
|
resultJson[1].data.should.eql('Infinity');
|
||||||
|
resultJson[2].data.should.eql('-Infinity');
|
||||||
|
});
|
||||||
|
it('constructor of Buffer in msg', function() {
|
||||||
|
var msg = { msg:{buffer:new Buffer([1,2,3,4])} };
|
||||||
|
var result = util.encodeObject(msg,{maxLength:2});
|
||||||
|
result.format.should.eql("Object");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.buffer.__enc__.should.eql(true);
|
||||||
|
resultJson.buffer.length.should.eql(4);
|
||||||
|
resultJson.buffer.data[0].should.eql(1);
|
||||||
|
resultJson.buffer.data[1].should.eql(2);
|
||||||
|
});
|
||||||
|
it('constructor of ServerResponse', function() {
|
||||||
|
function ServerResponse(){};
|
||||||
|
var msg = { msg: new ServerResponse() };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("Object");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.should.eql('[internal]');
|
||||||
|
});
|
||||||
|
it('constructor of Socket in msg', function() {
|
||||||
|
function Socket(){};
|
||||||
|
var msg = { msg: { socket: new Socket() } };
|
||||||
|
var result = util.encodeObject(msg);
|
||||||
|
result.format.should.eql("Object");
|
||||||
|
var resultJson = JSON.parse(result.msg);
|
||||||
|
resultJson.socket.should.eql('[internal]');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user