node-red/test/editor/specs/scenario/cookbook_mqtt_uispec.js

225 lines
7.0 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";
var mqttServer;
var mosca = require('mosca');
var moscaSettings = {
port: parseInt(Math.random() * 16383 + 49152),
persistence: {
// Needs for retaining messages.
factory: mosca.persistence.Memory
}
};
// https://cookbook.nodered.org/
describe('cookbook', function () {
beforeEach(function () {
workspace.init();
});
before(function () {
browser.call(function () {
return new Promise(function (resolve, reject) {
mqttServer = new mosca.Server(moscaSettings, function (err) {
if (err) {
reject(err);
} else {
resolve();
}
});
});
});
helper.startServer();
});
after(function () {
browser.call(function () {
return new Promise(function (resolve, reject) {
mqttServer.close(function () {
resolve();
});
});
});
helper.stopServer();
});
describe('MQTT', function () {
it('Add an MQTT broker to prepare for UI test', function () {
var mqttOutNode = workspace.addNode("mqttOut");
mqttOutNode.edit();
mqttOutNode.mqttBrokerNode.edit();
mqttOutNode.mqttBrokerNode.setServer("localhost", moscaSettings.port);
mqttOutNode.mqttBrokerNode.clickOk();
mqttOutNode.clickOk();
workspace.deploy();
});
it('Connect to an MQTT broker', function () {
var injectNode = workspace.addNode("inject");
var mqttOutNode = workspace.addNode("mqttOut");
var mqttInNode = workspace.addNode("mqttIn", 0, 100);
var debugNode = workspace.addNode("debug");
injectNode.edit();
injectNode.setPayload("num", 22);
injectNode.clickOk();
mqttOutNode.edit();
mqttOutNode.setTopic("sensors/livingroom/temp");
mqttOutNode.clickOk();
injectNode.connect(mqttOutNode);
mqttInNode.edit();
mqttInNode.setTopic("sensors/livingroom/temp");
mqttInNode.setQoS("2");
mqttInNode.clickOk();
mqttInNode.connect(debugNode);
workspace.deploy();
debugTab.open();
injectNode.clickLeftButton();
debugTab.getMessage().should.eql('"22"');
});
// skip this case since it is same as other cases.
it.skip('Publish messages to a topic');
it('Set the topic of a published message', function () {
var injectNode = workspace.addNode("inject");
var mqttOutNode = workspace.addNode("mqttOut");
injectNode.edit();
injectNode.setPayload("num", 22);
injectNode.setTopic("sensors/kitchen/temperature");
injectNode.clickOk();
mqttOutNode.edit();
mqttOutNode.clickOk();
injectNode.connect(mqttOutNode);
// The code for confirmation starts from here.
var mqttInNode = workspace.addNode("mqttIn", 0, 100);
var debugNode = workspace.addNode("debug");
mqttInNode.edit();
mqttInNode.setTopic("sensors/kitchen/temperature");
mqttInNode.clickOk();
mqttInNode.connect(debugNode);
// The code for confirmation ends here.
workspace.deploy();
debugTab.open();
injectNode.clickLeftButton();
debugTab.getMessage().should.eql('"22"');
});
it('Publish a retained message to a topic', function () {
var injectNode = workspace.addNode("inject");
var mqttOutNode = workspace.addNode("mqttOut");
injectNode.edit();
injectNode.setPayload("num", 22);
injectNode.clickOk();
mqttOutNode.edit();
mqttOutNode.setTopic("sensors/livingroom/temp");
mqttOutNode.setRetain("true");
mqttOutNode.clickOk();
injectNode.connect(mqttOutNode);
workspace.deploy();
debugTab.open();
injectNode.clickLeftButton();
// The code for confirmation starts from here.
var mqttInNode = workspace.addNode("mqttIn", 0, 100);
var debugNode = workspace.addNode("debug");
mqttInNode.edit();
mqttInNode.setTopic("sensors/livingroom/temp");
mqttInNode.clickOk();
mqttInNode.connect(debugNode);
// The code for confirmation ends here.
workspace.deploy();
debugTab.open(true);
debugTab.getMessage().should.eql('"22"');
});
// skip this case since it is same as other cases.
it.skip('Subscribe to a topic');
it('Receive a parsed JSON message', function () {
var injectNode = workspace.addNode("inject");
var mqttOutNode = workspace.addNode("mqttOut");
var mqttInNode = workspace.addNode("mqttIn", 0, 100);
var jsonNode = workspace.addNode("json");
var debugNode = workspace.addNode("debug");
injectNode.edit();
injectNode.setPayload("json", '{"sensor_id": 1234, "temperature": 13 }');
injectNode.clickOk();
mqttOutNode.edit();
mqttOutNode.setTopic("sensors/livingroom/temp");
mqttOutNode.clickOk();
injectNode.connect(mqttOutNode);
mqttInNode.edit();
mqttInNode.setTopic("sensors/#");
mqttInNode.setQoS("2");
mqttInNode.clickOk();
jsonNode.edit();
jsonNode.setProperty("payload");
jsonNode.clickOk();
mqttInNode.connect(jsonNode);
jsonNode.connect(debugNode);
workspace.deploy();
debugTab.open();
injectNode.clickLeftButton();
debugTab.getMessage().should.eql(['1234', '13']);
});
});
});