Files
homepage/src/widgets/urbackup/proxy.test.js
2026-02-04 19:58:39 -08:00

121 lines
3.2 KiB
JavaScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import createMockRes from "test-utils/create-mock-res";
const { UrbackupServer, state, getServiceWidget } = vi.hoisted(() => {
const state = { instances: [] };
const UrbackupServer = vi.fn((opts) => {
const instance = {
opts,
getStatus: vi.fn(),
getUsage: vi.fn(),
};
state.instances.push(instance);
return instance;
});
return {
UrbackupServer,
state,
getServiceWidget: vi.fn(),
};
});
vi.mock("urbackup-server-api", () => ({
UrbackupServer,
}));
vi.mock("utils/config/service-helpers", () => ({
default: getServiceWidget,
}));
import urbackupProxyHandler from "./proxy";
describe("widgets/urbackup/proxy", () => {
beforeEach(() => {
vi.clearAllMocks();
state.instances.length = 0;
});
it("returns client statuses and maxDays without disk usage by default", async () => {
getServiceWidget.mockResolvedValue({
url: "http://ur",
username: "u",
password: "p",
maxDays: 5,
});
UrbackupServer.mockImplementationOnce((opts) => {
const instance = {
opts,
getStatus: vi.fn().mockResolvedValue([{ id: 1 }]),
getUsage: vi.fn(),
};
state.instances.push(instance);
return instance;
});
const req = { query: { group: "g", service: "svc", index: "0" } };
const res = createMockRes();
await urbackupProxyHandler(req, res);
expect(UrbackupServer).toHaveBeenCalledWith({ url: "http://ur", username: "u", password: "p" });
expect(state.instances[0].getUsage).not.toHaveBeenCalled();
expect(res.statusCode).toBe(200);
expect(res.body).toEqual({ clientStatuses: [{ id: 1 }], diskUsage: false, maxDays: 5 });
});
it("fetches disk usage when requested via fields", async () => {
getServiceWidget.mockResolvedValue({
url: "http://ur",
username: "u",
password: "p",
maxDays: 1,
fields: ["totalUsed"],
});
UrbackupServer.mockImplementationOnce((opts) => {
const instance = {
opts,
getStatus: vi.fn().mockResolvedValue([{ id: 1 }]),
getUsage: vi.fn().mockResolvedValue({ totalUsed: 123 }),
};
state.instances.push(instance);
return instance;
});
const req = { query: { group: "g", service: "svc", index: "0" } };
const res = createMockRes();
await urbackupProxyHandler(req, res);
expect(state.instances[0].getUsage).toHaveBeenCalled();
expect(res.statusCode).toBe(200);
expect(res.body.diskUsage).toEqual({ totalUsed: 123 });
});
it("returns 500 on server errors", async () => {
getServiceWidget.mockResolvedValue({ url: "http://ur", username: "u", password: "p" });
UrbackupServer.mockImplementationOnce((opts) => {
const instance = {
opts,
getStatus: vi.fn().mockRejectedValue(new Error("nope")),
getUsage: vi.fn(),
};
state.instances.push(instance);
return instance;
});
const req = { query: { group: "g", service: "svc", index: "0" } };
const res = createMockRes();
await urbackupProxyHandler(req, res);
expect(res.statusCode).toBe(500);
expect(res.body).toEqual({ error: "Error communicating with UrBackup server" });
});
});