Path: blob/master/src/packages/backend/conat/test/sync/dkv-basics.test.ts
1451 views
/*1DEVELOPMENT:23pnpm test ./dkv-basics.test.ts45*/6import { DKV } from "@cocalc/conat/sync/dkv";7import { connect, before, after } from "@cocalc/backend/conat/test/setup";8import { wait } from "@cocalc/backend/conat/test/util";910beforeAll(before);1112describe("create a general kv and do basic operations", () => {13const name = "test";14let client, kv;1516it("creates the kv", async () => {17client = connect();18kv = new DKV({ name, client });19await kv.init();20});2122it("sets and deletes a key", async () => {23expect(kv.has("foo")).toBe(false);24kv.set("foo", 10);25expect(kv.has("foo")).toBe(true);26expect(kv.getAll()).toEqual({ foo: 10 });27kv.delete("foo");28expect(kv.getAll()).toEqual({});29kv.set("co", "nat");30await kv.save();31});3233let client2, kv2;34it("view the kv from a second client via sync, set a date value and observe it syncs", async () => {35client2 = connect();36kv2 = new DKV({ name, client: client2 });37await kv2.init();38expect(kv2.getAll()).toEqual({ co: "nat" });3940const date = new Date("1974");41kv2.set("x", date);42// replication is not instant43expect(kv.get("x")).toBe(undefined);44await kv2.save();45await wait({ until: () => kv.get("x") });46expect(kv.getAll()).toEqual({ x: date, co: "nat" });47});4849it("checks that clear works", async () => {50kv.clear();51await wait({ until: () => kv.length == 0 });52expect(kv.length).toBe(0);53await wait({ until: () => kv2.length == 0 });54});5556it("checks that time works", async () => {57const key = "x".repeat(10000);58kv.set(key, "big key");59await kv.save();60expect(Math.abs(Date.now() - kv.time(key))).toBeLessThan(300);61expect(kv.time()).toEqual({ [key]: kv.time(key) });62expect(kv2.time()).toEqual({ [key]: kv2.time(key) });63});6465it("check headers work", async () => {66kv.set("big", "headers", { headers: { silicon: "valley", x: { y: "z" } } });67// this uses local state68expect(kv.headers("big")).toEqual({ silicon: "valley", x: { y: "z" } });69await kv.save();70// this uses what got echoed back from server71expect(kv.headers("big")).toEqual({ silicon: "valley", x: { y: "z" } });72expect(kv2.headers("big")).toEqual({ silicon: "valley", x: { y: "z" } });73});7475it("checks hasUnsavedChanges works", async () => {76expect(kv.hasUnsavedChanges()).toBe(false);77kv.set("unsaved", ["changes"]);78expect(kv.hasUnsavedChanges()).toBe(true);79expect(kv.unsavedChanges()).toEqual(["unsaved"]);80expect(kv2.hasUnsavedChanges()).toBe(false);81await kv.save();82expect(kv.hasUnsavedChanges()).toBe(false);83});8485it("checks stats works", () => {86const { bytes, count } = kv.stats();87expect(bytes).not.toBeNaN();88expect(bytes).toBeGreaterThan(0);89expect(count).not.toBeNaN();90expect(count).toBeGreaterThan(0);91});9293it("checks seq is ", async () => {94kv.set("x", "11");95await kv.save();96const seq = kv.seq("x");97expect(seq).toBeGreaterThan(0);98kv.set("x", 15);99await kv.save();100expect(kv.seq("x") - seq).toBe(1);101});102103it("clean up", async () => {104kv.close();105client.close();106});107});108109afterAll(after);110111112