Files
Termix/plugins/tailscale/tests/frontend/tailscale-api.test.ts
T

56 lines
1.4 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import {
getTailscaleDevices,
setTailscaleApi,
} from "../../src/frontend/tailscale-api";
const api = { get: vi.fn() };
beforeEach(() => {
vi.clearAllMocks();
setTailscaleApi(api as never);
});
describe("getTailscaleDevices", () => {
it("reads the plugin's own devices route", async () => {
api.get.mockResolvedValue({ data: { devices: [], hasApiKey: false } });
await expect(getTailscaleDevices()).resolves.toEqual({
devices: [],
hasApiKey: false,
});
expect(api.get).toHaveBeenCalledWith("/devices");
});
it("preserves configured-key state when discovery fails", async () => {
api.get.mockRejectedValue({
isAxiosError: true,
response: {
data: {
devices: [],
hasApiKey: true,
error: "Failed to fetch Tailscale devices",
},
},
});
await expect(getTailscaleDevices()).resolves.toEqual({
devices: [],
hasApiKey: true,
error: "Failed to fetch Tailscale devices",
});
});
it("rethrows when no structured state is available", async () => {
const error = { isAxiosError: true, response: { data: {} } };
api.get.mockRejectedValue(error);
await expect(getTailscaleDevices()).rejects.toBe(error);
});
it("refuses while the plugin is off", async () => {
setTailscaleApi(null);
await expect(getTailscaleDevices()).rejects.toThrow(/not active/);
});
});