[CCSDK-28] populated the seed code for dgbuilder
[ccsdk/distribution.git] / dgbuilder / test / nodes / core / core / 80-function_spec.js
diff --git a/dgbuilder/test/nodes/core/core/80-function_spec.js b/dgbuilder/test/nodes/core/core/80-function_spec.js
new file mode 100644 (file)
index 0000000..9efd93a
--- /dev/null
@@ -0,0 +1,149 @@
+/**
+ * Copyright 2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+var should = require("should");
+var functionNode = require("../../../../nodes/core/core/80-function.js");
+var helper = require("../../helper.js");
+
+describe('function node', function() {
+
+    before(function(done) {
+        helper.startServer(done);
+    });
+    
+    afterEach(function() {
+        helper.unload();
+    });
+
+    it('should be loaded', function(done) {
+        var flow = [{id:"n1", type:"function", name: "function" }];
+        helper.load(functionNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            n1.should.have.property('name', 'function');
+            done();
+        });
+    });
+
+    it('should send returned message', function(done) {
+        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"return msg;"},
+                    {id:"n2", type:"helper"}];
+        helper.load(functionNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            var n2 = helper.getNode("n2");
+            n2.on("input", function(msg) {
+                msg.should.have.property('topic', 'bar');
+                msg.should.have.property('payload', 'foo');
+                done();
+            });
+            n1.receive({payload:"foo",topic: "bar"});
+        });
+    });
+
+    it('should pass through _topic', function(done) {
+        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"return msg;"},
+                    {id:"n2", type:"helper"}];
+        helper.load(functionNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            var n2 = helper.getNode("n2");
+            n2.on("input", function(msg) {
+                msg.should.have.property('topic', 'bar');
+                msg.should.have.property('payload', 'foo');
+                msg.should.have.property('_topic', 'baz');
+                done();
+            });
+            n1.receive({payload:"foo",topic: "bar", _topic: "baz"});
+        });
+    });
+
+    it('should send to multiple outputs', function(done) {
+        var flow = [{id:"n1",type:"function",wires:[["n2"],["n3"]],
+                     func:"return [{payload: '1'},{payload: '2'}];"},
+                    {id:"n2", type:"helper"}, {id:"n3", type:"helper"} ];
+        helper.load(functionNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            var n2 = helper.getNode("n2");
+            var n3 = helper.getNode("n3");
+            var count = 0;
+            n2.on("input", function(msg) {
+                should(msg).have.property('payload', '1');
+                count++;
+                if (count == 2) {
+                    done();
+                }
+            });
+            n3.on("input", function(msg) {
+                should(msg).have.property('payload', '2');
+                count++;
+                if (count == 2) {
+                    done();
+                }
+            });
+            n1.receive({payload:"foo",topic: "bar"});
+        });
+    });
+
+    it('should send to multiple messages', function(done) {
+        var flow = [{id:"n1",type:"function",wires:[["n2"]],
+                     func:"return [[{payload: 1},{payload: 2}]];"},
+                    {id:"n2", type:"helper"} ];
+        helper.load(functionNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            var n2 = helper.getNode("n2");
+            var count = 0;
+            n2.on("input", function(msg) {
+                count++;
+                should(msg).have.property('payload', count);
+                should(msg).have.property('_topic', 'baz');
+                if (count == 2) {
+                    done();
+                }
+            });
+            n1.receive({payload:"foo", topic: "bar", _topic:"baz"});
+        });
+    });
+
+    it('should allow input to be discarded by returning null', function(done) {
+        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"return null"},
+                    {id:"n2", type:"helper"}];
+        helper.load(functionNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            var n2 = helper.getNode("n2");
+            setTimeout(function() {
+                done();
+            }, 200);
+            n2.on("input", function(msg) {
+                should.fail(null,null,"unexpected message");
+            });
+            n1.receive({payload:"foo",topic: "bar"});
+        });
+    });
+
+    it('should handle and log script error', function(done) {
+        var flow = [{id:"n1",type:"function",wires:[["n2"]],func:"retunr"}];
+        helper.load(functionNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            n1.on("log", function(msg) {
+                msg.should.have.property('level', 'error');
+                msg.should.have.property('id', 'n1');
+                msg.should.have.property('type', 'function');
+                msg.should.have.property('msg', 'ReferenceError: retunr is not defined');
+                done();
+            });
+            n1.receive({payload:"foo",topic: "bar"});
+        });
+    });
+
+});