mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			365 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			365 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Copyright JS Foundation and other contributors, http://js.foundation
 | |
|  *
 | |
|  * 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 when = require('when');
 | |
| var should = require('should');
 | |
| var fs = require('fs-extra');
 | |
| 
 | |
| var helper = require('../../editor_helper');
 | |
| var debugTab = require('../../pageobjects/editor/debugTab_page');
 | |
| var workspace = require('../../pageobjects/editor/workspace_page');
 | |
| var specUtil = require('../../pageobjects/util/spec_util_page');
 | |
| 
 | |
| var httpNodeRoot = '/api';
 | |
| 
 | |
| // https://cookbook.nodered.org/
 | |
| describe('cookbook', function () {
 | |
|     beforeEach(function () {
 | |
|         workspace.init();
 | |
|     });
 | |
| 
 | |
|     before(function () {
 | |
|         helper.startServer();
 | |
|     });
 | |
| 
 | |
|     after(function () {
 | |
|         helper.stopServer();
 | |
|     });
 | |
| 
 | |
|     describe('working with data formats', function () {
 | |
|         it('convert to/from JSON', function () {
 | |
|             var injectNode1 = workspace.addNode('inject');
 | |
|             var jsonNode1 = workspace.addNode('json');
 | |
|             var debugNode1 = workspace.addNode('debug');
 | |
| 
 | |
|             injectNode1.edit();
 | |
|             injectNode1.setPayload('str', '{"a":1}');
 | |
|             injectNode1.clickOk();
 | |
| 
 | |
|             jsonNode1.edit();
 | |
|             jsonNode1.setProperty('payload');
 | |
|             jsonNode1.clickOk();
 | |
| 
 | |
|             injectNode1.connect(jsonNode1);
 | |
|             jsonNode1.connect(debugNode1);
 | |
| 
 | |
|             var injectNode2 = workspace.addNode('inject');
 | |
|             var jsonNode2 = workspace.addNode('json');
 | |
|             var debugNode2 = workspace.addNode('debug');
 | |
| 
 | |
|             injectNode2.edit();
 | |
|             injectNode2.setPayload('json', '{"a":1}');
 | |
|             injectNode2.clickOk();
 | |
| 
 | |
|             jsonNode2.edit();
 | |
|             jsonNode2.setProperty('payload');
 | |
|             jsonNode2.clickOk();
 | |
| 
 | |
|             injectNode2.connect(jsonNode2);
 | |
|             jsonNode2.connect(debugNode2);
 | |
| 
 | |
|             workspace.deploy();
 | |
| 
 | |
|             debugTab.open();
 | |
|             injectNode1.clickLeftButton();
 | |
|             debugTab.getMessage().should.eql('1');
 | |
|             debugTab.clearMessage();
 | |
|             injectNode2.clickLeftButton();
 | |
|             debugTab.getMessage().should.eql('"{"a":1}"');
 | |
|         });
 | |
| 
 | |
|         it('convert to/from XML', function () {
 | |
|             var injectNode1 = workspace.addNode('inject', 0);
 | |
|             var templateNode1 = workspace.addNode('template', 200);
 | |
|             var xmlNode1 = workspace.addNode('xml', 400);
 | |
|             var debugNode1 = workspace.addNode('debug', 600);
 | |
| 
 | |
|             injectNode1.edit();
 | |
|             injectNode1.setPayload('str', '{"a":1}');
 | |
|             injectNode1.clickOk();
 | |
| 
 | |
|             templateNode1.edit();
 | |
|             templateNode1.setFormat('text');
 | |
|             templateNode1.setSyntax('plain');
 | |
|             templateNode1.setTemplate('<note priority="high">'
 | |
|                                     + '  <to>Nick</to>'
 | |
|                                     + '  <from>Dave</from>'
 | |
|                                     + '  <heading>Reminder</heading>'
 | |
|                                     + '  <body>Update the website</body>'
 | |
|                                     + '</note>');
 | |
|             templateNode1.clickOk();
 | |
| 
 | |
|             xmlNode1.edit();
 | |
|             xmlNode1.setProperty('payload');
 | |
|             xmlNode1.clickOk();
 | |
| 
 | |
|             injectNode1.connect(templateNode1);
 | |
|             templateNode1.connect(xmlNode1);
 | |
|             xmlNode1.connect(debugNode1);
 | |
| 
 | |
|             var injectNode2 = workspace.addNode('inject');
 | |
|             var xmlNode2 = workspace.addNode('xml');
 | |
|             var debugNode2 = workspace.addNode('debug');
 | |
| 
 | |
|             injectNode2.edit();
 | |
|             injectNode2.setPayload('json', '{'
 | |
|                                          + '    "note": {'
 | |
|                                          + '        "$": { "priority": "high" },'
 | |
|                                          + '        "to": [ "Nick" ],'
 | |
|                                          + '        "from": [ "Dave" ],'
 | |
|                                          + '        "heading": [ "Reminder" ],'
 | |
|                                          + '        "body": [ "Update the website" ]'
 | |
|                                          + '    }'
 | |
|                                          + '}');
 | |
|             injectNode2.clickOk();
 | |
| 
 | |
|             xmlNode2.edit();
 | |
|             xmlNode2.setProperty('payload');
 | |
|             xmlNode2.clickOk();
 | |
| 
 | |
|             injectNode2.connect(xmlNode2);
 | |
|             xmlNode2.connect(debugNode2);
 | |
| 
 | |
|             workspace.deploy();
 | |
| 
 | |
|             debugTab.open();
 | |
|             injectNode1.clickLeftButton();
 | |
|             debugTab.getMessage().should.eql('object');
 | |
|             debugTab.clearMessage();
 | |
|             injectNode2.clickLeftButton();
 | |
|             debugTab.getMessage().should.eql('"<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
 | |
|                                             + '<note priority="high">'
 | |
|                                             + '<to>Nick</to>'
 | |
|                                             + '<from>Dave</from>'
 | |
|                                             + '<heading>Reminder</heading>'
 | |
|                                             + '<body>Update the website</body>'
 | |
|                                             + '</note>"');
 | |
|         });
 | |
| 
 | |
|         it('convert to/from YAML', function () {
 | |
|             var injectNode1 = workspace.addNode('inject', 0);
 | |
|             var templateNode1 = workspace.addNode('template', 200);
 | |
|             var yamlNode1 = workspace.addNode('yaml', 400);
 | |
|             var debugNode1 = workspace.addNode('debug', 600);
 | |
| 
 | |
|             injectNode1.edit();
 | |
|             injectNode1.setPayload('str', '{"a":1}');
 | |
|             injectNode1.clickOk();
 | |
| 
 | |
|             templateNode1.edit();
 | |
|             templateNode1.setFormat('yaml');
 | |
|             templateNode1.setSyntax('plain');
 | |
|             templateNode1.setTemplate('a: 1\n'
 | |
|                                     + 'b:\n'
 | |
|                                     + '  - 1\n'
 | |
|                                     + '- 2\n'
 | |
|                                     + '- 3');
 | |
|             templateNode1.clickOk();
 | |
| 
 | |
|             yamlNode1.edit();
 | |
|             yamlNode1.setProperty('payload');
 | |
|             yamlNode1.clickOk();
 | |
| 
 | |
|             injectNode1.connect(templateNode1);
 | |
|             templateNode1.connect(yamlNode1);
 | |
|             yamlNode1.connect(debugNode1);
 | |
| 
 | |
|             var injectNode2 = workspace.addNode('inject');
 | |
|             var yamlNode2 = workspace.addNode('yaml');
 | |
|             var debugNode2 = workspace.addNode('debug');
 | |
| 
 | |
|             injectNode2.edit();
 | |
|             injectNode2.setPayload('json', '{"a":1, "b":[1,2,3]}');
 | |
|             injectNode2.clickOk();
 | |
| 
 | |
|             yamlNode2.edit();
 | |
|             yamlNode2.setProperty('payload');
 | |
|             yamlNode2.clickOk();
 | |
| 
 | |
|             injectNode2.connect(yamlNode2);
 | |
|             yamlNode2.connect(debugNode2);
 | |
| 
 | |
|             workspace.deploy();
 | |
| 
 | |
|             debugTab.open();
 | |
|             injectNode1.clickLeftButton();
 | |
|             debugTab.getMessage().should.eql([ '1', 'array[3]' ]);
 | |
|             debugTab.clearMessage();
 | |
|             injectNode2.clickLeftButton();
 | |
|             debugTab.getMessage().should.eql('"a: 1↵b:↵  - 1↵  - 2↵  - 3↵"');
 | |
|         });
 | |
| 
 | |
|         it('generate CSV output', function () {
 | |
|             var injectNode1 = workspace.addNode('inject', 0);
 | |
|             var changeNode1 = workspace.addNode('change', 200);
 | |
|             var csvNode1 = workspace.addNode('csv', 400);
 | |
|             var debugNode1 = workspace.addNode('debug', 600);
 | |
| 
 | |
|             changeNode1.edit();
 | |
|             changeNode1.ruleSet('payload', 'msg', '{'
 | |
|                                                 + '  "a": $floor(100*$random()),'
 | |
|                                                 + '  "b": $floor(100*$random()),'
 | |
|                                                 + '  "c": $floor(100*$random())'
 | |
|                                                 + '}', 'jsonata');
 | |
|             changeNode1.clickOk();
 | |
| 
 | |
|             csvNode1.edit();
 | |
|             csvNode1.setColumns('a,b,c');
 | |
|             csvNode1.clickOk();
 | |
| 
 | |
|             injectNode1.connect(changeNode1);
 | |
|             changeNode1.connect(csvNode1);
 | |
|             csvNode1.connect(debugNode1);
 | |
| 
 | |
|             var injectNode2 = workspace.addNode('inject', 0, 80);
 | |
|             var changeNode2 = workspace.addNode('change', 200, 80);
 | |
|             var csvNode2 = workspace.addNode('csv', 400, 80);
 | |
|             var debugNode2 = workspace.addNode('debug', 600, 80);
 | |
| 
 | |
|             changeNode2.edit();
 | |
|             changeNode2.ruleSet('payload', 'msg', '['
 | |
|                                                 + '  {'
 | |
|                                                 + '    "a": $floor(100*$random()),'
 | |
|                                                 + '    "b": $floor(100*$random()),'
 | |
|                                                 + '    "c": $floor(100*$random())'
 | |
|                                                 + '  }, {'
 | |
|                                                 + '    "a": $floor(100*$random()),'
 | |
|                                                 + '    "b": $floor(100*$random()),'
 | |
|                                                 + '    "c": $floor(100*$random())'
 | |
|                                                 + '  }, {'
 | |
|                                                 + '    "a": $floor(100*$random()),'
 | |
|                                                 + '    "b": $floor(100*$random()),'
 | |
|                                                 + '    "c": $floor(100*$random())'
 | |
|                                                 + '  }, {'
 | |
|                                                 + '    "a": $floor(100*$random()),'
 | |
|                                                 + '    "b": $floor(100*$random()),'
 | |
|                                                 + '    "c": $floor(100*$random())'
 | |
|                                                 + '  }'
 | |
|                                                 + ']', 'jsonata');
 | |
|             changeNode2.clickOk();
 | |
| 
 | |
|             csvNode2.edit();
 | |
|             csvNode2.setColumns('a,b,c');
 | |
|             csvNode2.setIncludeRow(true);
 | |
|             csvNode2.clickOk();
 | |
| 
 | |
|             injectNode2.connect(changeNode2);
 | |
|             changeNode2.connect(csvNode2);
 | |
|             csvNode2.connect(debugNode2);
 | |
| 
 | |
|             workspace.deploy();
 | |
| 
 | |
|             debugTab.open();
 | |
|             injectNode1.clickLeftButton();
 | |
|             debugTab.getMessage().should.match(/^"([1-9]?[0-9],){2}[1-9]?[0-9]↵"$/);
 | |
|             debugTab.clearMessage();
 | |
|             injectNode2.clickLeftButton();
 | |
|             debugTab.getMessage().should.match(/^"(([1-9]?[0-9],){2}[1-9]?[0-9]↵){4}"$/);
 | |
|         });
 | |
| 
 | |
|         it('parse CSV input', function () {
 | |
|             var injectNode = workspace.addNode('inject');
 | |
|             var templateNode = workspace.addNode('template');
 | |
|             var csvNode = workspace.addNode('csv');
 | |
|             var debugNode = workspace.addNode('debug');
 | |
| 
 | |
|             templateNode.edit();
 | |
|             templateNode.setFormat('handlebars');
 | |
|             templateNode.setSyntax('mustache');
 | |
|             templateNode.setTemplate('# This is some random data\n'
 | |
|                                    + 'a,b,c\n'
 | |
|                                    + '80,18,2\n'
 | |
|                                    + '52,36,10\n'
 | |
|                                    + '91,18,61\n'
 | |
|                                    + '32,47,65');
 | |
|             templateNode.clickOk();
 | |
| 
 | |
|             csvNode.edit();
 | |
|             csvNode.setSkipLines(1);
 | |
|             csvNode.setFirstRow4Names(true);
 | |
|             csvNode.setOutput('mult');
 | |
|             csvNode.clickOk();
 | |
| 
 | |
|             injectNode.connect(templateNode);
 | |
|             templateNode.connect(csvNode);
 | |
|             csvNode.connect(debugNode);
 | |
| 
 | |
|             workspace.deploy();
 | |
| 
 | |
|             debugTab.open();
 | |
|             injectNode.clickLeftButton();
 | |
|             debugTab.getMessage().should.eql([ 'object', 'object', 'object', 'object' ]);
 | |
|         });
 | |
| 
 | |
|         it('simple GET request', function () {
 | |
|             var injectNode = workspace.addNode('inject');
 | |
|             var httpRequestNode = workspace.addNode('httpRequest');
 | |
|             var htmlNode = workspace.addNode('html');
 | |
|             var debugNode = workspace.addNode('debug');
 | |
| 
 | |
|             httpRequestNode.edit();
 | |
|             httpRequestNode.setMethod('GET');
 | |
|             httpRequestNode.setUrl('https://nodered.org');
 | |
|             httpRequestNode.clickOk();
 | |
| 
 | |
|             htmlNode.edit();
 | |
|             htmlNode.setSelector('.node-red-latest-version');
 | |
|             htmlNode.clickOk();
 | |
| 
 | |
|             injectNode.connect(httpRequestNode);
 | |
|             httpRequestNode.connect(htmlNode);
 | |
|             htmlNode.connect(debugNode);
 | |
| 
 | |
|             workspace.deploy();
 | |
| 
 | |
|             debugTab.open();
 | |
|             injectNode.clickLeftButton();
 | |
|             debugTab.getMessage().should.match(/^"v[0-9]+\.[0-9]+\.[0-9]"$/);
 | |
|         });
 | |
| 
 | |
|         it('split text into one message per line', function () {
 | |
|             var injectNode = workspace.addNode('inject');
 | |
|             var templateNode = workspace.addNode('template');
 | |
|             var splitNode = workspace.addNode('split');
 | |
|             var changeNode = workspace.addNode('change');
 | |
|             var joinNode = workspace.addNode('join');
 | |
|             var debugNode = workspace.addNode('debug');
 | |
| 
 | |
|             templateNode.edit();
 | |
|             templateNode.setFormat('handlebars');
 | |
|             templateNode.setSyntax('mustache');
 | |
|             templateNode.setTemplate('one\ntwo\nthree\nfour\nfive');
 | |
|             templateNode.clickOk();
 | |
| 
 | |
|             changeNode.edit();
 | |
|             changeNode.ruleSet('payload', 'msg', '(parts.index+1) & ": " & payload', 'jsonata');
 | |
|             changeNode.clickOk();
 | |
| 
 | |
|             injectNode.connect(templateNode);
 | |
|             templateNode.connect(splitNode);
 | |
|             splitNode.connect(changeNode);
 | |
|             changeNode.connect(joinNode);
 | |
|             joinNode.connect(debugNode);
 | |
| 
 | |
|             workspace.deploy();
 | |
| 
 | |
|             debugTab.open();
 | |
|             injectNode.clickLeftButton();
 | |
|             debugTab.getMessage().should.eql('"1: one↵2: two↵3: three↵4: four↵5: five"');
 | |
|         });
 | |
|     });
 | |
| });
 |