From c93870316c71742521cfab83659e04eab20e6167 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Sun, 9 Jul 2017 10:40:23 +0100 Subject: [PATCH] Fix accessing global context from jsonata expressions Fixes #1335 --- red/runtime/util.js | 2 +- test/red/runtime/util_spec.js | 44 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/red/runtime/util.js b/red/runtime/util.js index 08a68d60e..e75f13af1 100644 --- a/red/runtime/util.js +++ b/red/runtime/util.js @@ -338,7 +338,7 @@ function prepareJSONataExpression(value,node) { return node.context().flow.get(val); }); expr.assign('globalContext',function(val) { - return node.context().global(val); + return node.context().global.get(val); }); expr._legacyMode = /(^|[^a-zA-Z0-9_'"])msg([^a-zA-Z0-9_'"]|$)/.test(value); return expr; diff --git a/test/red/runtime/util_spec.js b/test/red/runtime/util_spec.js index ffec6ce0b..f542228a2 100644 --- a/test/red/runtime/util_spec.js +++ b/test/red/runtime/util_spec.js @@ -381,4 +381,48 @@ describe("red/util", function() { it('pass http request',function() { normalise("http request", "httpRequest") }); it('pass HttpRequest',function() { normalise("HttpRequest", "httpRequest") }); }); + + describe('prepareJSONataExpression', function() { + it('prepares an expression', function() { + var result = util.prepareJSONataExpression('payload',{}); + result.should.have.property('evaluate'); + result.should.have.property('assign'); + result.should.have.property('_legacyMode', false); + }); + it('prepares a legacyMode expression', function() { + var result = util.prepareJSONataExpression('msg.payload',{}); + result.should.have.property('evaluate'); + result.should.have.property('assign'); + result.should.have.property('_legacyMode', true); + }); + }); + describe('evaluateJSONataExpression', function() { + it('evaluates an expression', function() { + var expr = util.prepareJSONataExpression('payload',{}); + var result = util.evaluateJSONataExpression(expr,{payload:"hello"}); + result.should.eql("hello"); + }); + it('evaluates a legacyMode expression', function() { + var expr = util.prepareJSONataExpression('msg.payload',{}); + var result = util.evaluateJSONataExpression(expr,{payload:"hello"}); + result.should.eql("hello"); + }); + it('accesses flow context from an expression', function() { + var expr = util.prepareJSONataExpression('$flowContext("foo")',{context:function() { return {flow:{get: function(key) { return {'foo':'bar'}[key]}}}}}); + var result = util.evaluateJSONataExpression(expr,{payload:"hello"}); + result.should.eql("bar"); + }); + 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 result = util.evaluateJSONataExpression(expr,{payload:"hello"}); + should.not.exist(result); + }); + it('handles non-existant global context variable', function() { + var expr = util.prepareJSONataExpression('$globalContext("nonExistant")',{context:function() { return {global:{get: function(key) { return {'foo':'bar'}[key]}}}}}); + var result = util.evaluateJSONataExpression(expr,{payload:"hello"}); + should.not.exist(result); + }); + + }); + });