mirror of
https://github.com/gethomepage/homepage.git
synced 2026-02-08 08:50:52 +08:00
test: add config + widget helper coverage
This commit is contained in:
88
src/utils/config/widget-helpers.test.js
Normal file
88
src/utils/config/widget-helpers.test.js
Normal file
@@ -0,0 +1,88 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
const { fs, yaml, config } = vi.hoisted(() => ({
|
||||
fs: {
|
||||
readFile: vi.fn(),
|
||||
},
|
||||
yaml: {
|
||||
load: vi.fn(),
|
||||
},
|
||||
config: {
|
||||
CONF_DIR: "/conf",
|
||||
substituteEnvironmentVars: vi.fn((s) => s),
|
||||
default: vi.fn(),
|
||||
},
|
||||
}));
|
||||
|
||||
vi.mock("fs", () => ({
|
||||
promises: fs,
|
||||
}));
|
||||
|
||||
vi.mock("js-yaml", () => ({
|
||||
default: yaml,
|
||||
...yaml,
|
||||
}));
|
||||
|
||||
vi.mock("utils/config/config", () => config);
|
||||
|
||||
import { cleanWidgetGroups, getPrivateWidgetOptions, widgetsFromConfig } from "./widget-helpers";
|
||||
|
||||
describe("utils/config/widget-helpers", () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it("widgetsFromConfig maps YAML into a typed widgets array with indices", async () => {
|
||||
fs.readFile.mockResolvedValueOnce("ignored");
|
||||
yaml.load.mockReturnValueOnce([{ search: { provider: "google", url: "http://x", key: "k" } }]);
|
||||
|
||||
const widgets = await widgetsFromConfig();
|
||||
expect(widgets).toEqual([
|
||||
{
|
||||
type: "search",
|
||||
options: { index: 0, provider: "google", url: "http://x", key: "k" },
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
it("cleanWidgetGroups removes private options and hides url except for search/glances", async () => {
|
||||
const cleaned = await cleanWidgetGroups([
|
||||
{ type: "search", options: { index: 0, url: "http://x", username: "u", password: "p" } },
|
||||
{ type: "something", options: { index: 1, url: "http://y", key: "k", foo: 1 } },
|
||||
{ type: "glances", options: { index: 2, url: "http://z", apiKey: "k", bar: 2 } },
|
||||
]);
|
||||
|
||||
expect(cleaned[0].options.url).toBe("http://x");
|
||||
expect(cleaned[0].options.username).toBeUndefined();
|
||||
|
||||
expect(cleaned[1].options.url).toBeUndefined();
|
||||
expect(cleaned[1].options.key).toBeUndefined();
|
||||
expect(cleaned[1].options.foo).toBe(1);
|
||||
|
||||
expect(cleaned[2].options.url).toBe("http://z");
|
||||
expect(cleaned[2].options.apiKey).toBeUndefined();
|
||||
});
|
||||
|
||||
it("getPrivateWidgetOptions returns private options for a specific widget", async () => {
|
||||
fs.readFile.mockResolvedValueOnce("ignored");
|
||||
yaml.load.mockReturnValueOnce([{ search: { url: "http://x", username: "u", password: "p", key: "k" } }]);
|
||||
|
||||
const options = await getPrivateWidgetOptions("search", 0);
|
||||
expect(options).toEqual(
|
||||
expect.objectContaining({
|
||||
index: 0,
|
||||
url: "http://x",
|
||||
username: "u",
|
||||
password: "p",
|
||||
key: "k",
|
||||
}),
|
||||
);
|
||||
|
||||
// And the full list when no args are provided
|
||||
fs.readFile.mockResolvedValueOnce("ignored");
|
||||
yaml.load.mockReturnValueOnce([{ search: { url: "http://x", username: "u" } }]);
|
||||
const all = await getPrivateWidgetOptions();
|
||||
expect(Array.isArray(all)).toBe(true);
|
||||
expect(all[0].options.url).toBe("http://x");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user