| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import { describe, expect, test, vi } from "vitest";
- import { validateProviderUrlForConnectivity } from "@/lib/validation/provider-url";
- describe("validateProviderUrlForConnectivity", () => {
- test("允许 localhost/127.0.0.1 等内网地址", () => {
- const cases = ["http://localhost:1234", "https://127.0.0.1:443", "http://[::1]:8080"];
- for (const url of cases) {
- const result = validateProviderUrlForConnectivity(url);
- expect(result.valid).toBe(true);
- }
- });
- test("允许 RFC1918/Link-local 等私网地址", () => {
- const cases = [
- "http://10.0.0.1:8080",
- "http://172.16.0.10:8080",
- "http://192.168.1.2:8080",
- "http://169.254.0.1:8080",
- "http://[fc00::1]:8080",
- "http://[fd00::1]:8080",
- "http://[fe80::1]:8080",
- ];
- for (const url of cases) {
- const result = validateProviderUrlForConnectivity(url);
- expect(result.valid).toBe(true);
- }
- });
- test("允许常见内部服务端口(不再做端口黑名单)", () => {
- const cases = [
- "http://example.com:22",
- "http://example.com:5432",
- "http://example.com:6379",
- "http://example.com:27017",
- ];
- for (const url of cases) {
- const result = validateProviderUrlForConnectivity(url);
- expect(result.valid).toBe(true);
- }
- });
- test("仍然拒绝非 HTTP(S) 协议", () => {
- const result = validateProviderUrlForConnectivity("ftp://example.com");
- expect(result.valid).toBe(false);
- });
- test("仍然拒绝无法解析的 URL", () => {
- const result = validateProviderUrlForConnectivity("not a url");
- expect(result.valid).toBe(false);
- });
- test("当 URL 构造器抛出非 Error 时,应返回兜底错误信息(覆盖边界分支)", () => {
- const originalURL = globalThis.URL;
- vi.stubGlobal(
- "URL",
- class {
- constructor() {
- throw "boom";
- }
- } as any
- );
- try {
- const result = validateProviderUrlForConnectivity("https://example.com");
- expect(result.valid).toBe(false);
- if (result.valid) return;
- expect(result.error).toEqual(
- expect.objectContaining({
- details: expect.objectContaining({
- error: "URL 解析失败",
- }),
- })
- );
- } finally {
- vi.stubGlobal("URL", originalURL as any);
- }
- });
- });
|