feat: Add configurable response data storage for notifications (#6684)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Frank Elsinga <frank@elsinga.de>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Dmitry
2026-01-12 20:39:12 +03:00
committed by GitHub
parent 034b8641c8
commit 751fe1bbf5
12 changed files with 322 additions and 6 deletions

View File

@@ -0,0 +1,36 @@
const { describe, test } = require("node:test");
const assert = require("node:assert");
const Monitor = require("../../server/model/monitor");
const Heartbeat = require("../../server/model/heartbeat");
const { RESPONSE_BODY_LENGTH_DEFAULT } = require("../../src/util");
describe("Monitor response saving", () => {
test("getSaveResponse and getSaveErrorResponse parse booleans", () => {
const monitor = Object.create(Monitor.prototype);
monitor.save_response = 1;
monitor.save_error_response = 0;
assert.strictEqual(monitor.getSaveResponse(), true);
assert.strictEqual(monitor.getSaveErrorResponse(), false);
});
test("saveResponseData stores and truncates response", async () => {
const monitor = Object.create(Monitor.prototype);
monitor.response_max_length = 5;
const bean = {};
await monitor.saveResponseData(bean, "abcdef");
assert.strictEqual(await Heartbeat.decodeResponseValue(bean.response), "abcde... (truncated)");
});
test("saveResponseData stringifies objects", async () => {
const monitor = Object.create(Monitor.prototype);
monitor.response_max_length = RESPONSE_BODY_LENGTH_DEFAULT;
const bean = {};
await monitor.saveResponseData(bean, { ok: true });
assert.strictEqual(await Heartbeat.decodeResponseValue(bean.response), JSON.stringify({ ok: true }));
});
});

View File

@@ -105,4 +105,34 @@ test.describe("Monitor Form", () => {
await screenshot(testInfo, page);
});
test("save response settings persist", async ({ page }, testInfo) => {
await page.goto("./add");
await login(page);
await selectMonitorType(page, "http");
const friendlyName = "Example HTTP Save Response";
await page.getByTestId("friendly-name-input").fill(friendlyName);
await page.getByTestId("url-input").fill("https://www.example.com/");
// Expect error response save enabled by default
await expect(page.getByLabel("Save HTTP Error Response for Notifications")).toBeChecked();
await page.getByLabel("Save HTTP Success Response for Notifications").check();
await page.getByLabel("Save HTTP Error Response for Notifications").uncheck();
await page.getByLabel("Response Max Length (bytes)").fill("2048");
await screenshot(testInfo, page);
await page.getByTestId("save-button").click();
await page.waitForURL("/dashboard/*");
await page.getByRole("link", { name: "Edit" }).click();
await page.waitForURL("/edit/*");
await expect(page.getByLabel("Save HTTP Success Response for Notifications")).toBeHidden();
await expect(page.getByLabel("Save HTTP Error Response for Notifications")).not.toBeChecked();
await expect(page.getByLabel("Response Max Length (bytes)")).toHaveValue("2048");
await screenshot(testInfo, page);
});
});