mirror of
https://github.com/koichixD/uptime-kuma.git
synced 2026-08-29 04:01:01 +00:00
feat: extract MySQL/MariaDB monitor to its own monitor-type and enable conditions support
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
const { describe, test } = require("node:test");
|
||||
const assert = require("node:assert");
|
||||
const { MariaDbContainer } = require("@testcontainers/mariadb");
|
||||
const { MysqlMonitorType } = require("../../../server/monitor-types/mysql");
|
||||
const { UP, PENDING } = require("../../../src/util");
|
||||
|
||||
/**
|
||||
* Helper function to create and start a MariaDB container
|
||||
* @returns {Promise<MariaDbContainer>} The started MariaDB container
|
||||
*/
|
||||
async function createAndStartMariaDBContainer() {
|
||||
return await new MariaDbContainer("mariadb:10.11")
|
||||
.withStartupTimeout(90000)
|
||||
.start();
|
||||
}
|
||||
|
||||
describe(
|
||||
"MySQL/MariaDB Monitor",
|
||||
{
|
||||
skip:
|
||||
!!process.env.CI &&
|
||||
(process.platform !== "linux" || process.arch !== "x64"),
|
||||
},
|
||||
() => {
|
||||
test("check() sets status to UP when MariaDB server is reachable", async () => {
|
||||
const mariadbContainer = await createAndStartMariaDBContainer();
|
||||
|
||||
const mysqlMonitor = new MysqlMonitorType();
|
||||
const monitor = {
|
||||
databaseConnectionString: `mysql://${mariadbContainer.getUsername()}:${mariadbContainer.getUserPassword()}@${mariadbContainer.getHost()}:${mariadbContainer.getPort()}/${mariadbContainer.getDatabase()}`,
|
||||
conditions: "[]",
|
||||
};
|
||||
|
||||
const heartbeat = {
|
||||
msg: "",
|
||||
status: PENDING,
|
||||
};
|
||||
|
||||
try {
|
||||
await mysqlMonitor.check(monitor, heartbeat, {});
|
||||
assert.strictEqual(
|
||||
heartbeat.status,
|
||||
UP,
|
||||
`Expected status ${UP} but got ${heartbeat.status}`
|
||||
);
|
||||
} finally {
|
||||
await mariadbContainer.stop();
|
||||
}
|
||||
});
|
||||
|
||||
test("check() rejects when MariaDB server is not reachable", async () => {
|
||||
const mysqlMonitor = new MysqlMonitorType();
|
||||
const monitor = {
|
||||
databaseConnectionString:
|
||||
"mysql://invalid:invalid@localhost:13306/test",
|
||||
conditions: "[]",
|
||||
};
|
||||
|
||||
const heartbeat = {
|
||||
msg: "",
|
||||
status: PENDING,
|
||||
};
|
||||
|
||||
await assert.rejects(
|
||||
mysqlMonitor.check(monitor, heartbeat, {}),
|
||||
(err) => {
|
||||
assert.ok(
|
||||
err.message.includes("Database connection/query failed"),
|
||||
`Expected error message to include "Database connection/query failed" but got: ${err.message}`
|
||||
);
|
||||
return true;
|
||||
}
|
||||
);
|
||||
assert.notStrictEqual(
|
||||
heartbeat.status,
|
||||
UP,
|
||||
`Expected status should not be ${UP}`
|
||||
);
|
||||
});
|
||||
|
||||
test("check() sets status to UP when custom query result meets condition", async () => {
|
||||
const mariadbContainer = await createAndStartMariaDBContainer();
|
||||
|
||||
const mysqlMonitor = new MysqlMonitorType();
|
||||
const monitor = {
|
||||
databaseConnectionString: `mysql://${mariadbContainer.getUsername()}:${mariadbContainer.getUserPassword()}@${mariadbContainer.getHost()}:${mariadbContainer.getPort()}/${mariadbContainer.getDatabase()}`,
|
||||
databaseQuery: "SELECT 42 AS value",
|
||||
conditions: JSON.stringify([
|
||||
{
|
||||
type: "expression",
|
||||
andOr: "and",
|
||||
variable: "result",
|
||||
operator: "equals",
|
||||
value: "42",
|
||||
},
|
||||
]),
|
||||
};
|
||||
|
||||
const heartbeat = {
|
||||
msg: "",
|
||||
status: PENDING,
|
||||
};
|
||||
|
||||
try {
|
||||
await mysqlMonitor.check(monitor, heartbeat, {});
|
||||
assert.strictEqual(
|
||||
heartbeat.status,
|
||||
UP,
|
||||
`Expected status ${UP} but got ${heartbeat.status}`
|
||||
);
|
||||
} finally {
|
||||
await mariadbContainer.stop();
|
||||
}
|
||||
});
|
||||
|
||||
test("check() rejects when custom query result does not meet condition", async () => {
|
||||
const mariadbContainer = await createAndStartMariaDBContainer();
|
||||
|
||||
const mysqlMonitor = new MysqlMonitorType();
|
||||
const monitor = {
|
||||
databaseConnectionString: `mysql://${mariadbContainer.getUsername()}:${mariadbContainer.getUserPassword()}@${mariadbContainer.getHost()}:${mariadbContainer.getPort()}/${mariadbContainer.getDatabase()}`,
|
||||
databaseQuery: "SELECT 99 AS value",
|
||||
conditions: JSON.stringify([
|
||||
{
|
||||
type: "expression",
|
||||
andOr: "and",
|
||||
variable: "result",
|
||||
operator: "equals",
|
||||
value: "42",
|
||||
},
|
||||
]),
|
||||
};
|
||||
|
||||
const heartbeat = {
|
||||
msg: "",
|
||||
status: PENDING,
|
||||
};
|
||||
|
||||
try {
|
||||
await assert.rejects(
|
||||
mysqlMonitor.check(monitor, heartbeat, {}),
|
||||
new Error(
|
||||
"Query result did not meet the specified conditions (99)"
|
||||
)
|
||||
);
|
||||
assert.strictEqual(
|
||||
heartbeat.status,
|
||||
PENDING,
|
||||
`Expected status should not be ${heartbeat.status}`
|
||||
);
|
||||
} finally {
|
||||
await mariadbContainer.stop();
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user