mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 11:41:24 +00:00
perf(test): speed up telegram media retry tests
This commit is contained in:
@@ -82,6 +82,10 @@ function setupTransientGetFileRetry() {
|
|||||||
return getFile;
|
return getFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function flushRetryTimers() {
|
||||||
|
await vi.runAllTimersAsync();
|
||||||
|
}
|
||||||
|
|
||||||
describe("resolveMedia getFile retry", () => {
|
describe("resolveMedia getFile retry", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
vi.useFakeTimers();
|
vi.useFakeTimers();
|
||||||
@@ -96,7 +100,7 @@ describe("resolveMedia getFile retry", () => {
|
|||||||
it("retries getFile on transient failure and succeeds on second attempt", async () => {
|
it("retries getFile on transient failure and succeeds on second attempt", async () => {
|
||||||
const getFile = setupTransientGetFileRetry();
|
const getFile = setupTransientGetFileRetry();
|
||||||
const promise = resolveMedia(makeCtx("voice", getFile), MAX_MEDIA_BYTES, BOT_TOKEN);
|
const promise = resolveMedia(makeCtx("voice", getFile), MAX_MEDIA_BYTES, BOT_TOKEN);
|
||||||
await vi.advanceTimersByTimeAsync(5000);
|
await flushRetryTimers();
|
||||||
const result = await promise;
|
const result = await promise;
|
||||||
|
|
||||||
expect(getFile).toHaveBeenCalledTimes(2);
|
expect(getFile).toHaveBeenCalledTimes(2);
|
||||||
@@ -105,16 +109,19 @@ describe("resolveMedia getFile retry", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("returns null when all getFile retries fail so message is not dropped", async () => {
|
it.each(["voice", "photo", "video"] as const)(
|
||||||
const getFile = vi.fn().mockRejectedValue(new Error("Network request for 'getFile' failed!"));
|
"returns null for %s when getFile exhausts retries so message is not dropped",
|
||||||
|
async (mediaField) => {
|
||||||
|
const getFile = vi.fn().mockRejectedValue(new Error("Network request for 'getFile' failed!"));
|
||||||
|
|
||||||
const promise = resolveMedia(makeCtx("voice", getFile), MAX_MEDIA_BYTES, BOT_TOKEN);
|
const promise = resolveMedia(makeCtx(mediaField, getFile), MAX_MEDIA_BYTES, BOT_TOKEN);
|
||||||
await vi.advanceTimersByTimeAsync(15000);
|
await flushRetryTimers();
|
||||||
const result = await promise;
|
const result = await promise;
|
||||||
|
|
||||||
expect(getFile).toHaveBeenCalledTimes(3);
|
expect(getFile).toHaveBeenCalledTimes(3);
|
||||||
expect(result).toBeNull();
|
expect(result).toBeNull();
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
it("does not catch errors from fetchRemoteMedia (only getFile is retried)", async () => {
|
it("does not catch errors from fetchRemoteMedia (only getFile is retried)", async () => {
|
||||||
const getFile = vi.fn().mockResolvedValue({ file_path: "voice/file_0.oga" });
|
const getFile = vi.fn().mockResolvedValue({ file_path: "voice/file_0.oga" });
|
||||||
@@ -127,20 +134,6 @@ describe("resolveMedia getFile retry", () => {
|
|||||||
expect(getFile).toHaveBeenCalledTimes(1);
|
expect(getFile).toHaveBeenCalledTimes(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it.each(["photo", "video"] as const)(
|
|
||||||
"returns null for %s when getFile exhausts retries",
|
|
||||||
async (mediaField) => {
|
|
||||||
const getFile = vi.fn().mockRejectedValue(new Error("HttpError: Network error"));
|
|
||||||
|
|
||||||
const promise = resolveMedia(makeCtx(mediaField, getFile), MAX_MEDIA_BYTES, BOT_TOKEN);
|
|
||||||
await vi.advanceTimersByTimeAsync(15000);
|
|
||||||
const result = await promise;
|
|
||||||
|
|
||||||
expect(getFile).toHaveBeenCalledTimes(3);
|
|
||||||
expect(result).toBeNull();
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
it("does not retry 'file is too big' error (400 Bad Request) and returns null", async () => {
|
it("does not retry 'file is too big' error (400 Bad Request) and returns null", async () => {
|
||||||
// Simulate Telegram Bot API error when file exceeds 20MB limit
|
// Simulate Telegram Bot API error when file exceeds 20MB limit
|
||||||
const fileTooBigError = new Error(
|
const fileTooBigError = new Error(
|
||||||
@@ -188,7 +181,7 @@ describe("resolveMedia getFile retry", () => {
|
|||||||
it("still retries transient errors even after encountering file too big in different call", async () => {
|
it("still retries transient errors even after encountering file too big in different call", async () => {
|
||||||
const getFile = setupTransientGetFileRetry();
|
const getFile = setupTransientGetFileRetry();
|
||||||
const promise = resolveMedia(makeCtx("voice", getFile), MAX_MEDIA_BYTES, BOT_TOKEN);
|
const promise = resolveMedia(makeCtx("voice", getFile), MAX_MEDIA_BYTES, BOT_TOKEN);
|
||||||
await vi.advanceTimersByTimeAsync(5000);
|
await flushRetryTimers();
|
||||||
const result = await promise;
|
const result = await promise;
|
||||||
|
|
||||||
// Should retry transient errors
|
// Should retry transient errors
|
||||||
|
|||||||
Reference in New Issue
Block a user