[CCSDK-28] populated the seed code for dgbuilder
[ccsdk/distribution.git] / dgbuilder / test / nodes / core / core / 58-debug_spec.js
diff --git a/dgbuilder/test/nodes/core/core/58-debug_spec.js b/dgbuilder/test/nodes/core/core/58-debug_spec.js
new file mode 100644 (file)
index 0000000..f83fc2c
--- /dev/null
@@ -0,0 +1,298 @@
+/**
+ * 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 debugNode = require("../../../../nodes/core/core/58-debug.js");
+var helper = require("../../helper.js");
+var WebSocket = require('ws');
+
+describe('debug node', function() {
+
+    before(function(done) {
+        helper.startServer(done);
+    });
+    
+    afterEach(function() {
+        helper.unload();
+    });
+
+
+    it('should be loaded', function(done) {
+        var flow = [{id:"n1", type:"debug", name: "Debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            n1.should.have.property('name', 'Debug');
+            done();
+        });
+    });
+
+    it('should publish on input', function(done) {
+        var flow = [{id:"n1", type:"debug", name: "Debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload:"test"});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",data:{id:"n1",name:"Debug",msg:"test"}
+                });
+            }, done);
+        });
+    });
+
+    it('should publish to console', function(done) {
+        var flow = [{id:"n1", type:"debug", console: "true" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            var count = 0;
+            n1.on('log', function(msg) {
+                msg.should.eql({level:'log',id:'n1',type:'debug',msg:'test'});
+                count++;
+                if (count == 2) {
+                    done();
+                }
+            });
+            websocket_test(function() {
+                n1.emit("input", {payload:"test"});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",data:{id:"n1",msg:"test"}
+                });
+                count++;
+            }, function() {
+                if (count == 2) {
+                    done();
+                }
+            });
+        });
+    });
+
+    it('should publish complete message', function(done) {
+        var flow = [{id:"n1", type:"debug", complete: "true" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload:"test"});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",
+                    data:{id:"n1",msg:'(Object) {\n "payload": "test"\n}'}
+                });
+            }, done);
+        });
+    });
+
+    it('should publish an Error', function(done) {
+        var flow = [{id:"n1", type:"debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload: new Error("oops")});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",data:{id:"n1",msg:"Error: oops"}
+                });
+            }, done);
+        });
+    });
+
+    it('should publish a boolean', function(done) {
+        var flow = [{id:"n1", type:"debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload: true});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",data:{id:"n1",msg: '(boolean) true'}
+                });
+            }, done);
+        });
+    });
+
+    it('should publish with no payload', function(done) {
+        var flow = [{id:"n1", type:"debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",data:{id:"n1",msg: '(undefined)'}
+                });
+            }, done);
+        });
+    });
+
+    it('should publish an object', function(done) {
+        var flow = [{id:"n1", type:"debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload: {type:'foo'}});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",
+                    data:{id:"n1",msg:'(Object) {\n "type": "foo"\n}'}
+                });
+            }, done);
+        });
+    });
+
+    it('should publish an array', function(done) {
+        var flow = [{id:"n1", type:"debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload: [0,1,2,3]});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",
+                    data:{id:"n1",msg: '(Array) [\n 0,\n 1,\n 2,\n 3\n]'}
+                });
+            }, done);
+        });
+    });
+
+    it('should publish an object with circular references', function(done) {
+        var flow = [{id:"n1", type:"debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                var o = { name: 'bar' };
+                o.o = o;
+                n1.emit("input", {payload: o});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",
+                    data:{
+                        id:"n1",
+                        msg:'(Object) {\n "name": "bar",\n "o": "[circular]"\n}'
+                    }
+                });
+            }, done);
+        });
+    });
+
+    it('should truncated a long message', function(done) {
+        var flow = [{id:"n1", type:"debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload: Array(1002).join("X")});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",
+                    data:{
+                        id:"n1",
+                        msg: Array(1001).join("X")+' ....'
+                    }
+                });
+            }, done);
+        });
+    });
+
+    it('should convert Buffer to hex', function(done) {
+        var flow = [{id:"n1", type:"debug" }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload: new Buffer('HELLO', 'utf8')});
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",
+                    data:{
+                        id:"n1",
+                        msg: '(Buffer) 48454c4c4f',
+                    }
+                });
+            }, done);
+        });
+    });
+
+    it('should publish when active', function(done) {
+        var flow = [{id:"n1", type:"debug", active: false }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function() {
+                n1.emit("input", {payload:"message 1"});
+                helper.request()
+                    .post('/debug/n1/enable')
+                    .expect(200).end(function(err) {
+                        if (err) { return done(err); }
+                        n1.emit("input", {payload:"message 2"});
+                    });
+            }, function(msg) {
+                JSON.parse(msg).should.eql({
+                    topic:"debug",data:{id:"n1",msg:"message 2"}
+                });
+            }, done);
+        });
+    });
+
+    it('should not publish when inactive', function(done) {
+        var flow = [{id:"n1", type:"debug", active: true }];
+        helper.load(debugNode, flow, function() {
+            var n1 = helper.getNode("n1");
+            websocket_test(function(close) {
+                helper.request()
+                    .post('/debug/n1/disable')
+                    .expect(201).end(function(err) {
+                        if (err) {
+                            close();
+                            return done(err);
+                        }
+                        n1.emit("input", {payload:"message"});
+                        setTimeout(function() {
+                            close();
+                            done();
+                        }, 200);
+                    });
+            }, function(msg) {
+                should.fail(null,null,"unexpected message");
+            }, function() {});
+        });
+    });
+
+    describe('post', function() {
+        it('should return 404 on invalid state', function(done) {
+            var flow = [{id:"n1", type:"debug", active: true }];
+            helper.load(debugNode, flow, function() {
+                helper.request()
+                    .post('/debug/n1/foobar')
+                    .expect(404).end(done);
+            });
+        });
+
+        it('should return 404 on invalid node', function(done) {
+            helper.request()
+                .post('/debug/n99/enable')
+                .expect(404).end(done);
+        });
+    });
+
+});
+
+function websocket_test(open_callback, message_callback, done_callback) {
+    var ws = new WebSocket(helper.url() + "/comms");
+    var close_callback = function() { ws.close(); };
+    ws.on('open', function() { open_callback(close_callback); });
+    ws.on('message', function(msg) {
+        message_callback(msg, close_callback);
+        ws.close();
+        done_callback();
+    });
+}