























@@ -1,15 +1,22 @@
1-import { beforeEach, describe, expect, it, vi } from "vitest";
1+import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
22import { registerSmsWebhookRoute } from "./gateway.js";
33import type { SmsChannelRuntime } from "./inbound.js";
44import type { ResolvedSmsAccount } from "./types.js";
5566const registerPluginHttpRoute = vi.hoisted(() => vi.fn(() => vi.fn()));
778-vi.mock("openclaw/plugin-sdk/webhook-ingress", async (importOriginal) => ({
9- ...(await importOriginal<typeof import("openclaw/plugin-sdk/webhook-ingress")>()),
8+vi.mock("openclaw/plugin-sdk/webhook-ingress", () => ({
9+createFixedWindowRateLimiter: () => ({
10+clear: vi.fn(),
11+isRateLimited: vi.fn(() => false),
12+size: vi.fn(() => 0),
13+}),
14+readRequestBodyWithLimit: vi.fn(async () => ""),
1015 registerPluginHttpRoute,
1116}));
121718+const registeredRoutes: Array<() => void> = [];
19+1320function createAccount(accountId: string, webhookPath = "/webhooks/sms"): ResolvedSmsAccount {
1421return {
1522 accountId,
@@ -33,61 +40,67 @@ describe("registerSmsWebhookRoute", () => {
3340registerPluginHttpRoute.mockClear();
3441});
354243+afterEach(() => {
44+for (const unregister of registeredRoutes.toReversed()) {
45+unregister();
46+}
47+registeredRoutes.length = 0;
48+});
49+50+function registerRoute(params: Parameters<typeof registerSmsWebhookRoute>[0]) {
51+const unregister = registerSmsWebhookRoute(params);
52+registeredRoutes.push(unregister);
53+return unregister;
54+}
55+3656it("rejects duplicate webhook paths across SMS accounts", () => {
3757const channelRuntime = {} as SmsChannelRuntime;
38-const unregister = registerSmsWebhookRoute({
58+registerRoute({
3959cfg: {},
4060account: createAccount("default"),
4161 channelRuntime,
4262});
43634464expect(() =>
45-registerSmsWebhookRoute({
65+registerRoute({
4666cfg: {},
4767account: createAccount("support"),
4868 channelRuntime,
4969}),
5070).toThrow(/already registered by account default/u);
51-52-unregister();
5371});
54725573it("rejects duplicate webhook paths after route normalization", () => {
5674const channelRuntime = {} as SmsChannelRuntime;
57-const unregister = registerSmsWebhookRoute({
75+registerRoute({
5876cfg: {},
5977account: createAccount("default", "/webhooks/sms"),
6078 channelRuntime,
6179});
62806381expect(() =>
64-registerSmsWebhookRoute({
82+registerRoute({
6583cfg: {},
6684account: createAccount("support", "webhooks/sms"),
6785 channelRuntime,
6886}),
6987).toThrow(/already registered by account default/u);
7088expect(registerPluginHttpRoute).toHaveBeenCalledTimes(1);
71-72-unregister();
7389});
74907591it("allows distinct webhook paths across SMS accounts", () => {
7692const channelRuntime = {} as SmsChannelRuntime;
77-const unregisterDefault = registerSmsWebhookRoute({
93+registerRoute({
7894cfg: {},
7995account: createAccount("default"),
8096 channelRuntime,
8197});
82-const unregisterSupport = registerSmsWebhookRoute({
98+registerRoute({
8399cfg: {},
84100account: createAccount("support", "/webhooks/sms/support"),
85101 channelRuntime,
86102});
8710388104expect(registerPluginHttpRoute).toHaveBeenCalledTimes(2);
89-90-unregisterSupport();
91-unregisterDefault();
92105});
93106});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。