wechat.test.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { describe, expect, it } from "vitest";
  2. import { WeChatRenderer } from "@/lib/webhook/renderers/wechat";
  3. import type { StructuredMessage } from "@/lib/webhook/types";
  4. describe("WeChatRenderer", () => {
  5. const renderer = new WeChatRenderer();
  6. it("should render basic message with header", () => {
  7. const message: StructuredMessage = {
  8. header: { title: "测试标题", icon: "🔔", level: "info" },
  9. sections: [],
  10. timestamp: new Date("2025-01-02T12:00:00Z"),
  11. };
  12. const result = renderer.render(message);
  13. const body = JSON.parse(result.body);
  14. expect(body.msgtype).toBe("markdown");
  15. expect(body.markdown.content).toContain("🔔 测试标题");
  16. });
  17. it("should render text section", () => {
  18. const message: StructuredMessage = {
  19. header: { title: "标题", level: "info" },
  20. sections: [{ content: [{ type: "text", value: "普通文本内容" }] }],
  21. timestamp: new Date(),
  22. };
  23. const result = renderer.render(message);
  24. const body = JSON.parse(result.body);
  25. expect(body.markdown.content).toContain("普通文本内容");
  26. });
  27. it("should render quote section", () => {
  28. const message: StructuredMessage = {
  29. header: { title: "标题", level: "warning" },
  30. sections: [{ content: [{ type: "quote", value: "引用内容" }] }],
  31. timestamp: new Date(),
  32. };
  33. const result = renderer.render(message);
  34. const body = JSON.parse(result.body);
  35. expect(body.markdown.content).toContain("> 引用内容");
  36. });
  37. it("should render fields section", () => {
  38. const message: StructuredMessage = {
  39. header: { title: "标题", level: "error" },
  40. sections: [
  41. {
  42. title: "详细信息",
  43. content: [
  44. {
  45. type: "fields",
  46. items: [
  47. { label: "名称", value: "测试" },
  48. { label: "状态", value: "正常" },
  49. ],
  50. },
  51. ],
  52. },
  53. ],
  54. timestamp: new Date(),
  55. };
  56. const result = renderer.render(message);
  57. const body = JSON.parse(result.body);
  58. expect(body.markdown.content).toContain("**详细信息**");
  59. expect(body.markdown.content).toContain("名称: 测试");
  60. expect(body.markdown.content).toContain("状态: 正常");
  61. });
  62. it("should render list section with icons", () => {
  63. const message: StructuredMessage = {
  64. header: { title: "排行榜", level: "info" },
  65. sections: [
  66. {
  67. content: [
  68. {
  69. type: "list",
  70. style: "ordered",
  71. items: [
  72. { icon: "🥇", primary: "用户A", secondary: "消费 $10" },
  73. { icon: "🥈", primary: "用户B", secondary: "消费 $5" },
  74. ],
  75. },
  76. ],
  77. },
  78. ],
  79. timestamp: new Date(),
  80. };
  81. const result = renderer.render(message);
  82. const body = JSON.parse(result.body);
  83. expect(body.markdown.content).toContain("🥇 **用户A**");
  84. expect(body.markdown.content).toContain("消费 $10");
  85. });
  86. it("should render divider", () => {
  87. const message: StructuredMessage = {
  88. header: { title: "标题", level: "info" },
  89. sections: [{ content: [{ type: "divider" }] }],
  90. timestamp: new Date(),
  91. };
  92. const result = renderer.render(message);
  93. const body = JSON.parse(result.body);
  94. expect(body.markdown.content).toContain("---");
  95. });
  96. it("should render footer sections", () => {
  97. const message: StructuredMessage = {
  98. header: { title: "标题", level: "info" },
  99. sections: [],
  100. footer: [{ content: [{ type: "text", value: "底部提示信息" }] }],
  101. timestamp: new Date(),
  102. };
  103. const result = renderer.render(message);
  104. const body = JSON.parse(result.body);
  105. expect(body.markdown.content).toContain("底部提示信息");
  106. });
  107. it("should include timestamp", () => {
  108. const message: StructuredMessage = {
  109. header: { title: "标题", level: "info" },
  110. sections: [],
  111. timestamp: new Date("2025-01-02T12:00:00Z"),
  112. };
  113. const result = renderer.render(message);
  114. const body = JSON.parse(result.body);
  115. expect(body.markdown.content).toContain("2025");
  116. });
  117. });