92 lines
3.3 KiB
TypeScript
92 lines
3.3 KiB
TypeScript
import { describe, expect, it, jest } from "@jest/globals";
|
|
import { HardwareProvider } from "../../../../src/service/networkProviders/HardwareProvider.ts";
|
|
import { testStatusProviderContract } from "../../../helpers/statusProviderContract.ts";
|
|
import type { HttpProvider } from "../../../../src/service/networkProviders/HttpProvider.ts";
|
|
import type { Monitor } from "../../../../src/domain/monitors/monitor.type.ts";
|
|
|
|
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
|
|
const makeMonitor = (overrides?: Partial<Monitor>): Monitor =>
|
|
({
|
|
id: "mon-1",
|
|
teamId: "team-1",
|
|
type: "hardware",
|
|
url: "https://capture.example.com",
|
|
...overrides,
|
|
}) as Monitor;
|
|
|
|
const createMockHttpProvider = () =>
|
|
({
|
|
handle: jest.fn().mockResolvedValue({
|
|
monitorId: "mon-1",
|
|
teamId: "team-1",
|
|
type: "hardware",
|
|
status: true,
|
|
code: 200,
|
|
message: "OK",
|
|
responseTime: 50,
|
|
payload: { data: { cpu: { usage_percent: 0.5 } } },
|
|
}),
|
|
}) as unknown as jest.Mocked<HttpProvider>;
|
|
|
|
const createProvider = () => {
|
|
const httpProvider = createMockHttpProvider();
|
|
const provider = new HardwareProvider(httpProvider);
|
|
return { provider, httpProvider };
|
|
};
|
|
|
|
// ── Contract ─────────────────────────────────────────────────────────────────
|
|
|
|
testStatusProviderContract("HardwareProvider", {
|
|
create: () => createProvider().provider,
|
|
supportedType: "hardware",
|
|
unsupportedType: "http",
|
|
makeMonitor: () => makeMonitor(),
|
|
});
|
|
|
|
// ── Tests ────────────────────────────────────────────────────────────────────
|
|
|
|
describe("HardwareProvider", () => {
|
|
it("delegates to httpProvider.handle", async () => {
|
|
const { provider, httpProvider } = createProvider();
|
|
const monitor = makeMonitor();
|
|
|
|
await provider.handle(monitor);
|
|
|
|
expect(httpProvider.handle).toHaveBeenCalledWith(monitor);
|
|
});
|
|
|
|
it("returns the response from httpProvider", async () => {
|
|
const { provider } = createProvider();
|
|
const result = await provider.handle(makeMonitor());
|
|
|
|
expect(result).toEqual(
|
|
expect.objectContaining({
|
|
monitorId: "mon-1",
|
|
status: true,
|
|
code: 200,
|
|
})
|
|
);
|
|
});
|
|
|
|
it("throws AppError when url is missing", async () => {
|
|
const { provider } = createProvider();
|
|
|
|
await expect(provider.handle(makeMonitor({ url: "" }))).rejects.toThrow("URL is required for Hardware monitor");
|
|
});
|
|
|
|
it("throws AppError when httpProvider.handle throws", async () => {
|
|
const { provider, httpProvider } = createProvider();
|
|
(httpProvider.handle as jest.Mock).mockRejectedValue(new Error("connection failed"));
|
|
|
|
await expect(provider.handle(makeMonitor())).rejects.toThrow("connection failed");
|
|
});
|
|
|
|
it("throws AppError with default message for non-Error thrown values", async () => {
|
|
const { provider, httpProvider } = createProvider();
|
|
(httpProvider.handle as jest.Mock).mockRejectedValue("string error");
|
|
|
|
await expect(provider.handle(makeMonitor())).rejects.toThrow("Error performing Hardware request");
|
|
});
|
|
});
|