From d29854f710a96ee89759198473695eb58a963858 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 4 Feb 2026 09:39:43 -0800 Subject: [PATCH] test: add widget config tests (batch 1) --- src/test-utils/widget-config.js | 39 +++++++++++++++++++++++ src/widgets/adguard/widget.test.js | 12 +++++++ src/widgets/apcups/widget.test.js | 13 ++++++++ src/widgets/audiobookshelf/widget.test.js | 12 +++++++ src/widgets/authentik/widget.test.js | 13 ++++++++ src/widgets/backrest/widget.test.js | 13 ++++++++ src/widgets/bazarr/widget.test.js | 16 ++++++++++ src/widgets/calendar/widget.test.js | 12 +++++++ src/widgets/glances/widget.test.js | 13 ++++++++ src/widgets/immich/widget.test.js | 13 ++++++++ src/widgets/unraid/widget.test.js | 12 +++++++ 11 files changed, 168 insertions(+) create mode 100644 src/test-utils/widget-config.js create mode 100644 src/widgets/adguard/widget.test.js create mode 100644 src/widgets/apcups/widget.test.js create mode 100644 src/widgets/audiobookshelf/widget.test.js create mode 100644 src/widgets/authentik/widget.test.js create mode 100644 src/widgets/backrest/widget.test.js create mode 100644 src/widgets/bazarr/widget.test.js create mode 100644 src/widgets/calendar/widget.test.js create mode 100644 src/widgets/glances/widget.test.js create mode 100644 src/widgets/immich/widget.test.js create mode 100644 src/widgets/unraid/widget.test.js diff --git a/src/test-utils/widget-config.js b/src/test-utils/widget-config.js new file mode 100644 index 000000000..4f448f9da --- /dev/null +++ b/src/test-utils/widget-config.js @@ -0,0 +1,39 @@ +import { expect } from "vitest"; + +export function expectWidgetConfigShape(widget) { + expect(widget).toBeTruthy(); + expect(widget).toBeTypeOf("object"); + + if ("api" in widget) { + expect(widget.api).toBeTypeOf("string"); + // Widget APIs are template strings that expand to a configured service URL. + expect(widget.api).toContain("{url}"); + } + + if ("proxyHandler" in widget) { + expect(widget.proxyHandler).toBeTypeOf("function"); + } + + if ("allowedEndpoints" in widget) { + expect(widget.allowedEndpoints).toBeInstanceOf(RegExp); + } + + if ("mappings" in widget) { + expect(widget.mappings).toBeTruthy(); + expect(widget.mappings).toBeTypeOf("object"); + + for (const [name, mapping] of Object.entries(widget.mappings)) { + expect(name).toBeTruthy(); + expect(mapping).toBeTruthy(); + expect(mapping).toBeTypeOf("object"); + + if ("endpoint" in mapping) { + expect(mapping.endpoint).toBeTypeOf("string"); + expect(mapping.endpoint.length).toBeGreaterThan(0); + } + if ("map" in mapping) { + expect(mapping.map).toBeTypeOf("function"); + } + } + } +} diff --git a/src/widgets/adguard/widget.test.js b/src/widgets/adguard/widget.test.js new file mode 100644 index 000000000..296658e20 --- /dev/null +++ b/src/widgets/adguard/widget.test.js @@ -0,0 +1,12 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("adguard widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.mappings?.stats?.endpoint).toBe("stats"); + }); +}); diff --git a/src/widgets/apcups/widget.test.js b/src/widgets/apcups/widget.test.js new file mode 100644 index 000000000..505bd42c4 --- /dev/null +++ b/src/widgets/apcups/widget.test.js @@ -0,0 +1,13 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("apcups widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + // apcups talks TCP directly, so it does not use an `{url}/...` API template. + expect(widget.api).toBeUndefined(); + }); +}); diff --git a/src/widgets/audiobookshelf/widget.test.js b/src/widgets/audiobookshelf/widget.test.js new file mode 100644 index 000000000..4d5c459ab --- /dev/null +++ b/src/widgets/audiobookshelf/widget.test.js @@ -0,0 +1,12 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("audiobookshelf widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.mappings?.libraries?.endpoint).toBe("libraries"); + }); +}); diff --git a/src/widgets/authentik/widget.test.js b/src/widgets/authentik/widget.test.js new file mode 100644 index 000000000..a2a5d4e25 --- /dev/null +++ b/src/widgets/authentik/widget.test.js @@ -0,0 +1,13 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("authentik widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.api).toContain("/api/v3/"); + expect(widget.mappings?.users?.endpoint).toContain("core/users"); + }); +}); diff --git a/src/widgets/backrest/widget.test.js b/src/widgets/backrest/widget.test.js new file mode 100644 index 000000000..fce1ed264 --- /dev/null +++ b/src/widgets/backrest/widget.test.js @@ -0,0 +1,13 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("backrest widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.api).toContain("/v1.Backrest/"); + expect(widget.mappings?.summary?.endpoint).toBe("GetSummaryDashboard"); + }); +}); diff --git a/src/widgets/bazarr/widget.test.js b/src/widgets/bazarr/widget.test.js new file mode 100644 index 000000000..9f8bbcaff --- /dev/null +++ b/src/widgets/bazarr/widget.test.js @@ -0,0 +1,16 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("bazarr widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.api).toContain("apikey={key}"); + + const moviesMapping = widget.mappings?.movies; + expect(moviesMapping?.endpoint).toBe("movies"); + expect(moviesMapping?.map?.('{"total":123}')).toEqual({ total: 123 }); + }); +}); diff --git a/src/widgets/calendar/widget.test.js b/src/widgets/calendar/widget.test.js new file mode 100644 index 000000000..c9090d4fd --- /dev/null +++ b/src/widgets/calendar/widget.test.js @@ -0,0 +1,12 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("calendar widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.api).toBe("{url}"); + }); +}); diff --git a/src/widgets/glances/widget.test.js b/src/widgets/glances/widget.test.js new file mode 100644 index 000000000..0e2b7a875 --- /dev/null +++ b/src/widgets/glances/widget.test.js @@ -0,0 +1,13 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("glances widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.allowedEndpoints?.test("3/quicklook")).toBe(true); + expect(widget.allowedEndpoints?.test("unknown")).toBe(false); + }); +}); diff --git a/src/widgets/immich/widget.test.js b/src/widgets/immich/widget.test.js new file mode 100644 index 000000000..9444692d6 --- /dev/null +++ b/src/widgets/immich/widget.test.js @@ -0,0 +1,13 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("immich widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.api).toContain("/api/"); + expect(widget.mappings?.version?.endpoint).toBe("server-info/version"); + }); +}); diff --git a/src/widgets/unraid/widget.test.js b/src/widgets/unraid/widget.test.js new file mode 100644 index 000000000..4c2a1058e --- /dev/null +++ b/src/widgets/unraid/widget.test.js @@ -0,0 +1,12 @@ +import { describe, expect, it } from "vitest"; + +import { expectWidgetConfigShape } from "test-utils/widget-config"; + +import widget from "./widget"; + +describe("unraid widget config", () => { + it("exports a valid widget config", () => { + expectWidgetConfigShape(widget); + expect(widget.api).toBeUndefined(); + }); +});