diff --git a/test/editor/pageobjects/nodes/core/core/20-inject_page.js b/test/editor/pageobjects/nodes/core/core/20-inject_page.js index 3ba0b26d3..70321e69e 100644 --- a/test/editor/pageobjects/nodes/core/core/20-inject_page.js +++ b/test/editor/pageobjects/nodes/core/core/20-inject_page.js @@ -50,14 +50,23 @@ var timeType = { "atASpecificTime": 4, }; +var timeType = { + "none": 1, + "interval": 2, + "intervalBetweenTimes": 3, + "atASpecificTime": 4, +}; + injectNode.prototype.setPayload = function(type, value) { // Open a payload type list. browser.clickWithWait('//*[contains(@class, "red-ui-typedInput-container")]'); // Select a payload type. var payloadTypeXPath = '//*[@class="red-ui-typedInput-options"]/a[' + payloadType[type] + ']'; browser.clickWithWait(payloadTypeXPath); - // Input a value. - browser.setValue('//*[@class="red-ui-typedInput-input"]/input', value); + if (value) { + // Input a value. + browser.setValue('//*[@class="red-ui-typedInput-input"]/input', value); + } } injectNode.prototype.setTopic = function(value) { diff --git a/test/editor/pageobjects/nodes/core/storage/50-filein_page.js b/test/editor/pageobjects/nodes/core/storage/50-filein_page.js new file mode 100644 index 000000000..3d8d0f614 --- /dev/null +++ b/test/editor/pageobjects/nodes/core/storage/50-filein_page.js @@ -0,0 +1,44 @@ +/** + * 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 util = require("util"); + +var nodePage = require("../../node_page"); + +function fileinNode(id) { + nodePage.call(this, id); +} + +util.inherits(fileinNode, nodePage); + +var formatType = { + "utf8": 1, + "lines": 2, + "": 3, // a single Buffer object + "stream": 4 +}; + +fileinNode.prototype.setFilename = function(value) { + browser.setValue('#node-input-filename', value); +} + +fileinNode.prototype.setFormat = function(type) { + browser.clickWithWait('#node-input-format'); + var formatTypeXPath = '//*[@id="node-input-format"]/option[' + formatType[type] + ']'; + browser.clickWithWait(formatTypeXPath); +} + +module.exports = fileinNode; diff --git a/test/editor/pageobjects/nodes/nodefactory_page.js b/test/editor/pageobjects/nodes/nodefactory_page.js index f15146ad6..74083f91f 100644 --- a/test/editor/pageobjects/nodes/nodefactory_page.js +++ b/test/editor/pageobjects/nodes/nodefactory_page.js @@ -24,6 +24,7 @@ var changeNode = require('./core/logic/15-change_page'); var rangeNode = require('./core/logic/16-range_page'); var httpRequestNode = require('./core/io/21-httprequest_page'); var htmlNode = require('./core/parsers/70-HTML_page'); +var fileinNode = require('./core/storage/50-filein_page'); var nodeCatalog = { @@ -40,6 +41,8 @@ var nodeCatalog = { "range": rangeNode, "httpRequest": httpRequestNode, "html": htmlNode, + // storage + "filein": fileinNode, } function create(type, id) { diff --git a/test/editor/pageobjects/workspace/palette_page.js b/test/editor/pageobjects/workspace/palette_page.js index 802d504a8..5717b16f3 100644 --- a/test/editor/pageobjects/workspace/palette_page.js +++ b/test/editor/pageobjects/workspace/palette_page.js @@ -28,6 +28,8 @@ var idMap = { "range": "#palette_node_range", "httpRequest": "#palette_node_http_request", "html": "#palette_node_html", + // storage + "filein": "#palette_node_file_in", }; function getId(type) { diff --git a/test/editor/specs/scenario/cookbook_endpoint_uispec.js b/test/editor/specs/scenario/cookbook_endpoint_uispec.js new file mode 100644 index 000000000..cabc760f6 --- /dev/null +++ b/test/editor/specs/scenario/cookbook_endpoint_uispec.js @@ -0,0 +1,584 @@ +/** + * 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 should = require("should"); + +var helper = require("../../editor_helper"); +var debugTab = require('../../pageobjects/workspace/debugTab_page'); +var workspace = require('../../pageobjects/workspace/workspace_page'); + +var nodeWidth = 200; +var nodeHeight = 100; +var httpNodeRoot = "/api"; + +// https://cookbook.nodered.org/ +describe('cookbook', function() { + beforeEach(function() { + workspace.deleteAllNodes(); + }); + + before(function() { + helper.startServer(); + }); + + after(function() { + helper.stopServer(); + }); + + describe('HTTP endpoints', function () { + it('create an HTTP endpoint', function () { + var httpinNode = workspace.addNode("httpin"); + var templateNode = workspace.addNode("template", nodeWidth); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 2); + + httpinNode.edit(); + httpinNode.setMethod("get"); + httpinNode.setUrl("/hello"); + httpinNode.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

Hello World!

\n\n"); + templateNode.clickOk(); + + httpinNode.connect(templateNode); + templateNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth, nodeHeight); + var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); + + httpRequestNode.edit(); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello'); + httpRequestNode.setMethod("get"); + httpRequestNode.clickOk(); + + injectNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().indexOf('Hello World!').should.not.eql(-1); + }); + + it('handle query parameters passed to an HTTP endpoint', function () { + var httpinNode = workspace.addNode("httpin"); + var templateNode = workspace.addNode("template", nodeWidth); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 2); + + httpinNode.edit(); + httpinNode.setMethod("get"); + httpinNode.setUrl("/hello-query"); + httpinNode.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

Hello {{req.query.name}}!

\n\n"); + templateNode.clickOk(); + + httpinNode.connect(templateNode); + templateNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth, nodeHeight); + var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); + + httpRequestNode.edit(); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-query?name=Nick'); + httpRequestNode.setMethod("get"); + httpRequestNode.clickOk(); + + injectNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().indexOf('Hello Nick!').should.not.eql(-1); + }); + + it('handle url parameters in an HTTP endpoint', function () { + var httpinNode = workspace.addNode("httpin"); + var templateNode = workspace.addNode("template", nodeWidth * 2); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 3); + + httpinNode.edit(); + httpinNode.setMethod("get"); + httpinNode.setUrl("/hello-param/:name"); + httpinNode.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

Hello {{req.params.name}}!

\n\n"); + templateNode.clickOk(); + + httpinNode.connect(templateNode); + templateNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth, nodeHeight); + var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); + + httpRequestNode.edit(); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-param/Dave'); + httpRequestNode.setMethod("get"); + httpRequestNode.clickOk(); + + injectNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().indexOf('Hello Dave!').should.not.eql(-1); + }); + + it('access HTTP request headers', function () { + var httpinNode = workspace.addNode("httpin"); + var templateNode = workspace.addNode("template", nodeWidth * 1.5); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 2.5); + + httpinNode.edit(); + httpinNode.setMethod("get"); + httpinNode.setUrl("/hello-headers"); + httpinNode.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

User agent: {{req.headers.user-agent}}

\n\n"); + templateNode.clickOk(); + + httpinNode.connect(templateNode); + templateNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight); + var changeNode = workspace.addNode("change", nodeWidth, nodeHeight); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth * 2, nodeHeight); + var debugNode = workspace.addNode("debug", nodeWidth * 3, nodeHeight); + + changeNode.edit(); + changeNode.ruleSet("headers", "msg", "{\"user-agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64)\"}", "json"); + changeNode.clickOk(); + + httpRequestNode.edit(); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-headers'); + httpRequestNode.setMethod("get"); + httpRequestNode.clickOk(); + + injectNode.connect(changeNode); + changeNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().indexOf('Mozilla').should.not.eql(-1); + }); + + it('include data captured in another flow', function () { + var injectNodeTimestamp = workspace.addNode("inject"); + var changeNodeStore = workspace.addNode("change", nodeWidth); + + var httpinNode = workspace.addNode("httpin", 0, nodeHeight); + var changeNodeCopy = workspace.addNode("change", nodeWidth * 2, nodeHeight); + var templateNode = workspace.addNode("template", nodeWidth * 3, nodeHeight); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 4, nodeHeight); + + injectNodeTimestamp.edit(); + injectNodeTimestamp.setPayload("date"); + injectNodeTimestamp.clickOk(); + + changeNodeStore.edit(); + changeNodeStore.ruleSet("timestamp", "flow", "payload", "msg"); + changeNodeStore.clickOk(); + + injectNodeTimestamp.connect(changeNodeStore); + + httpinNode.edit(); + httpinNode.setMethod("get"); + httpinNode.setUrl("/hello-data"); + httpinNode.clickOk(); + + changeNodeCopy.edit(); + changeNodeCopy.ruleSet("timestamp", "msg", "timestamp", "flow"); + changeNodeCopy.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

Time: {{ timestamp }}

\n\n"); + templateNode.clickOk(); + + httpinNode.connect(changeNodeCopy); + changeNodeCopy.connect(templateNode); + templateNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNodeCheck = workspace.addNode("inject", 0, nodeHeight * 2); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth, nodeHeight * 2); + var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight * 2); + + httpRequestNode.edit(); + httpRequestNode.setMethod("get"); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-data'); + httpRequestNode.clickOk(); + + injectNodeCheck.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNodeTimestamp.clickLeftButton(); + injectNodeCheck.clickLeftButton(); + var index = debugTab.getMessage().indexOf('Time: ') + 6; + debugTab.getMessage().substring(index, index + 13).should.within(1500000000000, 3000000000000); + }); + + it('serve JSON content', function () { + var httpinNode = workspace.addNode("httpin"); + var templateNode = workspace.addNode("template", nodeWidth); + var changeNode = workspace.addNode("change", nodeWidth * 2); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 3); + + httpinNode.edit(); + httpinNode.setMethod("get"); + httpinNode.setUrl("/hello-json"); + httpinNode.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("{ \"Hello\": \"World\" }"); + templateNode.clickOk(); + + changeNode.edit(); + changeNode.ruleSet("headers", "msg", "{}", "json", "1"); + changeNode.addRule(); + changeNode.ruleSet("headers.content-type", "msg", "application/json", "str", "2"); + changeNode.clickOk(); + + httpinNode.connect(templateNode); + templateNode.connect(changeNode); + changeNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth, nodeHeight); + var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); + + httpRequestNode.edit(); + httpRequestNode.setMethod("get"); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-json'); + httpRequestNode.clickOk(); + + debugNode.edit(); + debugNode.setTarget("msg", "headers"); + debugNode.clickOk(); + + injectNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + var message = debugTab.getMessage(); + message[1].indexOf('application/json').should.not.eql(-1); + }); + + it('serve a local file', function () { + var httpinNode = workspace.addNode("httpin"); + var fileinNode = workspace.addNode("filein", nodeWidth); + var changeNode = workspace.addNode("change", nodeWidth * 2, nodeHeight); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 3.5, nodeHeight); + + httpinNode.edit(); + httpinNode.setMethod("get"); + httpinNode.setUrl("/hello-file"); + httpinNode.clickOk(); + + fileinNode.edit(); + fileinNode.setFilename("test/resources/file-in-node/test.txt"); + fileinNode.setFormat(""); + fileinNode.clickOk(); + + changeNode.edit(); + changeNode.ruleSet("headers", "msg", "{}", "json"); + changeNode.addRule(); + changeNode.ruleSet("headers.content-type", "msg", "text/plain", "str", "2"); + changeNode.clickOk(); + + httpinNode.connect(fileinNode); + fileinNode.connect(changeNode); + changeNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight * 2); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth, nodeHeight * 2); + var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight * 2); + + httpRequestNode.edit(); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-file'); + httpRequestNode.setMethod("get"); + httpRequestNode.clickOk(); + + injectNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().indexOf('Text file').should.not.eql(-1); + }); + + it('post raw data to a flow', function() { + var httpinNode = workspace.addNode("httpin"); + var templateNode = workspace.addNode("template", nodeWidth * 2); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 3); + + httpinNode.edit(); + httpinNode.setMethod("post"); + httpinNode.setUrl("/hello-raw"); + httpinNode.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

Hello {{ payload }}!

\n\n"); + templateNode.clickOk(); + + httpinNode.connect(templateNode); + templateNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth, nodeHeight); + var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); + + injectNode.edit() + injectNode.setPayload("str", "Nick"); + injectNode.clickOk(); + + httpRequestNode.edit(); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-raw'); + httpRequestNode.setMethod("post"); + httpRequestNode.clickOk(); + + injectNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().indexOf('Hello Nick!').should.not.eql(-1); + }); + + it('post form data to a flow', function () { + var httpinNode = workspace.addNode("httpin"); + var templateNode = workspace.addNode("template", nodeWidth * 1.5); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 2.5); + + httpinNode.edit(); + httpinNode.setMethod("post"); + httpinNode.setUrl("/hello-form"); + httpinNode.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

Hello {{ payload.name }}!

\n\n"); + templateNode.clickOk(); + + httpinNode.connect(templateNode); + templateNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight); + var changeNode = workspace.addNode("change", nodeWidth, nodeHeight); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth * 2, nodeHeight); + var debugNode = workspace.addNode("debug", nodeWidth * 3, nodeHeight); + + injectNode.edit() + injectNode.setPayload("str", "name=Nick"); + injectNode.clickOk(); + + changeNode.edit(); + changeNode.ruleSet("headers", "msg", "{\"content-type\":\"application/x-www-form-urlencoded\"}", "json"); + changeNode.clickOk(); + + httpRequestNode.edit(); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-form'); + httpRequestNode.setMethod("post"); + httpRequestNode.clickOk(); + + injectNode.connect(changeNode); + changeNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().indexOf('Hello Nick!').should.not.eql(-1); + }); + + it('post JSON data to a flow', function() { + var httpinNode = workspace.addNode("httpin"); + var templateNode = workspace.addNode("template", nodeWidth * 2); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 3); + + httpinNode.edit(); + httpinNode.setMethod("post"); + httpinNode.setUrl("/hello-json"); + httpinNode.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

Hello {{ payload.name }}!

\n\n"); + templateNode.clickOk(); + + httpinNode.connect(templateNode); + templateNode.connect(httpResponseNode); + + // The code for confirmation starts from here. + var injectNode = workspace.addNode("inject", 0, nodeHeight); + var changeNode = workspace.addNode("change", nodeWidth, nodeHeight); + var httpRequestNode = workspace.addNode("httpRequest", nodeWidth * 2, nodeHeight); + var debugNode = workspace.addNode("debug", nodeWidth * 3, nodeHeight); + + injectNode.edit() + injectNode.setPayload("json", "{\"name\":\"Nick\"}"); + injectNode.clickOk(); + + changeNode.edit(); + changeNode.ruleSet("headers", "msg", "{\"content-type\":\"application/json\"}", "json"); + changeNode.clickOk(); + + httpRequestNode.edit(); + httpRequestNode.setUrl(helper.url() + httpNodeRoot + '/hello-json'); + httpRequestNode.setMethod("post"); + httpRequestNode.clickOk(); + + injectNode.connect(changeNode); + changeNode.connect(httpRequestNode); + httpRequestNode.connect(debugNode); + // The code for confirmation ends here. + + workspace.deploy(); + debugTab.open(); + debugTab.clearMessage(); + injectNode.clickLeftButton(); + debugTab.getMessage().indexOf('Hello Nick!').should.not.eql(-1); + }); + + it('work with cookies', function () { + this.timeout(60000); + + var httpinNodeFormat = workspace.addNode("httpin"); + var functionNodeFormat = workspace.addNode("function", nodeWidth * 1.5); + var templateNode = workspace.addNode("template", nodeWidth * 2.5); + var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 3.5); + + var httpinNodeAdd = workspace.addNode("httpin", 0, nodeHeight); + var functionNodeAdd = workspace.addNode("function", nodeWidth * 1.5, nodeHeight); + var changeNode = workspace.addNode("change", nodeWidth * 2.5, nodeHeight * 1.5); + + var httpinNodeClear = workspace.addNode("httpin", 0, nodeHeight * 2); + var functionNodeClear = workspace.addNode("function", nodeWidth * 1.5, nodeHeight * 2); + + httpinNodeFormat.edit(); + httpinNodeFormat.setMethod("get"); + httpinNodeFormat.setUrl("/hello-cookie"); + httpinNodeFormat.clickOk(); + + functionNodeFormat.edit(); + functionNodeFormat.setCode("msg.payload = JSON.stringify(msg.req.cookies,null,4);"); + functionNodeFormat.clickOk(); + + templateNode.edit(); + templateNode.setSyntax("mustache"); + templateNode.setFormat("handlebars"); + templateNode.setTemplate("\n\n\n

Cookies

\n

Add a cookieClear cookies

\n
{{ payload }}
\n\n"); + templateNode.clickOk(); + + httpinNodeFormat.connect(functionNodeFormat); + functionNodeFormat.connect(templateNode); + templateNode.connect(httpResponseNode); + + httpinNodeAdd.edit(); + httpinNodeAdd.setMethod("get"); + httpinNodeAdd.setUrl("/hello-cookie/add"); + httpinNodeAdd.clickOk(); + + functionNodeAdd.edit(); + functionNodeAdd.setCode("msg.cookies = { };\n msg.cookies[\"demo-\"+(Math.floor(Math.random()*1000))] = Date.now();"); + functionNodeAdd.clickOk(); + + changeNode.edit(); + changeNode.ruleSet("statusCode", "msg", "302", "num"); + changeNode.addRule(); + changeNode.ruleSet("headers", "msg", "{}", "json", "2"); + changeNode.addRule(); + changeNode.ruleSet("headers.location", "msg", httpNodeRoot + "/hello-cookie", "str", "3"); + changeNode.clickOk(); + + httpinNodeAdd.connect(functionNodeAdd); + functionNodeAdd.connect(changeNode); + changeNode.connect(httpResponseNode); + + httpinNodeClear.edit(); + httpinNodeClear.setMethod("get"); + httpinNodeClear.setUrl("/hello-cookie/clear"); + httpinNodeClear.clickOk(); + + functionNodeClear.edit(); + functionNodeClear.setCode("var cookieNames = Object.keys(msg.req.cookies).filter(function(cookieName) { return /^demo-/.test(cookieName);});\nmsg.cookies = {};\n\ncookieNames.forEach(function(cookieName) {\n msg.cookies[cookieName] = null;\n});\n\n"); + functionNodeClear.clickOk(); + + httpinNodeClear.connect(functionNodeClear); + functionNodeClear.connect(changeNode); + + workspace.deploy(); + // This case cannot be checked since http request node does not transfer cookies when redirected. + }); + }); +}); diff --git a/test/editor/specs/scenario/cookbook_uispec.js b/test/editor/specs/scenario/cookbook_uispec.js index 4079ad8d2..3c73f854b 100644 --- a/test/editor/specs/scenario/cookbook_uispec.js +++ b/test/editor/specs/scenario/cookbook_uispec.js @@ -59,7 +59,7 @@ describe('cookbook', function() { debugTab.open(); debugTab.clearMessage(); injectNode.clickLeftButton(); - debugTab.getMessage().should.be.equal('"Hello World!"'); + debugTab.getMessage().should.eql('"Hello World!"'); }); it('delete a message property', function() { @@ -79,7 +79,7 @@ describe('cookbook', function() { debugTab.open(); debugTab.clearMessage(); injectNode.clickLeftButton(); - debugTab.getMessage().should.be.equal("undefined"); + debugTab.getMessage().should.eql("undefined"); }); it('move a message property', function() { @@ -103,7 +103,7 @@ describe('cookbook', function() { debugTab.open(); debugTab.clearMessage(); injectNode.clickLeftButton(); - debugTab.getMessage().should.be.equal('"Hello"'); + debugTab.getMessage().should.eql('"Hello"'); }); it('map a property between different numeric ranges', function() { @@ -138,11 +138,11 @@ describe('cookbook', function() { debugTab.open(); debugTab.clearMessage(); injectNode1.clickLeftButton(); - debugTab.getMessage(1).should.be.equal('0'); + debugTab.getMessage(1).should.eql('0'); injectNode2.clickLeftButton(); - debugTab.getMessage(2).should.be.equal('2.5024437927663734'); + debugTab.getMessage(2).should.eql('2.5024437927663734'); injectNode3.clickLeftButton(); - debugTab.getMessage(3).should.be.equal('5'); + debugTab.getMessage(3).should.eql('5'); }); }); @@ -160,7 +160,7 @@ describe('cookbook', function() { debugTab.open(); debugTab.clearMessage(); workspace.deploy(); - debugTab.getMessage().should.be.equal('"Started!"'); + debugTab.getMessage().should.eql('"Started!"'); }); it('trigger a flow at regular intervals', function() { @@ -213,7 +213,7 @@ describe('cookbook', function() { debugTab.open(); debugTab.clearMessage(); injectNode.clickLeftButton(); - debugTab.getMessage().should.be.equal('"Node-RED"'); + debugTab.getMessage().should.eql('"Node-RED"'); }); it('set the URL of a request', function() { @@ -323,7 +323,7 @@ describe('cookbook', function() { it('get a parsed JSON response', function() { var injectNode = workspace.addNode("inject"); - var changeNode_setPost = workspace.addNode("change", nodeWidth); + var changeNodeSetPost = workspace.addNode("change", nodeWidth); var httpRequetNode = workspace.addNode("httpRequest", nodeWidth * 2); var debugNode = workspace.addNode("debug", nodeWidth * 3); @@ -331,9 +331,9 @@ describe('cookbook', function() { injectNode.setPayload("str", "json-response"); injectNode.clickOk(); - changeNode_setPost.edit(); - changeNode_setPost.ruleSet("post", "msg", "payload", "msg"); - changeNode_setPost.clickOk(); + changeNodeSetPost.edit(); + changeNodeSetPost.ruleSet("post", "msg", "payload", "msg"); + changeNodeSetPost.clickOk(); httpRequetNode.edit(); httpRequetNode.setMethod("get"); @@ -346,14 +346,14 @@ describe('cookbook', function() { debugNode.setTarget("msg", "payload.title"); debugNode.clickOk(); - injectNode.connect(changeNode_setPost); - changeNode_setPost.connect(httpRequetNode); + injectNode.connect(changeNodeSetPost); + changeNodeSetPost.connect(httpRequetNode); httpRequetNode.connect(debugNode); // The code for confirmation starts from here. var httpinNode = workspace.addNode("httpin", 0, nodeHeight); var templateNode = workspace.addNode("template", nodeWidth * 1.5, nodeHeight); - var changeNode_setHeader = workspace.addNode("change", nodeWidth * 2.5, nodeHeight); + var changeNodeSetHeader = workspace.addNode("change", nodeWidth * 2.5, nodeHeight); var httpResponseNode = workspace.addNode("httpResponse", nodeWidth * 3.5, nodeHeight); httpinNode.edit(); @@ -367,13 +367,13 @@ describe('cookbook', function() { templateNode.setTemplate("{\"title\": \"Hello\"}"); templateNode.clickOk(); - changeNode_setHeader.edit(); - changeNode_setHeader.ruleSet("headers", "msg", "{\"content-type\":\"application/json\"}", "json"); - changeNode_setHeader.clickOk(); + changeNodeSetHeader.edit(); + changeNodeSetHeader.ruleSet("headers", "msg", "{\"content-type\":\"application/json\"}", "json"); + changeNodeSetHeader.clickOk(); httpinNode.connect(templateNode); - templateNode.connect(changeNode_setHeader); - changeNode_setHeader.connect(httpResponseNode); + templateNode.connect(changeNodeSetHeader); + changeNodeSetHeader.connect(httpResponseNode); // The code for confirmation ends here. workspace.deploy(); diff --git a/test/resources/file-in-node/test.txt b/test/resources/file-in-node/test.txt new file mode 100644 index 000000000..68ca53b4d --- /dev/null +++ b/test/resources/file-in-node/test.txt @@ -0,0 +1 @@ +Text file \ No newline at end of file