normalization.test.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { describe, expect, test } from "bun:test";
  2. import { normalizeNameForMCP } from "../normalization";
  3. describe("normalizeNameForMCP", () => {
  4. test("returns simple valid name unchanged", () => {
  5. expect(normalizeNameForMCP("my-server")).toBe("my-server");
  6. });
  7. test("replaces dots with underscores", () => {
  8. expect(normalizeNameForMCP("my.server.name")).toBe("my_server_name");
  9. });
  10. test("replaces spaces with underscores", () => {
  11. expect(normalizeNameForMCP("my server")).toBe("my_server");
  12. });
  13. test("replaces special characters with underscores", () => {
  14. expect(normalizeNameForMCP("server@v2!")).toBe("server_v2_");
  15. });
  16. test("returns already valid name unchanged", () => {
  17. expect(normalizeNameForMCP("valid_name-123")).toBe("valid_name-123");
  18. });
  19. test("returns empty string for empty input", () => {
  20. expect(normalizeNameForMCP("")).toBe("");
  21. });
  22. test("handles claude.ai prefix: collapses consecutive underscores and strips edges", () => {
  23. // "claude.ai My Server" -> replace invalid -> "claude_ai_My_Server"
  24. // starts with "claude.ai " so collapse + strip -> "claude_ai_My_Server"
  25. expect(normalizeNameForMCP("claude.ai My Server")).toBe(
  26. "claude_ai_My_Server"
  27. );
  28. });
  29. test("handles claude.ai prefix with consecutive invalid chars", () => {
  30. // "claude.ai ...test..." -> replace invalid -> "claude_ai____test___"
  31. // collapse consecutive _ -> "claude_ai_test_"
  32. // strip leading/trailing _ -> "claude_ai_test"
  33. expect(normalizeNameForMCP("claude.ai ...test...")).toBe("claude_ai_test");
  34. });
  35. test("non-claude.ai name preserves consecutive underscores", () => {
  36. // "a..b" -> "a__b", no claude.ai prefix so no collapse
  37. expect(normalizeNameForMCP("a..b")).toBe("a__b");
  38. });
  39. test("non-claude.ai name preserves trailing underscores", () => {
  40. expect(normalizeNameForMCP("name!")).toBe("name_");
  41. });
  42. test("handles claude.ai prefix that results in only underscores", () => {
  43. // "claude.ai ..." -> replace invalid -> "claude_ai____"
  44. // collapse -> "claude_ai_"
  45. // strip trailing -> "claude_ai"
  46. expect(normalizeNameForMCP("claude.ai ...")).toBe("claude_ai");
  47. });
  48. });