Path: blob/master/src/packages/backend/conat/test/sync/akv.test.ts
1451 views
/*1Testing basic ops with dkv23DEVELOPMENT:45pnpm test ./akv.test.ts67*/89import { dkv as createDkv, akv as createAkv } from "@cocalc/backend/conat/sync";10import { wait } from "@cocalc/backend/conat/test/util";11import { before, after, connect } from "@cocalc/backend/conat/test/setup";1213beforeAll(before);1415describe("test basics with an akv", () => {16let kv, client;17const name = `test-${Math.random()}`;1819it("creates the akv, then set and read a value", async () => {20client = connect();21kv = createAkv({ name, client });22await kv.set("x", 10);23expect(await kv.get("x")).toBe(10);24});2526it("reads a value that isn't there and gets undefined", async () => {27expect(await kv.get("y")).toBe(undefined);28});2930it("writes and reads null and gets null", async () => {31await kv.set("y", null);32expect(await kv.get("y")).toBe(null);33});3435it("gets all keys", async () => {36expect(await kv.keys()).toEqual(["x", "y"]);37});3839it("check that deleting a value works", async () => {40await kv.delete("x");41expect(await kv.get("x")).toBe(undefined);42});4344it("cleans up", async () => {45const k = await createDkv({ name, client });46k.clear();47await k.close();48});49});5051describe("test interop with a dkv", () => {52let akv, dkv, client;53const name = `test-${Math.random()}`;5455it("creates the akv and dkv", async () => {56client = connect();57akv = createAkv({ name, client });58dkv = await createDkv({ name, client });59});6061it("sets value in the dkv and reads it using the akv", async () => {62dkv.set("x", 25);63await dkv.save();64expect(await akv.get("x")).toBe(25);65});6667it("sets value in the akv and reads it using the dkv", async () => {68await akv.set("z", 389);69await wait({ until: () => dkv.has("z") });70expect(await dkv.get("z")).toBe(389);71});7273it("check headers work", async () => {74dkv.set("h", 10, { headers: { foo: "bar" } });75await dkv.save();76expect(await akv.headers("h")).toEqual(77expect.objectContaining({ foo: "bar" }),78);7980await akv.set("h2", 20, { headers: { foo: "baz" } });81expect(await akv.headers("h2")).toEqual(82expect.objectContaining({ foo: "baz" }),83);84await wait({ until: () => dkv.has("h2") });85expect(await dkv.headers("h2")).toEqual(86expect.objectContaining({ foo: "baz" }),87);88});8990it("check sqlite query fails", async () => {91await expect(async () => {92await akv.sqlite("SELECT count(*) AS n FROM messages");93}).rejects.toThrowError("sqlite command not currently supported");94});9596// it("check sqlite query works", async () => {97// const v = await akv.sqlite("SELECT count(*) AS n FROM messages");98// expect(v[0].n).toBe((await akv.keys()).length);99// });100101it("cleans up", async () => {102dkv.clear();103await dkv.close();104});105});106107describe("testing writing and reading chunked data", () => {108let maxPayload = 0;109let client;110111it("sanity check on the max payload", async () => {112client = connect();113await wait({ until: () => client.info != null });114maxPayload = client.info?.max_payload ?? 0;115expect(maxPayload).toBeGreaterThan(500000);116});117118let kv;119const name = `test-${Math.random()}`;120it("creates akv, then set and read a large value", async () => {121kv = createAkv({ name, client });122const val = "z".repeat(maxPayload * 1.5) + "cocalc";123await kv.set("x", val);124expect(await kv.get("x")).toBe(val);125});126127it("cleans up", async () => {128const k = await createDkv({ name, client });129k.clear();130await k.close();131});132});133134afterAll(after);135136137