Add Automerge CRDT datatype helpers
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import assert from "node:assert/strict";
|
||||
import test from "node:test";
|
||||
import * as Automerge from "@automerge/automerge";
|
||||
import {
|
||||
createAutomergeFieldValue,
|
||||
loadAutomergeFieldDoc,
|
||||
materializeAutomergeFieldValue,
|
||||
mergeAutomergeFieldValues,
|
||||
saveAutomergeFieldDoc,
|
||||
} from "../src/crdt-automerge.js";
|
||||
|
||||
const type = "camino.CrdtJson";
|
||||
|
||||
test("Automerge CRDT fields lift plain values into stored envelopes", () => {
|
||||
const stored = createAutomergeFieldValue({ title: "draft" }, type);
|
||||
|
||||
assert.equal(stored.$caminoCrdtType, type);
|
||||
assert.equal(stored.$caminoCrdtEncoding, "base64");
|
||||
assert.deepEqual(materializeAutomergeFieldValue(stored, type), {
|
||||
title: "draft",
|
||||
});
|
||||
});
|
||||
|
||||
test("Automerge CRDT fields merge divergent saved documents", () => {
|
||||
const base = loadAutomergeFieldDoc(
|
||||
createAutomergeFieldValue({ left: false, right: false }, type),
|
||||
type,
|
||||
);
|
||||
const left = Automerge.change(Automerge.clone(base, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), (doc) => {
|
||||
(doc.value as { left: boolean }).left = true;
|
||||
});
|
||||
const right = Automerge.change(Automerge.clone(base, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), (doc) => {
|
||||
(doc.value as { right: boolean }).right = true;
|
||||
});
|
||||
|
||||
const result = mergeAutomergeFieldValues({
|
||||
existing: saveAutomergeFieldDoc(left, type),
|
||||
incoming: saveAutomergeFieldDoc(right, type),
|
||||
type,
|
||||
});
|
||||
|
||||
assert.deepEqual(result.materialized, { left: true, right: true });
|
||||
assert.deepEqual(materializeAutomergeFieldValue(result.stored, type), {
|
||||
left: true,
|
||||
right: true,
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user