provider-url-validation.test.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { describe, expect, test, vi } from "vitest";
  2. import { validateProviderUrlForConnectivity } from "@/lib/validation/provider-url";
  3. describe("validateProviderUrlForConnectivity", () => {
  4. test("允许 localhost/127.0.0.1 等内网地址", () => {
  5. const cases = ["http://localhost:1234", "https://127.0.0.1:443", "http://[::1]:8080"];
  6. for (const url of cases) {
  7. const result = validateProviderUrlForConnectivity(url);
  8. expect(result.valid).toBe(true);
  9. }
  10. });
  11. test("允许 RFC1918/Link-local 等私网地址", () => {
  12. const cases = [
  13. "http://10.0.0.1:8080",
  14. "http://172.16.0.10:8080",
  15. "http://192.168.1.2:8080",
  16. "http://169.254.0.1:8080",
  17. "http://[fc00::1]:8080",
  18. "http://[fd00::1]:8080",
  19. "http://[fe80::1]:8080",
  20. ];
  21. for (const url of cases) {
  22. const result = validateProviderUrlForConnectivity(url);
  23. expect(result.valid).toBe(true);
  24. }
  25. });
  26. test("允许常见内部服务端口(不再做端口黑名单)", () => {
  27. const cases = [
  28. "http://example.com:22",
  29. "http://example.com:5432",
  30. "http://example.com:6379",
  31. "http://example.com:27017",
  32. ];
  33. for (const url of cases) {
  34. const result = validateProviderUrlForConnectivity(url);
  35. expect(result.valid).toBe(true);
  36. }
  37. });
  38. test("仍然拒绝非 HTTP(S) 协议", () => {
  39. const result = validateProviderUrlForConnectivity("ftp://example.com");
  40. expect(result.valid).toBe(false);
  41. });
  42. test("仍然拒绝无法解析的 URL", () => {
  43. const result = validateProviderUrlForConnectivity("not a url");
  44. expect(result.valid).toBe(false);
  45. });
  46. test("当 URL 构造器抛出非 Error 时,应返回兜底错误信息(覆盖边界分支)", () => {
  47. const originalURL = globalThis.URL;
  48. vi.stubGlobal(
  49. "URL",
  50. class {
  51. constructor() {
  52. throw "boom";
  53. }
  54. } as any
  55. );
  56. try {
  57. const result = validateProviderUrlForConnectivity("https://example.com");
  58. expect(result.valid).toBe(false);
  59. if (result.valid) return;
  60. expect(result.error).toEqual(
  61. expect.objectContaining({
  62. details: expect.objectContaining({
  63. error: "URL 解析失败",
  64. }),
  65. })
  66. );
  67. } finally {
  68. vi.stubGlobal("URL", originalURL as any);
  69. }
  70. });
  71. });