/** * 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 mqttConfig = require('../../pageobjects/nodes/core/io/10-mqttconfig_page.js'); var nodeWidth = 200; var nodeHeight = 100; var httpNodeRoot = "/api"; var mqttServer; var mosca = require('mosca'); var moscaSettings = { port: 1883, persistence: { // Needs for retaining messages. factory: mosca.persistence.Memory } }; // https://cookbook.nodered.org/ describe('cookbook', function() { beforeEach(function() { workspace.deleteAllNodes(); }); before(function() { browser.call(function() { return new Promise(function(resolve, reject) { mqttServer = new mosca.Server(moscaSettings, function() { 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", nodeWidth); mqttOutNode.edit(); mqttConfig.edit(); mqttConfig.setServer("localhost"); mqttConfig.clickOk(); mqttOutNode.clickOk(); workspace.deploy(); }); it('Connect to an MQTT broker', function() { var injectNode = workspace.addNode("inject"); var mqttOutNode = workspace.addNode("mqttOut", nodeWidth); var mqttInNode = workspace.addNode("mqttIn", 0, nodeHeight); var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); 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(); debugTab.clearMessage(); 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", nodeWidth * 2); 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, nodeHeight); var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); mqttInNode.edit(); mqttInNode.setTopic("sensors/kitchen/temperature"); mqttInNode.clickOk(); mqttInNode.connect(debugNode); // The code for confirmation ends here. workspace.deploy(); debugTab.open(); debugTab.clearMessage(); 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", nodeWidth); 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(); debugTab.clearMessage(); // The code for confirmation starts from here. var mqttInNode = workspace.addNode("mqttIn", 0, nodeHeight); var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); mqttInNode.edit(); mqttInNode.setTopic("sensors/livingroom/temp"); mqttInNode.clickOk(); mqttInNode.connect(debugNode); // The code for confirmation ends here. workspace.deploy(); debugTab.open(); 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", nodeWidth); var mqttInNode = workspace.addNode("mqttIn", 0, nodeHeight); var jsonNode = workspace.addNode("json", nodeWidth, nodeHeight); var debugNode = workspace.addNode("debug", nodeWidth * 2, nodeHeight); 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(); debugTab.clearMessage(); injectNode.clickLeftButton(); debugTab.getMessage().should.eql(['1234', '13']); }); }); });