From 25459b52a136f675b89e316b8966486f678001c4 Mon Sep 17 00:00:00 2001
From: Hiroyasu Nishiyama
Date: Fri, 22 Nov 2019 12:47:36 +0900
Subject: [PATCH 01/27] udate Japanese info text of mqtt
---
.../@node-red/nodes/locales/ja/network/10-mqtt.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/node_modules/@node-red/nodes/locales/ja/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/ja/network/10-mqtt.html
index 2beb49493..b30e9d7a1 100644
--- a/packages/node_modules/@node-red/nodes/locales/ja/network/10-mqtt.html
+++ b/packages/node_modules/@node-red/nodes/locales/ja/network/10-mqtt.html
@@ -38,7 +38,7 @@
入力
- payload 文字列 | バッファ
- - 多くの場合単純なテキスト形式のペイロードが使われますが、バイナリバッファを発行することも可能です。
+ - パブリッシュするペイロード。プロパティが設定されていない場合には、メッセージは送信されません。空のメッセージを送信するには、プロパティに空文字列を設定します。
- topic 文字列
- 発行対象のMQTTトピック
From e7c2ff3bd2befe64a5b457a3db0c7eaf9adecfce Mon Sep 17 00:00:00 2001
From: Hiroyasu Nishiyama
Date: Fri, 22 Nov 2019 13:01:50 +0900
Subject: [PATCH 02/27] fix typos in Japanese info text of mqtt out
---
.../@node-red/nodes/locales/ja/network/10-mqtt.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/node_modules/@node-red/nodes/locales/ja/network/10-mqtt.html b/packages/node_modules/@node-red/nodes/locales/ja/network/10-mqtt.html
index b30e9d7a1..c4a3ce0dd 100644
--- a/packages/node_modules/@node-red/nodes/locales/ja/network/10-mqtt.html
+++ b/packages/node_modules/@node-red/nodes/locales/ja/network/10-mqtt.html
@@ -38,13 +38,13 @@
入力
- payload 文字列 | バッファ
- - パブリッシュするペイロード。プロパティが設定されていない場合には、メッセージは送信されません。空のメッセージを送信するには、プロパティに空文字列を設定します。
+ - 発行するペイロード。プロパティが設定されていない場合には、メッセージは送信されません。空のメッセージを送信するには、プロパティに空文字列を設定します。
- topic 文字列
- 発行対象のMQTTトピック
- qos 数値
- - 0: 最大1度到着, 1: 一度以上到着, 2: 1度のみ到着。デフォルトは0です。
+ - 0: 最大一度到着, 1: 一度以上到着, 2: 一度のみ到着。デフォルトは0です。
- retain 真偽値
- 真の場合、メッセージをブローカに保持します。デフォルトは偽です。
From 7805974736925d5f5cfb99483ca0703ad929a8a8 Mon Sep 17 00:00:00 2001
From: Kazuhito Yokoi
Date: Mon, 25 Nov 2019 14:36:34 +0900
Subject: [PATCH 03/27] Add icons and support i18n in typedInput of JSON editor
---
.../@node-red/editor-client/src/js/ui/editors/json.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js
index 7cf1c6ec7..9ebb82b0b 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/ui/editors/json.js
@@ -301,9 +301,9 @@
var val = $('').css({width:w+"px"}).val(""+valValue).insertAfter(valueLabel).typedInput({
types:[
'str','num','bool',
- {value:"null",label:"null",hasValue:false},
- {value:"array",label:RED._("common.type.array"),hasValue:false},
- {value:"object",label:RED._("common.type.object"),hasValue:false}
+ {value:"null",label:RED._("common.type.null"),hasValue:false},
+ {value:"array",label:RED._("common.type.array"),hasValue:false,icon:"red/images/typedInput/json.png"},
+ {value:"object",label:RED._("common.type.object"),hasValue:false,icon:"red/images/typedInput/json.png"}
],
default: valType
});
From a364d4950d7fc69612331f2a523d9e5266c63b27 Mon Sep 17 00:00:00 2001
From: Kazuhito Yokoi
Date: Mon, 2 Dec 2019 12:43:13 +0900
Subject: [PATCH 04/27] Fix test cases for UI
---
test/editor/editor_helper.js | 7 +-
.../editor/pageobjects/editor/palette_page.js | 4 +-
.../pageobjects/editor/workspace_page.js | 10 +-
.../nodes/core/core/20-inject_page.js | 4 +-
.../nodes/core/core/58-debug_page.js | 2 +-
.../nodes/core/io/10-mqttconfig_page.js | 7 +-
.../nodes/core/io/21-httpin_page.js | 10 +-
.../nodes/core/logic/15-change_page.js | 4 +-
.../nodes/core/storage/50-filein_page.js | 10 +-
test/editor/pageobjects/nodes/node_page.js | 10 +-
.../pageobjects/nodes/nodefactory_page.js | 8 +-
test/editor/specs/editor/workspace_uispec.js | 2 +-
.../scenario/cookbook_endpoint_uispec.js | 170 +++++++++---------
test/editor/specs/scenario/cookbook_uispec.js | 36 ++--
test/editor/wdio.conf.js | 4 +-
15 files changed, 149 insertions(+), 139 deletions(-)
diff --git a/test/editor/editor_helper.js b/test/editor/editor_helper.js
index 8de197cef..81e3a54f5 100644
--- a/test/editor/editor_helper.js
+++ b/test/editor/editor_helper.js
@@ -52,8 +52,11 @@ function getFlowFilename() {
}
function cleanup(flowFile) {
- deleteFile(homeDir+"/"+flowFile);
- deleteFile(homeDir+"/."+flowFile+".backup");
+ var credentialFile = flowFile.replace(/\.json$/, '') + '_cred.json';
+ deleteFile(homeDir + "/" + flowFile);
+ deleteFile(homeDir + "/." + flowFile + ".backup");
+ deleteFile(homeDir + "/" + credentialFile);
+ deleteFile(homeDir + "/." + credentialFile + ".backup");
}
function deleteFile(flowFile) {
diff --git a/test/editor/pageobjects/editor/palette_page.js b/test/editor/pageobjects/editor/palette_page.js
index 878f218fb..a35859c5f 100644
--- a/test/editor/pageobjects/editor/palette_page.js
+++ b/test/editor/pageobjects/editor/palette_page.js
@@ -17,7 +17,7 @@
var idMap = {
// input
"inject": ".red-ui-palette-node[data-palette-type='inject']",
- "httpin": ".red-ui-palette-node[data-palette-type='http in']",
+ "httpIn": ".red-ui-palette-node[data-palette-type='http in']",
"mqttIn": ".red-ui-palette-node[data-palette-type='mqtt in']",
// output
"debug": ".red-ui-palette-node[data-palette-type='debug']",
@@ -32,7 +32,7 @@ var idMap = {
"html": ".red-ui-palette-node[data-palette-type='html']",
"json": ".red-ui-palette-node[data-palette-type='json']",
// storage
- "filein": ".red-ui-palette-node[data-palette-type='file in']",
+ "fileIn": ".red-ui-palette-node[data-palette-type='file in']",
};
function getId(type) {
diff --git a/test/editor/pageobjects/editor/workspace_page.js b/test/editor/pageobjects/editor/workspace_page.js
index 18e50dcf2..560a0992f 100644
--- a/test/editor/pageobjects/editor/workspace_page.js
+++ b/test/editor/pageobjects/editor/workspace_page.js
@@ -14,7 +14,7 @@
* limitations under the License.
**/
- var when = require("when");
+var when = require("when");
var events = require("nr-test-utils").require("@node-red/runtime/lib/events.js");
@@ -44,6 +44,7 @@ function addNode(type, x, y) {
previousY = previousY + flowLayout.heightInterval;
}
}
+ browser.waitForVisible(palette.getId(type));
browser.moveToObject(palette.getId(type));
browser.buttonDown();
browser.moveToObject("#red-ui-palette-search", previousX + 300, previousY + 100); // adjust to the top-left corner of workspace.
@@ -56,7 +57,12 @@ function addNode(type, x, y) {
}
function deleteAllNodes() {
- browser.click('.red-ui-workspace-chart-event-layer');
+ browser.waitForVisible('.red-ui-workspace-chart-event-layer');
+ try {
+ browser.click('.red-ui-workspace-chart-event-layer');
+ } catch (e) {
+ console.log(e);
+ }
browser.keys(['Control', 'a', 'a', 'Control']); // call twice to release the keys.
browser.keys(['Delete']);
}
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 82a4e6d6e..38e6e32ed 100644
--- a/test/editor/pageobjects/nodes/core/core/20-inject_page.js
+++ b/test/editor/pageobjects/nodes/core/core/20-inject_page.js
@@ -47,11 +47,11 @@ injectNode.prototype.setPayload = function(payloadType, payload) {
// 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[' + payloadTypeList[payloadType] + ']';
+ var payloadTypeXPath = '//*[contains(@class, "red-ui-typedInput-options")]/a[' + payloadTypeList[payloadType] + ']';
browser.clickWithWait(payloadTypeXPath);
if (payload) {
// Input a value.
- browser.setValue('//*[@class="red-ui-typedInput-input"]/input', payload);
+ browser.setValue('//*[contains(@class, "red-ui-typedInput-input")]/input', payload);
}
}
diff --git a/test/editor/pageobjects/nodes/core/core/58-debug_page.js b/test/editor/pageobjects/nodes/core/core/58-debug_page.js
index 2b1eabe64..52cb60f44 100644
--- a/test/editor/pageobjects/nodes/core/core/58-debug_page.js
+++ b/test/editor/pageobjects/nodes/core/core/58-debug_page.js
@@ -31,7 +31,7 @@ debugNode.prototype.setOutput = function(complete) {
browser.clickWithWait('//*[contains(@class, "red-ui-typedInput-container")]/button');
if (complete !== 'true') {
// Select the "msg" type.
- browser.clickWithWait('//div[@class="red-ui-typedInput-options"][1]/a[1]');
+ browser.clickWithWait('//div[contains(@class, "red-ui-typedInput-options")][1]/a[1]');
// Input the path in msg.
browser.clickWithWait('//*[contains(@class, "red-ui-typedInput-input")]/input');
browser.keys(keyPage.selectAll());
diff --git a/test/editor/pageobjects/nodes/core/io/10-mqttconfig_page.js b/test/editor/pageobjects/nodes/core/io/10-mqttconfig_page.js
index 69266f9e8..3266a1bd3 100644
--- a/test/editor/pageobjects/nodes/core/io/10-mqttconfig_page.js
+++ b/test/editor/pageobjects/nodes/core/io/10-mqttconfig_page.js
@@ -23,13 +23,14 @@ function setServer(broker, port) {
function clickOk() {
browser.clickWithWait('#node-config-dialog-ok');
// Wait until an config dialog closes.
- browser.waitForVisible('#node-config-dialog-ok', 2000, true);
+ browser.waitForVisible('#node-config-dialog-ok', 4000, true);
}
function edit() {
- browser.clickWithWait('#node-input-lookup-broker');
+ browser.waitForVisible('#node-input-lookup-broker');
+ browser.click('#node-input-lookup-broker');
// Wait until a config dialog opens.
- browser.waitForVisible('#node-config-dialog-ok', 2000);
+ browser.waitForVisible('#node-config-dialog-ok', 4000);
}
module.exports = {
diff --git a/test/editor/pageobjects/nodes/core/io/21-httpin_page.js b/test/editor/pageobjects/nodes/core/io/21-httpin_page.js
index 97648f395..9454ef034 100644
--- a/test/editor/pageobjects/nodes/core/io/21-httpin_page.js
+++ b/test/editor/pageobjects/nodes/core/io/21-httpin_page.js
@@ -18,18 +18,18 @@ var util = require("util");
var nodePage = require("../../node_page");
-function httpinNode(id) {
+function httpInNode(id) {
nodePage.call(this, id);
}
-util.inherits(httpinNode, nodePage);
+util.inherits(httpInNode, nodePage);
-httpinNode.prototype.setMethod = function(method) {
+httpInNode.prototype.setMethod = function(method) {
browser.selectWithWait('#node-input-method', method);
}
-httpinNode.prototype.setUrl = function(url) {
+httpInNode.prototype.setUrl = function(url) {
browser.setValue('#node-input-url', url);
}
-module.exports = httpinNode;
+module.exports = httpInNode;
diff --git a/test/editor/pageobjects/nodes/core/logic/15-change_page.js b/test/editor/pageobjects/nodes/core/logic/15-change_page.js
index 51589f7b5..82441c9bc 100644
--- a/test/editor/pageobjects/nodes/core/logic/15-change_page.js
+++ b/test/editor/pageobjects/nodes/core/logic/15-change_page.js
@@ -55,7 +55,7 @@ changeNode.prototype.ruleSet = function(p, pt, to, tot, index) {
if (pt) {
browser.clickWithWait('//*[@id="node-input-rule-container"]/li[' + index + ']/div/div[1]/div/button[1]');
var num = 5 * (index - 1) + 1;
- var ptXPath = '//div[@class="red-ui-typedInput-options"][' + num + ']/a[' + ptType[pt] + ']';
+ var ptXPath = '//div[contains(@class, "red-ui-typedInput-options")][' + num + ']/a[' + ptType[pt] + ']';
browser.clickWithWait(ptXPath);
}
if (p) {
@@ -64,7 +64,7 @@ changeNode.prototype.ruleSet = function(p, pt, to, tot, index) {
if (tot) {
browser.clickWithWait('//*[@id="node-input-rule-container"]/li[' + index + ']/div/div[2]/div[2]/button[1]');
var num = 5 * (index - 1) + 2;
- var totXPath = '//div[@class="red-ui-typedInput-options"][' + num + ']/a[' + totType[tot] + ']';
+ var totXPath = '//div[contains(@class, "red-ui-typedInput-options")][' + num + ']/a[' + totType[tot] + ']';
browser.clickWithWait(totXPath);
}
if (to) {
diff --git a/test/editor/pageobjects/nodes/core/storage/50-filein_page.js b/test/editor/pageobjects/nodes/core/storage/50-filein_page.js
index 5a327f14c..942ea63d8 100644
--- a/test/editor/pageobjects/nodes/core/storage/50-filein_page.js
+++ b/test/editor/pageobjects/nodes/core/storage/50-filein_page.js
@@ -18,11 +18,11 @@ var util = require("util");
var nodePage = require("../../node_page");
-function fileinNode(id) {
+function fileInNode(id) {
nodePage.call(this, id);
}
-util.inherits(fileinNode, nodePage);
+util.inherits(fileInNode, nodePage);
var formatType = {
"utf8": 1,
@@ -31,14 +31,14 @@ var formatType = {
"stream": 4
};
-fileinNode.prototype.setFilename = function(filename) {
+fileInNode.prototype.setFilename = function(filename) {
browser.setValue('#node-input-filename', filename);
}
-fileinNode.prototype.setOutput = function(format) {
+fileInNode.prototype.setOutput = function(format) {
browser.clickWithWait('#node-input-format');
var formatTypeXPath = '//*[@id="node-input-format"]/option[' + formatType[format] + ']';
browser.clickWithWait(formatTypeXPath);
}
-module.exports = fileinNode;
+module.exports = fileInNode;
diff --git a/test/editor/pageobjects/nodes/node_page.js b/test/editor/pageobjects/nodes/node_page.js
index a093a2335..5234362ae 100644
--- a/test/editor/pageobjects/nodes/node_page.js
+++ b/test/editor/pageobjects/nodes/node_page.js
@@ -22,13 +22,13 @@ Node.prototype.edit = function() {
browser.clickWithWait(this.id);
browser.clickWithWait(this.id);
// Wait until an edit dialog opens.
- browser.waitForVisible('#node-dialog-ok', 2000);
+ browser.waitForVisible('#node-dialog-ok', 4000);
}
Node.prototype.clickOk = function() {
browser.clickWithWait('#node-dialog-ok');
// Wait untile an edit dialog closes.
- browser.waitForVisible('#node-dialog-ok', 2000, true);
+ browser.waitForVisible('#node-dialog-ok', 4000, true);
browser.pause(50);
}
@@ -38,8 +38,10 @@ Node.prototype.connect = function(targetNode) {
browser.dragAndDrop(outputPort, inputPort)
}
-Node.prototype.clickLeftButton = function() {
- browser.clickWithWait(this.id + '/*[@class="red-ui-flow-node-button"]');
+Node.prototype.clickLeftButton = function () {
+ browser.moveToObject(this.id + '/*[@class="red-ui-flow-node-button"]');
+ browser.buttonDown();
+ browser.buttonUp();
}
module.exports = Node;
diff --git a/test/editor/pageobjects/nodes/nodefactory_page.js b/test/editor/pageobjects/nodes/nodefactory_page.js
index 8cb364ad1..c518d89ff 100644
--- a/test/editor/pageobjects/nodes/nodefactory_page.js
+++ b/test/editor/pageobjects/nodes/nodefactory_page.js
@@ -20,20 +20,20 @@ var templateNode = require('./core/core/80-template_page');
var functionNode = require('./core/core/80-function_page');
var mqttInNode = require('./core/io/10-mqttin_page');
var mqttOutNode = require('./core/io/10-mqttout_page');
-var httpinNode = require('./core/io/21-httpin_page');
+var httpInNode = require('./core/io/21-httpin_page');
var httpResponseNode = require('./core/io/21-httpresponse_page');
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 jsonNode = require('./core/parsers/70-JSON_page');
-var fileinNode = require('./core/storage/50-filein_page');
+var fileInNode = require('./core/storage/50-filein_page');
var nodeCatalog = {
// input
"inject": injectNode,
- "httpin": httpinNode,
+ "httpIn": httpInNode,
"mqttIn":mqttInNode,
// output
"debug": debugNode,
@@ -48,7 +48,7 @@ var nodeCatalog = {
"html": htmlNode,
"json":jsonNode,
// storage
- "filein": fileinNode,
+ "fileIn": fileInNode,
}
function create(type, id) {
diff --git a/test/editor/specs/editor/workspace_uispec.js b/test/editor/specs/editor/workspace_uispec.js
index fb6c02b9a..15de1a044 100644
--- a/test/editor/specs/editor/workspace_uispec.js
+++ b/test/editor/specs/editor/workspace_uispec.js
@@ -37,7 +37,7 @@ describe('Workspace', function() {
});
it('should have a right title', function () {
- browser.getTitle().should.equal('Node-RED');
+ browser.getTitle().should.startWith('Node-RED');
});
it('should output a timestamp', function() {
diff --git a/test/editor/specs/scenario/cookbook_endpoint_uispec.js b/test/editor/specs/scenario/cookbook_endpoint_uispec.js
index 95b78d03c..9a2ed0710 100644
--- a/test/editor/specs/scenario/cookbook_endpoint_uispec.js
+++ b/test/editor/specs/scenario/cookbook_endpoint_uispec.js
@@ -38,14 +38,14 @@ describe('cookbook', function() {
describe('HTTP endpoints', function () {
it('create an HTTP endpoint', function () {
- var httpinNode = workspace.addNode("httpin");
+ var httpInNode = workspace.addNode("httpIn");
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/hello");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/hello");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -53,7 +53,7 @@ describe('cookbook', function() {
templateNode.setTemplate("\n\n\nHello World!
\n\n");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation starts from here.
@@ -77,14 +77,14 @@ describe('cookbook', function() {
});
it('handle query parameters passed to an HTTP endpoint', function () {
- var httpinNode = workspace.addNode("httpin");
+ var httpInNode = workspace.addNode("httpIn");
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/hello-query");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/hello-query");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -92,7 +92,7 @@ describe('cookbook', function() {
templateNode.setTemplate("\n\n\nHello {{req.query.name}}!
\n\n");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation starts from here.
@@ -116,14 +116,14 @@ describe('cookbook', function() {
});
it('handle url parameters in an HTTP endpoint', function () {
- var httpinNode = workspace.addNode("httpin");
+ var httpInNode = workspace.addNode("httpIn");
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/hello-param/:name");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/hello-param/:name");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -131,7 +131,7 @@ describe('cookbook', function() {
templateNode.setTemplate("\n\n\nHello {{req.params.name}}!
\n\n");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation starts from here.
@@ -155,14 +155,14 @@ describe('cookbook', function() {
});
it('access HTTP request headers', function () {
- var httpinNode = workspace.addNode("httpin");
+ var httpInNode = workspace.addNode("httpIn");
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/hello-headers");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/hello-headers");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -170,7 +170,7 @@ describe('cookbook', function() {
templateNode.setTemplate("\n\n\nUser agent: {{req.headers.user-agent}}
\n\n");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation starts from here.
@@ -203,7 +203,7 @@ describe('cookbook', function() {
var injectNodeTimestamp = workspace.addNode("inject");
var changeNodeStore = workspace.addNode("change");
- var httpinNode = workspace.addNode("httpin", 0, 100);
+ var httpInNode = workspace.addNode("httpIn", 0, 100);
var changeNodeCopy = workspace.addNode("change");
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
@@ -218,10 +218,10 @@ describe('cookbook', function() {
injectNodeTimestamp.connect(changeNodeStore);
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/hello-data");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/hello-data");
+ httpInNode.clickOk();
changeNodeCopy.edit();
changeNodeCopy.ruleSet("timestamp", "msg", "timestamp", "flow");
@@ -233,7 +233,7 @@ describe('cookbook', function() {
templateNode.setTemplate("\n\n\nTime: {{ timestamp }}
\n\n");
templateNode.clickOk();
- httpinNode.connect(changeNodeCopy);
+ httpInNode.connect(changeNodeCopy);
changeNodeCopy.connect(templateNode);
templateNode.connect(httpResponseNode);
@@ -260,15 +260,15 @@ describe('cookbook', function() {
});
it('serve JSON content', function () {
- var httpinNode = workspace.addNode("httpin");
+ var httpInNode = workspace.addNode("httpIn");
var templateNode = workspace.addNode("template");
var changeNode = workspace.addNode("change");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/hello-json");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/hello-json");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -282,7 +282,7 @@ describe('cookbook', function() {
changeNode.ruleSet("headers.content-type", "msg", "application/json", "str", "2");
changeNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(changeNode);
changeNode.connect(httpResponseNode);
@@ -314,20 +314,20 @@ describe('cookbook', function() {
});
it('serve a local file', function () {
- var httpinNode = workspace.addNode("httpin");
- var fileinNode = workspace.addNode("filein");
+ var httpInNode = workspace.addNode("httpIn");
+ var fileInNode = workspace.addNode("fileIn");
var changeNode = workspace.addNode("change", 200, 100);
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/hello-file");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/hello-file");
+ httpInNode.clickOk();
- fileinNode.edit();
- fileinNode.setFilename("test/resources/file-in-node/test.txt");
- fileinNode.setOutput("");
- fileinNode.clickOk();
+ fileInNode.edit();
+ fileInNode.setFilename("test/resources/file-in-node/test.txt");
+ fileInNode.setOutput("");
+ fileInNode.clickOk();
changeNode.edit();
changeNode.ruleSet("headers", "msg", "{}", "json");
@@ -335,8 +335,8 @@ describe('cookbook', function() {
changeNode.ruleSet("headers.content-type", "msg", "text/plain", "str", "2");
changeNode.clickOk();
- httpinNode.connect(fileinNode);
- fileinNode.connect(changeNode);
+ httpInNode.connect(fileInNode);
+ fileInNode.connect(changeNode);
changeNode.connect(httpResponseNode);
// The code for confirmation starts from here.
@@ -360,14 +360,14 @@ describe('cookbook', function() {
});
it('post raw data to a flow', function() {
- var httpinNode = workspace.addNode("httpin");
+ var httpInNode = workspace.addNode("httpIn");
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("post");
- httpinNode.setUrl("/hello-raw");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("post");
+ httpInNode.setUrl("/hello-raw");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -375,7 +375,7 @@ describe('cookbook', function() {
templateNode.setTemplate("\n\n\nHello {{ payload }}!
\n\n");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation starts from here.
@@ -403,14 +403,14 @@ describe('cookbook', function() {
});
it('post form data to a flow', function () {
- var httpinNode = workspace.addNode("httpin");
+ var httpInNode = workspace.addNode("httpIn");
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("post");
- httpinNode.setUrl("/hello-form");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("post");
+ httpInNode.setUrl("/hello-form");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -418,7 +418,7 @@ describe('cookbook', function() {
templateNode.setTemplate("\n\n\nHello {{ payload.name }}!
\n\n");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation starts from here.
@@ -452,14 +452,14 @@ describe('cookbook', function() {
});
it('post JSON data to a flow', function() {
- var httpinNode = workspace.addNode("httpin");
+ var httpInNode = workspace.addNode("httpIn");
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("post");
- httpinNode.setUrl("/hello-json");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("post");
+ httpInNode.setUrl("/hello-json");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -467,7 +467,7 @@ describe('cookbook', function() {
templateNode.setTemplate("\n\n\nHello {{ payload.name }}!
\n\n");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation starts from here.
@@ -501,24 +501,22 @@ describe('cookbook', function() {
});
it('work with cookies', function () {
- this.timeout(60000);
-
- var httpinNodeFormat = workspace.addNode("httpin");
+ var httpInNodeFormat = workspace.addNode("httpIn");
var functionNodeFormat = workspace.addNode("function", 240);
var templateNode = workspace.addNode("template", 400);
var httpResponseNode = workspace.addNode("httpResponse", 600);
- var httpinNodeAdd = workspace.addNode("httpin", 0, 100);
+ var httpInNodeAdd = workspace.addNode("httpIn", 0, 100);
var functionNodeAdd = workspace.addNode("function", 240);
var changeNode = workspace.addNode("change", 400);
- var httpinNodeClear = workspace.addNode("httpin", 0, 200);
+ var httpInNodeClear = workspace.addNode("httpIn", 0, 200);
var functionNodeClear = workspace.addNode("function", 250);
- httpinNodeFormat.edit();
- httpinNodeFormat.setMethod("get");
- httpinNodeFormat.setUrl("/hello-cookie");
- httpinNodeFormat.clickOk();
+ httpInNodeFormat.edit();
+ httpInNodeFormat.setMethod("get");
+ httpInNodeFormat.setUrl("/hello-cookie");
+ httpInNodeFormat.clickOk();
functionNodeFormat.edit();
functionNodeFormat.setFunction("msg.payload = JSON.stringify(msg.req.cookies,null,4);\nreturn msg;");
@@ -530,14 +528,14 @@ describe('cookbook', function() {
templateNode.setTemplate('\n\n\nCookies
\nAdd a cookie • Clear cookies
\n{{ payload }}
\n\n');
templateNode.clickOk();
- httpinNodeFormat.connect(functionNodeFormat);
+ httpInNodeFormat.connect(functionNodeFormat);
functionNodeFormat.connect(templateNode);
templateNode.connect(httpResponseNode);
- httpinNodeAdd.edit();
- httpinNodeAdd.setMethod("get");
- httpinNodeAdd.setUrl("/hello-cookie/add");
- httpinNodeAdd.clickOk();
+ httpInNodeAdd.edit();
+ httpInNodeAdd.setMethod("get");
+ httpInNodeAdd.setUrl("/hello-cookie/add");
+ httpInNodeAdd.clickOk();
functionNodeAdd.edit();
functionNodeAdd.setFunction('msg.cookies = { };\n msg.cookies["demo-"+(Math.floor(Math.random()*1000))] = Date.now();\nreturn msg;');
@@ -551,20 +549,20 @@ describe('cookbook', function() {
changeNode.ruleSet("headers.location", "msg", httpNodeRoot + "/hello-cookie", "str", "3");
changeNode.clickOk();
- httpinNodeAdd.connect(functionNodeAdd);
+ httpInNodeAdd.connect(functionNodeAdd);
functionNodeAdd.connect(changeNode);
changeNode.connect(httpResponseNode);
- httpinNodeClear.edit();
- httpinNodeClear.setMethod("get");
- httpinNodeClear.setUrl("/hello-cookie/clear");
- httpinNodeClear.clickOk();
+ httpInNodeClear.edit();
+ httpInNodeClear.setMethod("get");
+ httpInNodeClear.setUrl("/hello-cookie/clear");
+ httpInNodeClear.clickOk();
functionNodeClear.edit();
functionNodeClear.setFunction("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});\nreturn msg;\n");
functionNodeClear.clickOk();
- httpinNodeClear.connect(functionNodeClear);
+ httpInNodeClear.connect(functionNodeClear);
functionNodeClear.connect(changeNode);
workspace.deploy();
diff --git a/test/editor/specs/scenario/cookbook_uispec.js b/test/editor/specs/scenario/cookbook_uispec.js
index f14f02469..8619ddb0d 100644
--- a/test/editor/specs/scenario/cookbook_uispec.js
+++ b/test/editor/specs/scenario/cookbook_uispec.js
@@ -284,14 +284,14 @@ describe('cookbook', function() {
httpRequetNode.connect(debugNode);
// The code for confirmation starts from here.
- var httpinNode = workspace.addNode("httpin", 0, 200);
+ var httpInNode = workspace.addNode("httpIn", 0, 200);
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/set-query");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/set-query");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -299,7 +299,7 @@ describe('cookbook', function() {
templateNode.setTemplate("Hello {{req.query.q}}");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation ends here.
@@ -339,15 +339,15 @@ describe('cookbook', function() {
httpRequetNode.connect(debugNode);
// The code for confirmation starts from here.
- var httpinNode = workspace.addNode("httpin", 0, 200);
+ var httpInNode = workspace.addNode("httpIn", 0, 200);
var templateNode = workspace.addNode("template");
var changeNodeSetHeader = workspace.addNode("change");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("get");
- httpinNode.setUrl("/json-response");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("get");
+ httpInNode.setUrl("/json-response");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -359,7 +359,7 @@ describe('cookbook', function() {
changeNodeSetHeader.ruleSet("headers", "msg", '{"content-type":"application/json"}', "json");
changeNodeSetHeader.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(changeNodeSetHeader);
changeNodeSetHeader.connect(httpResponseNode);
// The code for confirmation ends here.
@@ -413,14 +413,14 @@ describe('cookbook', function() {
httpRequetNode.connect(debugNode);
// The code for confirmation starts from here.
- var httpinNode = workspace.addNode("httpin", 0, 200);
+ var httpInNode = workspace.addNode("httpIn", 0, 200);
var templateNode = workspace.addNode("template");
var httpResponseNode = workspace.addNode("httpResponse");
- httpinNode.edit();
- httpinNode.setMethod("post");
- httpinNode.setUrl("/set-header");
- httpinNode.clickOk();
+ httpInNode.edit();
+ httpInNode.setMethod("post");
+ httpInNode.setUrl("/set-header");
+ httpInNode.clickOk();
templateNode.edit();
templateNode.setSyntax("mustache");
@@ -428,7 +428,7 @@ describe('cookbook', function() {
templateNode.setTemplate("{{ payload }}");
templateNode.clickOk();
- httpinNode.connect(templateNode);
+ httpInNode.connect(templateNode);
templateNode.connect(httpResponseNode);
// The code for confirmation ends here.
diff --git a/test/editor/wdio.conf.js b/test/editor/wdio.conf.js
index 37426cf14..26d30570f 100644
--- a/test/editor/wdio.conf.js
+++ b/test/editor/wdio.conf.js
@@ -64,9 +64,9 @@ exports.config = {
'goog:chromeOptions': {
args: process.env.NODE_RED_NON_HEADLESS
// Runs tests with opening a browser.
- ? ['--disable-gpu']
+ ? ['--disable-gpu', '--no-sandbox']
// Runs tests without opening a browser.
- : ['--headless', '--disable-gpu', 'window-size=1920,1080']
+ : ['--headless', '--disable-gpu', 'window-size=1920,1080', '--no-sandbox']
},
}],
//
From b22a4f94abd7f059c4c0e2294bd5f79625ef11e8 Mon Sep 17 00:00:00 2001
From: Yukio Onozuka
Date: Fri, 13 Dec 2019 07:52:34 +0900
Subject: [PATCH 05/27] when call event. remove runtime event.
---
test/editor/pageobjects/editor/workspace_page.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/test/editor/pageobjects/editor/workspace_page.js b/test/editor/pageobjects/editor/workspace_page.js
index 560a0992f..75dfff9cb 100644
--- a/test/editor/pageobjects/editor/workspace_page.js
+++ b/test/editor/pageobjects/editor/workspace_page.js
@@ -72,6 +72,7 @@ function deploy() {
return when.promise(function(resolve, reject) {
events.on("runtime-event", function(event) {
if (event.id === 'runtime-deploy') {
+ events.removeListener("runtime-event", arguments.callee);
resolve();
}
});
From 9cbd0fceeafb7aee60498f39aec025b9f9bdf14c Mon Sep 17 00:00:00 2001
From: Kazuhito Yokoi
Date: Tue, 17 Dec 2019 21:00:50 +0900
Subject: [PATCH 06/27] Fix IME bug in text editor
---
.../node_modules/@node-red/editor-client/src/sass/forms.scss | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/packages/node_modules/@node-red/editor-client/src/sass/forms.scss b/packages/node_modules/@node-red/editor-client/src/sass/forms.scss
index 8b08d8996..db2ecd7a5 100644
--- a/packages/node_modules/@node-red/editor-client/src/sass/forms.scss
+++ b/packages/node_modules/@node-red/editor-client/src/sass/forms.scss
@@ -78,7 +78,8 @@
}
textarea {
- overflow: auto;
+ overflow: hidden;
+ padding: 0px 1px !important;
vertical-align: top;
}
From 9c1d46ff92c61103f5a773a726928e7f20126ad3 Mon Sep 17 00:00:00 2001
From: Dave Conway-Jones
Date: Thu, 26 Dec 2019 16:53:13 +0000
Subject: [PATCH 07/27] Make node highlighting a bit more obvious for busy
flows
---
.../node_modules/@node-red/editor-client/src/sass/flow.scss | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/node_modules/@node-red/editor-client/src/sass/flow.scss b/packages/node_modules/@node-red/editor-client/src/sass/flow.scss
index 4aae0869c..d92d1e964 100644
--- a/packages/node_modules/@node-red/editor-client/src/sass/flow.scss
+++ b/packages/node_modules/@node-red/editor-client/src/sass/flow.scss
@@ -145,8 +145,8 @@ g.red-ui-flow-node-selected {
border-color: $node-selected-color !important;
border-style: dashed !important;
stroke: $node-selected-color;
- stroke-width: 2;
- stroke-dasharray: 8, 3;
+ stroke-width: 3;
+ stroke-dasharray: 8, 4;
}
.red-ui-flow-subflow .red-ui-flow-node {
From 902f477ee35eea24c2878526ad88eb603b263801 Mon Sep 17 00:00:00 2001
From: Dave Conway-Jones
Date: Mon, 30 Dec 2019 15:46:08 +0000
Subject: [PATCH 08/27] Bump included nodes versions to mathc latest
rbe, tail (and sentiment).
To close #2415
---
package.json | 6 +++---
packages/node_modules/node-red/package.json | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package.json b/package.json
index b0b30df07..9aaeb8f9e 100644
--- a/package.json
+++ b/package.json
@@ -54,9 +54,9 @@
"mqtt": "2.18.8",
"multer": "1.4.2",
"mustache": "3.0.2",
- "node-red-node-rbe": "^0.2.5",
- "node-red-node-sentiment": "^0.1.4",
- "node-red-node-tail": "^0.0.3",
+ "node-red-node-rbe": "^0.2.6",
+ "node-red-node-sentiment": "^0.1.6",
+ "node-red-node-tail": "^0.1.0",
"nopt": "4.0.1",
"oauth2orize": "1.11.0",
"on-headers": "1.0.2",
diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json
index 46f064b24..618480400 100644
--- a/packages/node_modules/node-red/package.json
+++ b/packages/node_modules/node-red/package.json
@@ -39,8 +39,8 @@
"bcryptjs": "2.4.3",
"express": "4.17.1",
"fs-extra": "8.1.0",
- "node-red-node-rbe": "^0.2.5",
- "node-red-node-tail": "^0.0.3",
+ "node-red-node-rbe": "^0.2.6",
+ "node-red-node-tail": "^0.1.0",
"nopt": "4.0.1",
"semver": "6.3.0"
},
From 1ee43113b156b7cf87a84b5d3e6c3066e233d51b Mon Sep 17 00:00:00 2001
From: Hiroyasu Nishiyama
Date: Tue, 31 Dec 2019 20:22:13 +0900
Subject: [PATCH 09/27] remove undefined loadFlowLibrary call
---
packages/node_modules/@node-red/editor-client/src/js/red.js | 2 --
1 file changed, 2 deletions(-)
diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js
index 78f82e507..a742577d7 100644
--- a/packages/node_modules/@node-red/editor-client/src/js/red.js
+++ b/packages/node_modules/@node-red/editor-client/src/js/red.js
@@ -418,8 +418,6 @@ var RED = (function() {
RED.notify(RED._("palette.event.nodeUpgraded", {module:msg.module,version:msg.version}),"success");
RED.nodes.registry.setModulePendingUpdated(msg.module,msg.version);
}
- // Refresh flow library to ensure any examples are updated
- RED.library.loadFlowLibrary();
});
RED.comms.subscribe("event-log/#", function(topic,payload) {
var id = topic.substring(9);
From 9c4640e010e8d7644e010292e12fbab6564efe8c Mon Sep 17 00:00:00 2001
From: Dave Conway-Jones
Date: Wed, 1 Jan 2020 21:32:56 +0000
Subject: [PATCH 10/27] Make min-height for change, switch, batch and mqtt
consistent
to allow fit to smaller screens before scrolling
(to fix comment from forum)
---
.../@node-red/nodes/core/function/10-switch.html | 5 +++--
.../@node-red/nodes/core/function/15-change.html | 6 +++---
.../node_modules/@node-red/nodes/core/network/10-mqtt.html | 4 ++--
.../@node-red/nodes/core/sequence/19-batch.html | 4 ++--
4 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/packages/node_modules/@node-red/nodes/core/function/10-switch.html b/packages/node_modules/@node-red/nodes/core/function/10-switch.html
index 9f072ad8a..6524a1030 100644
--- a/packages/node_modules/@node-red/nodes/core/function/10-switch.html
+++ b/packages/node_modules/@node-red/nodes/core/function/10-switch.html
@@ -14,7 +14,7 @@
limitations under the License.
-->
-
-