[CCSDK-28] populated the seed code for dgbuilder
[ccsdk/distribution.git] / dgbuilder / test / nodes / core / logic / 15-change_spec.js
1 /**
2  * Copyright 2014 IBM Corp.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  **/
16
17 var should = require("should");
18
19 var changeNode = require("../../../../nodes/core/logic/15-change.js");
20 var helper = require("../../helper.js");
21
22 describe('ChangeNode', function() {
23     
24     beforeEach(function(done) {
25         helper.startServer(done);
26     });
27     
28     afterEach(function(done) {
29         helper.unload();
30         helper.stopServer(done);
31     });
32
33     it('should be loaded', function(done) {
34         var flow = [{"id":"changeNode1","type":"change","action":"replace","property":"payload","from":"","to":"","reg":false,"name":"changeNode","wires":[[]]}];
35         helper.load(changeNode, flow, function() {
36             var changeNode1 = helper.getNode("changeNode1");
37             changeNode1.should.have.property('name', 'changeNode');
38             done();
39         });
40     });
41     
42     it('sets the value of the message property', function(done) {
43         var flow = [{"id":"changeNode1","type":"change","action":"replace","property":"payload","from":"","to":"changed","reg":false,"name":"changeNode","wires":[["helperNode1"]]},
44                     {id:"helperNode1", type:"helper", wires:[]}];
45         helper.load(changeNode, flow, function() {
46             var changeNode1 = helper.getNode("changeNode1");
47             var helperNode1 = helper.getNode("helperNode1");
48             helperNode1.on("input", function(msg) {
49                 try {
50                     msg.payload.should.equal("changed");
51                     done();
52                 } catch(err) {
53                     done(err);
54                 }
55             });
56             changeNode1.receive({payload:"changeMe"});
57         });
58     });
59     
60     it('changes the value of the message property', function(done) {
61         var flow = [{"id":"changeNode1","type":"change","action":"change","property":"payload","from":"Hello","to":"Goodbye","reg":false,"name":"changeNode","wires":[["helperNode1"]]},
62                     {id:"helperNode1", type:"helper", wires:[]}];
63         helper.load(changeNode, flow, function() {
64             var changeNode1 = helper.getNode("changeNode1");
65             var helperNode1 = helper.getNode("helperNode1");
66             helperNode1.on("input", function(msg) {
67                 try {
68                     msg.payload.should.equal("Goodbye World!");
69                     done();
70                 } catch(err) {
71                     done(err);
72                 }
73             });
74             changeNode1.receive({payload:"Hello World!"});
75         });
76     });
77     
78     it('changes the value of the message property based on a regex', function(done) {
79         var flow = [{"id":"changeNode1","type":"change","action":"change","property":"payload","from":"\\d+","to":"NUMBER","reg":true,"name":"changeNode","wires":[["helperNode1"]]},
80                     {id:"helperNode1", type:"helper", wires:[]}];
81         helper.load(changeNode, flow, function() {
82             var changeNode1 = helper.getNode("changeNode1");
83             var helperNode1 = helper.getNode("helperNode1");
84             helperNode1.on("input", function(msg) {
85                 try {
86                     msg.payload.should.equal("Replace all numbers NUMBER and NUMBER");
87                     done();
88                 } catch(err) {
89                     done(err);
90                 }
91             });
92             changeNode1.receive({payload:"Replace all numbers 12 and 14"});
93         });
94     });
95     
96     it('supports regex groups', function(done) {
97         var flow = [{"id":"changeNode1","type":"change","action":"change","property":"payload","from":"(Hello)","to":"$1-$1-$1","reg":true,"name":"changeNode","wires":[["helperNode1"]]},
98                     {id:"helperNode1", type:"helper", wires:[]}];
99         helper.load(changeNode, flow, function() {
100             var changeNode1 = helper.getNode("changeNode1");
101             var helperNode1 = helper.getNode("helperNode1");
102             helperNode1.on("input", function(msg) {
103                 try {
104                     msg.payload.should.equal("Hello-Hello-Hello World");
105                     done();
106                 } catch(err) {
107                     done(err);
108                 }
109             });
110             changeNode1.receive({payload:"Hello World"});
111         });
112     });
113     
114     it('Reports invalid regex', function(done) {
115         
116         var sinon = require('sinon');
117         
118         var flow = [{"id":"changeNode1","type":"change","action":"change","property":"payload","from":"\\+**+","to":"NUMBER","reg":true,"name":"changeNode","wires":[["helperNode1"]]},
119                     {id:"helperNode1", type:"helper", wires:[]}];
120         helper.load(changeNode, flow, function() {
121             var changeNode1 = helper.getNode("changeNode1");
122             var helperNode1 = helper.getNode("helperNode1");
123             
124             sinon.stub(changeNode1, 'error', function(error) {
125                 if(error.indexOf("regular expression" > -1)) {
126                     done();
127                 } else {
128                     try {
129                         should.fail(null, null, "An error should be reported for an invalid regex");
130                     } catch (err) {
131                         done(err);
132                     }
133                 }
134              });
135             changeNode1.receive({payload:"This is irrelevant"});
136         });
137     });
138     
139     it('deletes the value of the message property', function(done) {
140         var flow = [{"id":"changeNode1","type":"change","action":"delete","property":"payload","from":"","to":"","reg":false,"name":"changeNode","wires":[["helperNode1"]]},
141                     {id:"helperNode1", type:"helper", wires:[]}];
142         helper.load(changeNode, flow, function() {
143             var changeNode1 = helper.getNode("changeNode1");
144             var helperNode1 = helper.getNode("helperNode1");
145             helperNode1.on("input", function(msg) {
146                 try {
147                     msg.should.not.have.property('payload');
148                     done();
149                 } catch(err) {
150                     done(err);
151                 }
152             });
153             changeNode1.receive({payload:"This won't get through!"});
154         });
155     });
156     
157 // TODO confirm the behaviour of the change node later,apparently calling eval such that  makeNew( msg, node.property.split("."), eval(node.to) ); is incorrect
158 //    it('changes the property name of the message object', function(done) {
159 //        var flow = [{"id":"changeNode1","type":"change","action":"replace","property":"payload","from":"","to":"msg.otherProp=10","reg":false,"name":"changeNode","wires":[["helperNode1"]]},
160 //                    {id:"helperNode1", type:"helper", wires:[]}];
161 //        helper.load(changeNode, flow, function() {
162 //            var changeNode1 = helper.getNode("changeNode1");
163 //            var helperNode1 = helper.getNode("helperNode1");
164 //            helperNode1.on("input", function(msg) {
165 //                try {
166 //                    msg.otherProp.should.equal(10);
167 //                    done();
168 //                } catch(err) {
169 //                    done(err);
170 //                }
171 //            });
172 //            changeNode1.receive({payload:"changeMe"});
173 //        });
174 //    });
175     
176     it('splits dot delimited properties into objects', function(done) {
177         var flow = [{"id":"changeNode1","type":"change","action":"replace","property":"pay.load","from":"","to":"10","reg":false,"name":"changeNode","wires":[["helperNode1"]]},
178                     {id:"helperNode1", type:"helper", wires:[]}];
179         helper.load(changeNode, flow, function() {
180             var changeNode1 = helper.getNode("changeNode1");
181             var helperNode1 = helper.getNode("helperNode1");
182             helperNode1.on("input", function(msg) {
183                 try {
184                     msg.pay.load.should.equal("10");
185                     done();
186                 } catch(err) {
187                     done(err);
188                 }
189             });
190             changeNode1.receive({"pay.load":"changeMe"});
191         });
192     });
193 });
194