deno/tests/unit/kv_queue_undelivered_test.ts
Matt Mastracci f5e46c9bf2
chore: move cli/tests/ -> tests/ (#22369)
This looks like a massive PR, but it's only a move from cli/tests ->
tests, and updates of relative paths for files.

This is the first step towards aggregate all of the integration test
files under tests/, which will lead to a set of integration tests that
can run without the CLI binary being built.

While we could leave these tests under `cli`, it would require us to
keep a more complex directory structure for the various test runners. In
addition, we have a lot of complexity to ignore various test files in
the `cli` project itself (cargo publish exclusion rules, autotests =
false, etc).

And finally, the `tests/` folder will eventually house the `test_ffi`,
`test_napi` and other testing code, reducing the size of the root repo
directory.

For easier review, the extremely large and noisy "move" is in the first
commit (with no changes -- just a move), while the remainder of the
changes to actual files is in the second commit.
2024-02-10 20:22:13 +00:00

60 lines
1.7 KiB
TypeScript

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { assertEquals } from "./test_util.ts";
const sleep = (time: number) => new Promise((r) => setTimeout(r, time));
// TODO(igorzi): https://github.com/denoland/deno/issues/21437
// let isCI: boolean;
// try {
// isCI = Deno.env.get("CI") !== undefined;
// } catch {
// isCI = true;
// }
function queueTest(name: string, fn: (db: Deno.Kv) => Promise<void>) {
// TODO(igorzi): https://github.com/denoland/deno/issues/21437
Deno.test.ignore({
name,
// https://github.com/denoland/deno/issues/18363
// ignore: Deno.build.os === "darwin" && isCI,
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"]],
backoffSchedule: [10, 20],
});
await sleep(3000);
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;
}
});