* feat(channels): add guided setup flows * test(channels): preserve setup config values * fix(channels): reflect saved setup state * refactor(channels): simplify setup state metadata * fix(channels): harden setup lifecycle * refactor(channels): centralize setup contracts * fix(channels): route setup actions through webui shim * fix(channels): adapt settings for compact screens * fix(models): preserve default preset display * feat(models): add curated Codex catalog * fix(webui): stop attached gateway on interrupt * fix(webui): simplify apps catalog * docs(webui): clarify apps and runtime features * feat(settings): add guided capability setup * fix(webui): harden setup and managed services * test: keep managed runtime checks portable * test: scope POSIX runtime coverage * fix(webui): simplify file settings * feat(files): bundle document reading * fix(webui): harden setup request boundaries * fix(webui): prevent channel setup status squeeze * fix(settings): group provider compatibility aliases * refactor(settings): remove redundant setup surfaces * fix(webui): harden guided setup lifecycle * fix(webui): preserve channel setup compatibility
16 lines
489 B
TypeScript
16 lines
489 B
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { isLoopbackHost } from "@/lib/network";
|
|
|
|
describe("isLoopbackHost", () => {
|
|
it.each(["localhost", "LOCALHOST.", "127.0.0.1", "127.0.0.2", "::1", "[::1]"])(
|
|
"accepts explicit loopback host %s",
|
|
(host) => expect(isLoopbackHost(host)).toBe(true),
|
|
);
|
|
|
|
it.each(["0.0.0.0", "::", "192.168.1.10", "api.internal", "example.com"])(
|
|
"rejects network host %s",
|
|
(host) => expect(isLoopbackHost(host)).toBe(false),
|
|
);
|
|
});
|