diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json index a17c1fc52c..16f62b1f7c 100644 --- a/src/i18n/messages/vi.json +++ b/src/i18n/messages/vi.json @@ -12207,7 +12207,7 @@ }, "omni-webhooks": { "name": "Webhook", - "description": "__MISSING__:Register, list, test, and remove webhook endpoints. Configure event subscriptions (request.completed, request.failed, quota.exceeded, etc.) and manage delivery retries." + "description": "Đăng ký, liệt kê, kiểm thử và xoá các endpoint webhook. Cấu hình đăng ký sự kiện (request.completed, request.failed, quota.exceeded, v.v.) và quản lý thử lại giao hàng." }, "omni-mcp": { "name": "Máy chủ MCP", diff --git a/tests/unit/webhook-discord-dispatcher.test.ts b/tests/unit/webhook-discord-dispatcher.test.ts index 4a49c3ba2e..605f4aa86b 100644 --- a/tests/unit/webhook-discord-dispatcher.test.ts +++ b/tests/unit/webhook-discord-dispatcher.test.ts @@ -1,5 +1,6 @@ import test from "node:test"; import assert from "node:assert/strict"; +import { WEBHOOK_EVENT_VALUES } from "../../src/lib/webhooks/eventDescriptions.ts"; const { buildDiscordPayload } = await import("../../src/lib/webhooks/integrations/discord.ts"); @@ -14,15 +15,7 @@ test("buildDiscordPayload — request.failed produces embed with model", () => { }); test("buildDiscordPayload — all WEBHOOK_EVENTS return object with content or embeds", () => { - const events = [ - "request.completed", - "request.failed", - "provider.error", - "provider.recovered", - "quota.exceeded", - "combo.switched", - "test.ping", - ] as const; + const events = WEBHOOK_EVENT_VALUES; for (const event of events) { const payload = buildDiscordPayload(event, {}); assert.ok( @@ -33,7 +26,7 @@ test("buildDiscordPayload — all WEBHOOK_EVENTS return object with content or e }); test("buildDiscordPayload — embeds have title and color fields", () => { - const payload = buildDiscordPayload("provider.error", { provider: "openai" }); + const payload = buildDiscordPayload("request.failed", { provider: "openai" }); assert.ok(Array.isArray(payload.embeds) && payload.embeds.length > 0, "should have embeds"); const embed = payload.embeds![0]; assert.ok(typeof embed.title === "string" && embed.title.length > 0, "embed must have title"); diff --git a/tests/unit/webhook-slack-dispatcher.test.ts b/tests/unit/webhook-slack-dispatcher.test.ts index 44b34626cf..ad91a774e3 100644 --- a/tests/unit/webhook-slack-dispatcher.test.ts +++ b/tests/unit/webhook-slack-dispatcher.test.ts @@ -1,5 +1,6 @@ import test from "node:test"; import assert from "node:assert/strict"; +import { WEBHOOK_EVENT_VALUES } from "../../src/lib/webhooks/eventDescriptions.ts"; const { buildSlackPayload } = await import("../../src/lib/webhooks/integrations/slack.ts"); @@ -30,8 +31,8 @@ test("buildSlackPayload — test.ping produces a ping/test message", () => { ); }); -test("buildSlackPayload — provider.error includes provider context", () => { - const payload = buildSlackPayload("provider.error", { provider: "openai", model: "gpt-4" }); +test("buildSlackPayload — request.failed includes provider context", () => { + const payload = buildSlackPayload("request.failed", { provider: "openai" }); const combined = JSON.stringify(payload); assert.ok( combined.includes("Provider") || @@ -43,15 +44,7 @@ test("buildSlackPayload — provider.error includes provider context", () => { }); test("buildSlackPayload — all WEBHOOK_EVENTS produce valid payloads with text field", () => { - const events = [ - "request.completed", - "request.failed", - "provider.error", - "provider.recovered", - "quota.exceeded", - "combo.switched", - "test.ping", - ] as const; + const events = WEBHOOK_EVENT_VALUES; for (const event of events) { const payload = buildSlackPayload(event, {}); assert.ok( diff --git a/tests/unit/webhook-telegram-dispatcher.test.ts b/tests/unit/webhook-telegram-dispatcher.test.ts index eeb5ee2c92..29bf2f586c 100644 --- a/tests/unit/webhook-telegram-dispatcher.test.ts +++ b/tests/unit/webhook-telegram-dispatcher.test.ts @@ -1,5 +1,6 @@ import test from "node:test"; import assert from "node:assert/strict"; +import { WEBHOOK_EVENT_VALUES } from "../../src/lib/webhooks/eventDescriptions.ts"; const { buildTelegramPayload, buildTelegramUrl } = await import("../../src/lib/webhooks/integrations/telegram.ts"); @@ -77,15 +78,7 @@ test("buildTelegramPayload — chat_id matches provided value for groups", () => }); test("buildTelegramPayload — all WEBHOOK_EVENTS produce valid payloads with chat_id", () => { - const events = [ - "request.completed", - "request.failed", - "provider.error", - "provider.recovered", - "quota.exceeded", - "combo.switched", - "test.ping", - ] as const; + const events = WEBHOOK_EVENT_VALUES; for (const event of events) { const payload = buildTelegramPayload(event, {}, "99999"); assert.equal(payload.chat_id, "99999"); diff --git a/tests/unit/webhooks-ghost-events.test.ts b/tests/unit/webhooks-ghost-events.test.ts index 427b0467a7..a5d26e6019 100644 --- a/tests/unit/webhooks-ghost-events.test.ts +++ b/tests/unit/webhooks-ghost-events.test.ts @@ -30,4 +30,16 @@ describe("webhook catalogue", () => { const { notifyWebhookEvent } = await import("../../src/lib/webhookDispatcher.ts"); assert.equal(typeof notifyWebhookEvent, "function"); }); + + it("every builder accepts every value in WEBHOOK_EVENT_VALUES without throwing", async () => { + const { buildDiscordPayload } = await import("../../src/lib/webhooks/integrations/discord.ts"); + const { buildSlackPayload } = await import("../../src/lib/webhooks/integrations/slack.ts"); + const { buildTelegramPayload } = + await import("../../src/lib/webhooks/integrations/telegram.ts"); + for (const event of WEBHOOK_EVENT_VALUES) { + assert.doesNotThrow(() => buildDiscordPayload(event, {})); + assert.doesNotThrow(() => buildSlackPayload(event, {})); + assert.doesNotThrow(() => buildTelegramPayload(event, {}, "99999")); + } + }); });