diff --git a/src/moderation/stickerCache.ts b/src/moderation/stickerCache.ts index b51e4b2..8fbba4f 100644 --- a/src/moderation/stickerCache.ts +++ b/src/moderation/stickerCache.ts @@ -33,6 +33,7 @@ export async function initStickerCache(): Promise { ); const row = await executeGet( "SELECT count(*) as cnt, COALESCE(SUM(size), 0) as total FROM sticker_cache", + [], ); if (row) { statsCache = { diff --git a/tests/moderation/indonesianTextNormalizer.remote.test.ts b/tests/moderation/indonesianTextNormalizer.remote.test.ts index 162f5fb..6a28856 100644 --- a/tests/moderation/indonesianTextNormalizer.remote.test.ts +++ b/tests/moderation/indonesianTextNormalizer.remote.test.ts @@ -2,23 +2,9 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { config } from "../../src/config"; const mocks = vi.hoisted(() => ({ - axiosPost: vi.fn(), openaiCreate: vi.fn(), })); -vi.mock("axios", () => ({ - default: { - post: mocks.axiosPost, - isAxiosError: (error: unknown) => - Boolean( - error && - typeof error === "object" && - "isAxiosError" in error && - (error as { isAxiosError?: unknown }).isAxiosError, - ), - }, -})); - vi.mock("openai", () => ({ default: class MockOpenAI { chat = { @@ -29,20 +15,13 @@ vi.mock("openai", () => ({ }, })); -describe("detectIndonesianBadwords remote fallback", () => { +describe("detectIndonesianBadwords primary AI", () => { beforeEach(() => { - mocks.axiosPost.mockReset(); mocks.openaiCreate.mockReset(); - config.NVIDIA_NEMOTRON_API_KEY = "test-nemotron-key"; config.AI_LLM_API_KEY = "test-primary-key"; }); - it("falls back to primary AI after Nemotron rate limits and caches the result", async () => { - mocks.axiosPost.mockRejectedValue({ - isAxiosError: true, - response: { status: 429 }, - message: "Too Many Requests", - }); + it("calls primary AI and caches the result", async () => { mocks.openaiCreate.mockResolvedValue({ choices: [ { @@ -62,7 +41,17 @@ describe("detectIndonesianBadwords remote fallback", () => { expect(first).toEqual(["harassment"]); expect(second).toEqual(["harassment"]); - expect(mocks.axiosPost).toHaveBeenCalledTimes(1); expect(mocks.openaiCreate).toHaveBeenCalledTimes(1); }); + + it("returns empty array when primary AI fails", async () => { + mocks.openaiCreate.mockRejectedValue(new Error("API down")); + + const { detectIndonesianBadwords } = await import( + "../../src/moderation/indonesianTextNormalizer" + ); + + const result = await detectIndonesianBadwords("some text"); + expect(result).toEqual([]); + }); }); diff --git a/tests/moderation/indonesianTextNormalizer.test.ts b/tests/moderation/indonesianTextNormalizer.test.ts index f2b0b21..fbe71c2 100644 --- a/tests/moderation/indonesianTextNormalizer.test.ts +++ b/tests/moderation/indonesianTextNormalizer.test.ts @@ -7,14 +7,10 @@ import { normalizeDiscordCustomEmoji, } from "../../src/moderation/indonesianTextNormalizer"; -const originalNemotronKey = config.NVIDIA_NEMOTRON_API_KEY; const originalPrimaryAiKey = config.AI_LLM_API_KEY; -const originalGroqKey = config.GROQ_API_KEY; function disableRemoteModeration(): void { - config.NVIDIA_NEMOTRON_API_KEY = undefined; config.AI_LLM_API_KEY = undefined; - config.GROQ_API_KEY = undefined; } disableRemoteModeration(); @@ -24,9 +20,7 @@ afterEach(() => { }); afterAll(() => { - config.NVIDIA_NEMOTRON_API_KEY = originalNemotronKey; config.AI_LLM_API_KEY = originalPrimaryAiKey; - config.GROQ_API_KEY = originalGroqKey; }); describe("normalizeDiscordCustomEmoji", () => {