summaryrefslogtreecommitdiffstats
path: root/test/backend-test/test-mqtt.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/backend-test/test-mqtt.js')
-rw-r--r--test/backend-test/test-mqtt.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/test/backend-test/test-mqtt.js b/test/backend-test/test-mqtt.js
new file mode 100644
index 0000000..4503102
--- /dev/null
+++ b/test/backend-test/test-mqtt.js
@@ -0,0 +1,102 @@
+const { describe, test } = require("node:test");
+const assert = require("node:assert");
+const { HiveMQContainer } = require("@testcontainers/hivemq");
+const mqtt = require("mqtt");
+const { MqttMonitorType } = require("../../server/monitor-types/mqtt");
+const { UP, PENDING } = require("../../src/util");
+
+/**
+ * Runs an MQTT test with the
+ * @param {string} mqttSuccessMessage the message that the monitor expects
+ * @param {null|"keyword"|"json-query"} mqttCheckType the type of check we perform
+ * @param {string} receivedMessage what message is recieved from the mqtt channel
+ * @returns {Promise<Heartbeat>} the heartbeat produced by the check
+ */
+async function testMqtt(mqttSuccessMessage, mqttCheckType, receivedMessage) {
+ const hiveMQContainer = await new HiveMQContainer().start();
+ const connectionString = hiveMQContainer.getConnectionString();
+ const mqttMonitorType = new MqttMonitorType();
+ const monitor = {
+ jsonPath: "firstProp", // always return firstProp for the json-query monitor
+ hostname: connectionString.split(":", 2).join(":"),
+ mqttTopic: "test",
+ port: connectionString.split(":")[2],
+ mqttUsername: null,
+ mqttPassword: null,
+ interval: 20, // controls the timeout
+ mqttSuccessMessage: mqttSuccessMessage, // for keywords
+ expectedValue: mqttSuccessMessage, // for json-query
+ mqttCheckType: mqttCheckType,
+ };
+ const heartbeat = {
+ msg: "",
+ status: PENDING,
+ };
+
+ const testMqttClient = mqtt.connect(hiveMQContainer.getConnectionString());
+ testMqttClient.on("connect", () => {
+ testMqttClient.subscribe("test", (error) => {
+ if (!error) {
+ testMqttClient.publish("test", receivedMessage);
+ }
+ });
+ });
+
+ try {
+ await mqttMonitorType.check(monitor, heartbeat, {});
+ } finally {
+ testMqttClient.end();
+ hiveMQContainer.stop();
+ }
+ return heartbeat;
+}
+
+describe("MqttMonitorType", {
+ concurrency: true,
+ skip: !!process.env.CI && (process.platform !== "linux" || process.arch !== "x64")
+}, () => {
+ test("valid keywords (type=default)", async () => {
+ const heartbeat = await testMqtt("KEYWORD", null, "-> KEYWORD <-");
+ assert.strictEqual(heartbeat.status, UP);
+ assert.strictEqual(heartbeat.msg, "Topic: test; Message: -> KEYWORD <-");
+ });
+
+ test("valid keywords (type=keyword)", async () => {
+ const heartbeat = await testMqtt("KEYWORD", "keyword", "-> KEYWORD <-");
+ assert.strictEqual(heartbeat.status, UP);
+ assert.strictEqual(heartbeat.msg, "Topic: test; Message: -> KEYWORD <-");
+ });
+ test("invalid keywords (type=default)", async () => {
+ await assert.rejects(
+ testMqtt("NOT_PRESENT", null, "-> KEYWORD <-"),
+ new Error("Message Mismatch - Topic: test; Message: -> KEYWORD <-"),
+ );
+ });
+
+ test("invalid keyword (type=keyword)", async () => {
+ await assert.rejects(
+ testMqtt("NOT_PRESENT", "keyword", "-> KEYWORD <-"),
+ new Error("Message Mismatch - Topic: test; Message: -> KEYWORD <-"),
+ );
+ });
+ test("valid json-query", async () => {
+ // works because the monitors' jsonPath is hard-coded to "firstProp"
+ const heartbeat = await testMqtt("present", "json-query", "{\"firstProp\":\"present\"}");
+ assert.strictEqual(heartbeat.status, UP);
+ assert.strictEqual(heartbeat.msg, "Message received, expected value is found");
+ });
+ test("invalid (because query fails) json-query", async () => {
+ // works because the monitors' jsonPath is hard-coded to "firstProp"
+ await assert.rejects(
+ testMqtt("[not_relevant]", "json-query", "{}"),
+ new Error("Message received but value is not equal to expected value, value was: [undefined]"),
+ );
+ });
+ test("invalid (because successMessage fails) json-query", async () => {
+ // works because the monitors' jsonPath is hard-coded to "firstProp"
+ await assert.rejects(
+ testMqtt("[wrong_success_messsage]", "json-query", "{\"firstProp\":\"present\"}"),
+ new Error("Message received but value is not equal to expected value, value was: [present]")
+ );
+ });
+});