35 lines
1.5 KiB
JavaScript
35 lines
1.5 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { relationshipMap, relationshipList, relationshipSet } from "../dist/index.js";
|
|
import { referenceFromWire } from "../dist/references.js";
|
|
test("relationship helpers preserve handles and require explicit collection revisions", async () => {
|
|
let current = { revision: 0n, entries: [] },
|
|
serial = 0;
|
|
const port = {
|
|
collection: async () => ({ revision: current.revision, entries: current.entries.map((entry) => ({ ...entry })) }),
|
|
replace: async (entries, revision) => {
|
|
assert.equal(revision, current.revision);
|
|
current = {
|
|
revision: revision + 1n,
|
|
entries: entries.map((entry) => ({ ...entry, edgeId: entry.edgeId ?? `edge:${++serial}` })),
|
|
};
|
|
return port.collection();
|
|
},
|
|
};
|
|
const a = referenceFromWire("obj:a"),
|
|
b = referenceFromWire("obj:b");
|
|
const map = relationshipMap(port);
|
|
await map.set("a1", a, 0n);
|
|
assert.equal((await map.get("a1")).value.equals(a), true);
|
|
await assert.rejects(() => map.set("b1", b, 0n), /STALE_COLLECTION/);
|
|
await map.delete("a1", 1n);
|
|
const list = relationshipList(port);
|
|
const inserted = await list.insert(0, a, 2n);
|
|
await list.insert(1, b, 3n);
|
|
const moved = await list.move(inserted.entries[0].edgeId, 1, 4n);
|
|
assert.equal(moved.entries[1].target.equals(a), true);
|
|
const set = relationshipSet(port);
|
|
const unchanged = await set.add(referenceFromWire("obj:a"), 5n);
|
|
assert.equal(unchanged.revision, 5n);
|
|
});
|