53 lines
1.6 KiB
JavaScript
53 lines
1.6 KiB
JavaScript
import { migrate } from "../db.js";
|
|
import { createKvApi, kvDelete } from "../kv-store.js";
|
|
import { runScriptSource } from "../script-sandbox.js";
|
|
import { log } from "../logger.js";
|
|
|
|
await migrate();
|
|
|
|
const ns = "test/kv-smoke";
|
|
await kvDelete(ns, "counter");
|
|
await kvDelete(ns, "cas");
|
|
|
|
const api = createKvApi(ns);
|
|
|
|
await api.set("counter", { n: 1 });
|
|
const v1 = await api.get("counter");
|
|
if (v1?.n !== 1) throw new Error(`expected n=1, got ${JSON.stringify(v1)}`);
|
|
|
|
const casFail = await api.compareAndSet("cas", null, { first: true });
|
|
if (!casFail.ok || casFail.previous !== null) {
|
|
throw new Error(`first CAS failed: ${JSON.stringify(casFail)}`);
|
|
}
|
|
|
|
const casFail2 = await api.compareAndSet("cas", null, { second: true });
|
|
if (casFail2.ok) throw new Error("second CAS with null expected should fail");
|
|
|
|
const casOk = await api.compareAndSet("cas", { first: true }, { second: true });
|
|
if (!casOk.ok) throw new Error("CAS update should succeed");
|
|
|
|
const listed = await api.list();
|
|
if (!listed.some((item) => item.key === "cas")) {
|
|
throw new Error(`list missing cas: ${JSON.stringify(listed)}`);
|
|
}
|
|
|
|
const script = `
|
|
export default async function () {
|
|
const prev = await $kv.get("script-key");
|
|
await $kv.set("script-key", { prev, now: Date.now() });
|
|
return { prev, namespace: $kv.namespace };
|
|
}
|
|
`;
|
|
|
|
const out = await runScriptSource("kv-smoke.js", script, { data: {} }, {
|
|
log,
|
|
workflowName: ns,
|
|
});
|
|
if (out.namespace !== ns) throw new Error(`wrong namespace: ${out.namespace}`);
|
|
|
|
await kvDelete(ns, "counter");
|
|
await kvDelete(ns, "cas");
|
|
await kvDelete(ns, "script-key");
|
|
|
|
console.log("kv smoke test passed");
|