2024-01-01 14:58:21 -05:00
|
|
|
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
|
2023-06-13 20:49:57 -04:00
|
|
|
import { assertEquals } from "./test_util.ts";
|
|
|
|
|
|
|
|
const sleep = (time: number) => new Promise((r) => setTimeout(r, time));
|
|
|
|
|
2023-12-05 19:53:16 -05:00
|
|
|
// TODO(igorzi): https://github.com/denoland/deno/issues/21437
|
|
|
|
// let isCI: boolean;
|
|
|
|
// try {
|
|
|
|
// isCI = Deno.env.get("CI") !== undefined;
|
|
|
|
// } catch {
|
|
|
|
// isCI = true;
|
|
|
|
// }
|
2023-06-13 20:49:57 -04:00
|
|
|
|
|
|
|
function queueTest(name: string, fn: (db: Deno.Kv) => Promise<void>) {
|
2023-12-05 19:53:16 -05:00
|
|
|
// TODO(igorzi): https://github.com/denoland/deno/issues/21437
|
|
|
|
Deno.test.ignore({
|
2023-06-13 20:49:57 -04:00
|
|
|
name,
|
|
|
|
// https://github.com/denoland/deno/issues/18363
|
2023-12-05 19:53:16 -05:00
|
|
|
// ignore: Deno.build.os === "darwin" && isCI,
|
2023-06-13 20:49:57 -04:00
|
|
|
async fn() {
|
|
|
|
const db: Deno.Kv = await Deno.openKv(
|
|
|
|
":memory:",
|
|
|
|
);
|
|
|
|
await fn(db);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function collect<T>(
|
|
|
|
iter: Deno.KvListIterator<T>,
|
|
|
|
): Promise<Deno.KvEntry<T>[]> {
|
|
|
|
const entries: Deno.KvEntry<T>[] = [];
|
|
|
|
for await (const entry of iter) {
|
|
|
|
entries.push(entry);
|
|
|
|
}
|
|
|
|
return entries;
|
|
|
|
}
|
|
|
|
|
|
|
|
queueTest("queue with undelivered", async (db) => {
|
|
|
|
const listener = db.listenQueue((_msg) => {
|
|
|
|
throw new TypeError("dequeue error");
|
|
|
|
});
|
|
|
|
try {
|
|
|
|
await db.enqueue("test", {
|
|
|
|
keysIfUndelivered: [["queue_failed", "a"], ["queue_failed", "b"]],
|
2023-12-13 01:51:23 -05:00
|
|
|
backoffSchedule: [10, 20],
|
2023-06-13 20:49:57 -04:00
|
|
|
});
|
2023-12-13 01:51:23 -05:00
|
|
|
await sleep(3000);
|
2023-06-13 20:49:57 -04:00
|
|
|
const undelivered = await collect(db.list({ prefix: ["queue_failed"] }));
|
|
|
|
assertEquals(undelivered.length, 2);
|
|
|
|
assertEquals(undelivered[0].key, ["queue_failed", "a"]);
|
|
|
|
assertEquals(undelivered[0].value, "test");
|
|
|
|
assertEquals(undelivered[1].key, ["queue_failed", "b"]);
|
|
|
|
assertEquals(undelivered[1].value, "test");
|
|
|
|
} finally {
|
|
|
|
db.close();
|
|
|
|
await listener;
|
|
|
|
}
|
|
|
|
});
|