custom.test.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { describe, expect, it } from "vitest";
  2. import { CustomRenderer } from "@/lib/webhook/renderers/custom";
  3. import type { StructuredMessage } from "@/lib/webhook/types";
  4. describe("CustomRenderer", () => {
  5. const message: StructuredMessage = {
  6. header: { title: "测试标题", level: "info" },
  7. sections: [{ content: [{ type: "text", value: "正文内容" }] }],
  8. timestamp: new Date("2025-01-02T12:00:00Z"),
  9. };
  10. it("should interpolate placeholders and include custom headers", () => {
  11. const renderer = new CustomRenderer(
  12. {
  13. text: "title={{title}} provider={{provider_name}}",
  14. meta: {
  15. level: "{{level}}",
  16. when: "{{timestamp}}",
  17. },
  18. },
  19. { "X-Test": "1" }
  20. );
  21. const result = renderer.render(message, {
  22. notificationType: "circuit_breaker",
  23. data: { providerName: "OpenAI" },
  24. });
  25. const body = JSON.parse(result.body) as any;
  26. expect(result.headers).toEqual({ "X-Test": "1" });
  27. expect(body.text).toContain("title=测试标题");
  28. expect(body.text).toContain("provider=OpenAI");
  29. expect(body.meta.level).toBe("info");
  30. expect(body.meta.when).toContain("2025-01-02T12:00:00.000Z");
  31. });
  32. it("should use templateOverride when provided", () => {
  33. const renderer = new CustomRenderer({ foo: "{{title}}" }, null);
  34. const result = renderer.render(message, {
  35. templateOverride: { bar: "override={{title}}" },
  36. });
  37. const body = JSON.parse(result.body) as any;
  38. expect(body.foo).toBeUndefined();
  39. expect(body.bar).toBe("override=测试标题");
  40. });
  41. it("should throw when templateOverride is invalid", () => {
  42. const renderer = new CustomRenderer({ foo: "bar" }, null);
  43. expect(() =>
  44. renderer.render(message, {
  45. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  46. templateOverride: [] as any,
  47. })
  48. ).toThrow("自定义 Webhook 模板必须是 JSON 对象");
  49. });
  50. });