From eeabc2cf69a0fbe1036e37542151db8e2b82add0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 15 Aug 2026 10:50:46 -0700 Subject: [PATCH] test(telegram): remove probe cache reset (#124219) --- extensions/telegram/api.ts | 7 +---- .../probe.abort-signal.integration.test.ts | 3 +-- ....response-body-timeout.integration.test.ts | 7 ++--- .../src/probe.response-body-timeout.test.ts | 12 +++++---- extensions/telegram/src/probe.test.ts | 27 +++++++------------ extensions/telegram/src/probe.ts | 24 ++++------------- 6 files changed, 27 insertions(+), 53 deletions(-) diff --git a/extensions/telegram/api.ts b/extensions/telegram/api.ts index 48fb66cd3a02..1f725884c575 100644 --- a/extensions/telegram/api.ts +++ b/extensions/telegram/api.ts @@ -139,12 +139,7 @@ export { parseTelegramReplyToMessageId, parseTelegramThreadId, } from "./src/outbound-params.js"; -export { - probeTelegram, - resetTelegramProbeFetcherCacheForTests, - type TelegramProbe, - type TelegramProbeOptions, -} from "./src/probe.js"; +export { probeTelegram, type TelegramProbe, type TelegramProbeOptions } from "./src/probe.js"; export { type ResolvedReactionLevel, resolveTelegramReactionLevel, diff --git a/extensions/telegram/src/probe.abort-signal.integration.test.ts b/extensions/telegram/src/probe.abort-signal.integration.test.ts index 95006f7fff51..a59128485729 100644 --- a/extensions/telegram/src/probe.abort-signal.integration.test.ts +++ b/extensions/telegram/src/probe.abort-signal.integration.test.ts @@ -3,7 +3,7 @@ import { createServer, type IncomingMessage, type Server } from "node:http"; import type { AddressInfo, Socket } from "node:net"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; -import { probeTelegram, resetTelegramProbeFetcherCacheForTests } from "./probe.js"; +import { probeTelegram } from "./probe.js"; describe("probeTelegram startup retry loop honors abortSignal", () => { let server: Server; @@ -60,7 +60,6 @@ describe("probeTelegram startup retry loop honors abortSignal", () => { }); afterAll(async () => { - resetTelegramProbeFetcherCacheForTests(); vi.unstubAllEnvs(); for (const socket of liveSockets) { socket.destroy(); diff --git a/extensions/telegram/src/probe.response-body-timeout.integration.test.ts b/extensions/telegram/src/probe.response-body-timeout.integration.test.ts index 10f4c03f2fd7..8d32f913ae20 100644 --- a/extensions/telegram/src/probe.response-body-timeout.integration.test.ts +++ b/extensions/telegram/src/probe.response-body-timeout.integration.test.ts @@ -3,7 +3,7 @@ import { createServer, type Server } from "node:http"; import type { AddressInfo, Socket } from "node:net"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; -import { probeTelegram, resetTelegramProbeFetcherCacheForTests } from "./probe.js"; +import { probeTelegram } from "./probe.js"; type ResponseMode = "stall" | "trickle"; @@ -62,7 +62,6 @@ describe("probeTelegram response body deadlines over real sockets", () => { }); afterAll(async () => { - resetTelegramProbeFetcherCacheForTests(); vi.unstubAllEnvs(); for (const interval of activeIntervals) { clearInterval(interval); @@ -75,12 +74,14 @@ describe("probeTelegram response body deadlines over real sockets", () => { }); }); + let probeIndex = 0; + async function expectDeadlineFailure(mode: ResponseMode, expectedError: RegExp) { responseMode = mode; const previousRequestCount = requestCount; const previousClosedSocketCount = closedSocketCount; - const result = await probeTelegram("placeholder", 200, { + const result = await probeTelegram(`deadline-${mode}-${++probeIndex}`, 200, { apiRoot, includeWebhookInfo: false, }); diff --git a/extensions/telegram/src/probe.response-body-timeout.test.ts b/extensions/telegram/src/probe.response-body-timeout.test.ts index d493b6773587..bf7173eae8f6 100644 --- a/extensions/telegram/src/probe.response-body-timeout.test.ts +++ b/extensions/telegram/src/probe.response-body-timeout.test.ts @@ -1,6 +1,6 @@ // Telegram tests cover stalled diagnostic response body handling. import { afterEach, describe, expect, it, vi, type Mock } from "vitest"; -import { probeTelegram, resetTelegramProbeFetcherCacheForTests } from "./probe.js"; +import { probeTelegram } from "./probe.js"; const resolveTelegramTransport = vi.hoisted(() => vi.fn()); const makeProxyFetch = vi.hoisted(() => vi.fn()); @@ -85,8 +85,10 @@ function makeTricklingJsonResponse(cancel: (reason?: unknown) => void): Response } describe("probeTelegram response body timeouts", () => { + let tokenIndex = 0; + const nextToken = () => `response-body-${++tokenIndex}`; + afterEach(() => { - resetTelegramProbeFetcherCacheForTests(); resolveTelegramTransport.mockReset(); makeProxyFetch.mockReset(); vi.useRealTimers(); @@ -107,7 +109,7 @@ describe("probeTelegram response body timeouts", () => { ); vi.useFakeTimers(); - const probePromise = probeTelegram("placeholder", 50, { + const probePromise = probeTelegram(nextToken(), 50, { includeWebhookInfo: false, }); await vi.advanceTimersByTimeAsync(0); @@ -127,7 +129,7 @@ describe("probeTelegram response body timeouts", () => { vi.useFakeTimers(); fetchMock.mockResolvedValueOnce(makeTricklingJsonResponse(cancel)); - const probePromise = probeTelegram("placeholder", 100, { + const probePromise = probeTelegram(nextToken(), 100, { includeWebhookInfo: false, }); await vi.advanceTimersByTimeAsync(0); @@ -155,7 +157,7 @@ describe("probeTelegram response body timeouts", () => { ); vi.useFakeTimers(); - const probePromise = probeTelegram("placeholder", 50); + const probePromise = probeTelegram(nextToken(), 50); await vi.advanceTimersByTimeAsync(0); await vi.advanceTimersByTimeAsync(60); diff --git a/extensions/telegram/src/probe.test.ts b/extensions/telegram/src/probe.test.ts index 0a439175ba3c..e1a7edaafaaa 100644 --- a/extensions/telegram/src/probe.test.ts +++ b/extensions/telegram/src/probe.test.ts @@ -1,7 +1,7 @@ // Telegram tests cover probe plugin behavior. import { withFetchPreconnect } from "openclaw/plugin-sdk/test-env"; -import { afterEach, describe, expect, it, vi, type Mock } from "vitest"; -import { probeTelegram, resetTelegramProbeFetcherCacheForTests } from "./probe.js"; +import { afterEach, beforeEach, describe, expect, it, vi, type Mock } from "vitest"; +import { probeTelegram } from "./probe.js"; const resolveTelegramTransport = vi.hoisted(() => vi.fn()); const makeProxyFetch = vi.hoisted(() => vi.fn()); @@ -31,8 +31,9 @@ vi.mock("openclaw/plugin-sdk/response-limit-runtime", async (importOriginal) => }); describe("probeTelegram retry logic", () => { - const token = "test-token"; const timeoutMs = 5000; + let tokenIndex = 0; + let token = ""; const originalFetch = global.fetch; let forceFallbackMock: Mock; @@ -92,11 +93,13 @@ describe("probeTelegram retry logic", () => { expect(result.bot?.username).toBe("test_bot"); } + beforeEach(() => { + token = `test-token-${++tokenIndex}`; + }); + afterEach(() => { - resetTelegramProbeFetcherCacheForTests(); resolveTelegramTransport.mockReset(); makeProxyFetch.mockReset(); - vi.unstubAllEnvs(); vi.clearAllMocks(); if (originalFetch) { global.fetch = originalFetch; @@ -237,7 +240,7 @@ describe("probeTelegram retry logic", () => { allows_users_to_create_topics: false, }); expect(fetchMock).toHaveBeenCalledTimes(1); - expect(fetchMock.mock.calls.at(0)?.[0]).toBe("https://api.telegram.org/bottest-token/getMe"); + expect(fetchMock.mock.calls.at(0)?.[0]).toBe(`https://api.telegram.org/bot${token}/getMe`); }); it("uses resolver-scoped Telegram fetch with probe network options", async () => { @@ -264,9 +267,6 @@ describe("probeTelegram retry logic", () => { it("reuses probe fetcher across repeated probes for the same account transport settings", async () => { const fetchMock = installFetchMock(); - vi.stubEnv("VITEST", ""); - vi.stubEnv("NODE_ENV", "production"); - mockGetMeSuccess(fetchMock); mockGetWebhookInfoSuccess(fetchMock); await probeTelegram(`${token}-cache`, timeoutMs, { @@ -290,9 +290,6 @@ describe("probeTelegram retry logic", () => { it("does not reuse probe fetcher cache when network settings differ", async () => { const fetchMock = installFetchMock(); - vi.stubEnv("VITEST", ""); - vi.stubEnv("NODE_ENV", "production"); - mockGetMeSuccess(fetchMock); mockGetWebhookInfoSuccess(fetchMock); await probeTelegram(`${token}-cache-variant`, timeoutMs, { @@ -327,9 +324,6 @@ describe("probeTelegram retry logic", () => { close, }; }); - vi.stubEnv("VITEST", ""); - vi.stubEnv("NODE_ENV", "production"); - for (let i = 0; i < 65; i += 1) { mockGetMeSuccess(fetchMock); mockGetWebhookInfoSuccess(fetchMock); @@ -349,9 +343,6 @@ describe("probeTelegram retry logic", () => { it("reuses probe fetcher cache across token rotation when accountId is stable", async () => { const fetchMock = installFetchMock(); - vi.stubEnv("VITEST", ""); - vi.stubEnv("NODE_ENV", "production"); - mockGetMeSuccess(fetchMock); mockGetWebhookInfoSuccess(fetchMock); await probeTelegram(`${token}-old`, timeoutMs, { diff --git a/extensions/telegram/src/probe.ts b/extensions/telegram/src/probe.ts index 10e488f76df5..283f079318bc 100644 --- a/extensions/telegram/src/probe.ts +++ b/extensions/telegram/src/probe.ts @@ -49,10 +49,6 @@ const MAX_PROBE_TRANSPORT_CACHE_SIZE = 64; // 4 MiB guards against a misbehaving or hostile API endpoint streaming an oversized payload. const TELEGRAM_BOT_API_MAX_RESPONSE_BYTES = 4 * 1024 * 1024; -export function resetTelegramProbeFetcherCacheForTests(): void { - probeTransportCache.clear(); -} - function resolveProbeOptions( proxyOrOptions?: string | TelegramProbeOptions, ): TelegramProbeOptions | undefined { @@ -65,10 +61,6 @@ function resolveProbeOptions( return proxyOrOptions; } -function shouldUseProbeTransportCache(): boolean { - return !process.env.VITEST && process.env.NODE_ENV !== "test"; -} - function buildProbeTransportCacheKey(token: string, options?: TelegramProbeOptions): string { const cacheIdentity = options?.accountId?.trim() || token; const cacheIdentityKind = options?.accountId?.trim() ? "account" : "token"; @@ -98,13 +90,10 @@ function setCachedProbeTransport( } function resolveProbeTransport(token: string, options?: TelegramProbeOptions): TelegramTransport { - const cacheEnabled = shouldUseProbeTransportCache(); - const cacheKey = cacheEnabled ? buildProbeTransportCacheKey(token, options) : null; - if (cacheKey) { - const cached = probeTransportCache.get(cacheKey); - if (cached) { - return cached; - } + const cacheKey = buildProbeTransportCacheKey(token, options); + const cached = probeTransportCache.get(cacheKey); + if (cached) { + return cached; } const proxyUrl = options?.proxyUrl?.trim(); @@ -113,10 +102,7 @@ function resolveProbeTransport(token: string, options?: TelegramProbeOptions): T network: options?.network, }); - if (cacheKey) { - return setCachedProbeTransport(cacheKey, transport); - } - return transport; + return setCachedProbeTransport(cacheKey, transport); } function normalizeBoolean(value: unknown): boolean | null {