UNPKG

@x5e/gink

Version:

an eventually consistent database

230 lines 11.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const implementation_1 = require("../implementation"); const utils_1 = require("../implementation/utils"); it("isAlive and remove", async function () { for (const store of [ new implementation_1.IndexedDbStore("graph.test1", true), new implementation_1.MemoryStore(true), ]) { const instance = new implementation_1.Database(store); await instance.ready; const vertex = await instance.createVertex(); const aliveTime = (0, utils_1.generateTimestamp)(); (0, utils_1.ensure)(await vertex.isAlive()); await vertex.remove(); const deadTime = (0, utils_1.generateTimestamp)(); (0, utils_1.ensure)(!(await vertex.isAlive())); (0, utils_1.ensure)(await vertex.isAlive(aliveTime)); await vertex.revive(); (0, utils_1.ensure)(await vertex.isAlive()); (0, utils_1.ensure)(!(await vertex.isAlive(deadTime))); } }); it("edge_type.createEdge", async function () { for (const store of [ new implementation_1.IndexedDbStore("edge_type.createEdge", true), new implementation_1.MemoryStore(true), ]) { const instance = new implementation_1.Database(store); await instance.ready; const vertex1 = await instance.createVertex(); const vertex2 = await instance.createVertex(); const verb1 = await instance.createEdgeType(); const edge1 = await verb1.createEdge(vertex1, vertex2); (0, utils_1.ensure)(edge1.getSourceVertex().equals(vertex1)); (0, utils_1.ensure)(edge1.getTargetVertex().equals(vertex2)); (0, utils_1.ensure)(!edge1.getSourceVertex().equals(vertex2)); (0, utils_1.ensure)(edge1.getEdgeType().equals(verb1)); } }); it("from_to", async function () { for (const store of [ new implementation_1.IndexedDbStore("from_to", true), new implementation_1.MemoryStore(true), ]) { const instance = new implementation_1.Database(store); await instance.ready; const vertex1 = await instance.createVertex(); const vertex2 = await instance.createVertex(); const vertex3 = await instance.createVertex(); const edge_type = await instance.createEdgeType(); const beforeEdge12 = (0, utils_1.generateTimestamp)(); const edge12 = await edge_type.createEdge(vertex1, vertex2); const edge13 = await edge_type.createEdge(vertex1, vertex3); const edge11 = await edge_type.createEdge(vertex1, vertex1); const edge21 = await edge_type.createEdge(vertex2, vertex1); const edge22 = await edge_type.createEdge(vertex2, vertex2); const edge23 = await edge_type.createEdge(vertex2, vertex3); const edgesTo2 = await vertex2.getEdgesTo(); (0, utils_1.ensure)(edgesTo2.length === 2, `wtf: ${edgesTo2.length}`); (0, utils_1.ensure)(edgesTo2[0].equals(edge12) || edgesTo2[0].equals(edge22)); (0, utils_1.ensure)(edgesTo2[1].equals(edge12) || edgesTo2[1].equals(edge22)); (0, utils_1.ensure)(!edgesTo2[0].equals(edgesTo2[1])); const edgesFrom2 = await vertex2.getEdgesFrom(); (0, utils_1.ensure)(edgesFrom2.length === 3); (0, utils_1.ensure)(edgesFrom2[0].equals(edge21)); (0, utils_1.ensure)(edgesFrom2[1].equals(edge22)); (0, utils_1.ensure)(edgesFrom2[2].equals(edge23)); await edge11.remove(); const edgesFrom1 = await vertex1.getEdgesFrom(); (0, utils_1.ensure)(edgesFrom1.length === 2); (0, utils_1.ensure)(edgesFrom1[0].equals(edge12)); (0, utils_1.ensure)(edgesFrom1[1].equals(edge13)); // move edge13 to the front await edge13.remove(beforeEdge12); const edgesFrom1b = await vertex1.getEdgesFrom(); (0, utils_1.ensure)(edgesFrom1b.length === 2); (0, utils_1.ensure)(edgesFrom1b[0].equals(edge13)); (0, utils_1.ensure)(edgesFrom1b[1].equals(edge12)); } }); it("edge_reorder", async function () { for (const store of [ new implementation_1.IndexedDbStore("edge_reorder", true), new implementation_1.MemoryStore(true), ]) { const instance = new implementation_1.Database(store); await instance.ready; const a = await instance.createVertex(); const b = await instance.createVertex(); const p = await instance.createEdgeType(); const prop = await instance.createProperty(); const beforeX = (0, utils_1.generateTimestamp)(); const x = await p.createEdge(a, b); const y = await p.createEdge(a, b); await prop.set(y, "foo"); const afterX = (0, utils_1.generateTimestamp)(); const entries = await store.getAllEntries(); (0, utils_1.ensure)(entries.length === 3); const edges1 = await a.getEdgesFrom(); (0, utils_1.ensure)(edges1.length === 2 && edges1[0].equals(x) && edges1[1].equals(y), edges1.toString()); await y.remove(beforeX); const edges2 = await a.getEdgesFrom(); const newY = edges2[0]; (0, utils_1.ensure)(edges2.length === 2 && newY.equals(y) && edges2[1].equals(x), edges2.toString()); // make sure property gets set again on "new" edge (0, utils_1.ensure)((await prop.get(newY)) === "foo"); const edges3 = await b.getEdgesTo(afterX); (0, utils_1.ensure)(edges3.length === 2 && edges3[0].equals(x) && edges3[1].equals(y), edges3.toString()); const edges4 = await b.getEdgesTo(); (0, utils_1.ensure)(edges4.length === 2 && edges4[0].equals(y) && edges4[1].equals(x), edges4.toString()); } }); it("vertex reset", async function () { for (const store of [ new implementation_1.IndexedDbStore("vertex reset", true), new implementation_1.MemoryStore(true), ]) { const instance = new implementation_1.Database(store); await instance.ready; const vertex = await instance.createVertex(); const prop1 = await instance.createProperty(); const prop2 = await instance.createProperty(); await prop1.set(vertex, "foo"); await prop2.set(vertex, "bar"); const afterSet = (0, utils_1.generateTimestamp)(); await vertex.remove(); await prop1.set(vertex, "foo2"); await prop2.set(vertex, "bar2"); const afterSecond = (0, utils_1.generateTimestamp)(); await vertex.reset({ toTime: afterSet }); // Vertex should be alive again, and properties should be reset (0, utils_1.ensure)(await vertex.isAlive()); (0, utils_1.ensure)((await prop1.get(vertex)) === "foo"); (0, utils_1.ensure)((await prop2.get(vertex)) === "bar"); await vertex.reset({ toTime: afterSecond, skipProperties: true }); // Vertex should be removed and properties should not have changed. (0, utils_1.ensure)(!(await vertex.isAlive())); (0, utils_1.ensure)((await prop1.get(vertex)) === "foo"); (0, utils_1.ensure)((await prop2.get(vertex)) === "bar"); } }); it("edge_type reset", async function () { for (const store of [ new implementation_1.IndexedDbStore("edgetype reset", true), new implementation_1.MemoryStore(true), ]) { const instance = new implementation_1.Database(store); await instance.ready; const vertex1 = await instance.createVertex(); const vertex2 = await instance.createVertex(); const vertex3 = await instance.createVertex(); const edgeType = await instance.createEdgeType(); const edge1 = await edgeType.createEdge(vertex1, vertex2); const edge2 = await edgeType.createEdge(vertex2, vertex1); const prop1 = await instance.createProperty(); const prop2 = await instance.createProperty(); await prop1.set(edgeType, "foo"); await prop2.set(edgeType, "bar"); const afterInit = (0, utils_1.generateTimestamp)(); const edge3 = await edgeType.createEdge(vertex1, vertex3); await prop1.set(edgeType, "foo"); await prop2.set(edgeType, "baz"); const afterSecond = (0, utils_1.generateTimestamp)(); await edgeType.reset({ toTime: afterInit }); const edgesFrom1 = await vertex1.getEdgesFrom(); const edgesFrom2 = await vertex2.getEdgesFrom(); (0, utils_1.ensure)(edgesFrom1.length === 1); (0, utils_1.ensure)(edgesFrom2.length === 1); (0, utils_1.ensure)((await prop1.get(edgeType)) === "foo"); (0, utils_1.ensure)((await prop2.get(edgeType)) === "bar"); await edge1.remove(); (0, utils_1.ensure)((await vertex1.getEdgesFrom()).length === 0); await edgeType.reset({ toTime: afterSecond, skipProperties: true }); (0, utils_1.ensure)((await vertex1.getEdgesFrom()).length === 2); (0, utils_1.ensure)((await vertex2.getEdgesFrom()).length === 1); (0, utils_1.ensure)((await vertex3.getEdgesTo()).length === 1); (0, utils_1.ensure)((await prop1.get(edgeType)) === "foo"); (0, utils_1.ensure)((await prop2.get(edgeType)) === "bar"); } }); it("edge property restoration", async function () { for (const store of [ new implementation_1.IndexedDbStore("edge property restore", true), new implementation_1.MemoryStore(true), ]) { const instance = new implementation_1.Database(store); await instance.ready; const vertex1 = await instance.createVertex(); const vertex2 = await instance.createVertex(); const edgeType = await instance.createEdgeType(); const beforeEdges = (0, utils_1.generateTimestamp)(); const edge1 = await edgeType.createEdge(vertex1, vertex2); const edge2 = await edgeType.createEdge(vertex1, vertex2); const prop1 = await instance.createProperty(); const prop2 = await instance.createProperty(); await prop1.set(edge1, "p1e1"); await prop2.set(edge1, "p2e1"); await prop1.set(edge2, "p1e2"); await prop2.set(edge2, "p2e2"); const beforeRemove = (0, utils_1.generateTimestamp)(); await prop1.set(edge1, "changed"); await prop2.set(edge1, "changed"); await prop1.set(edge2, "changed"); await prop2.set(edge2, "changed"); await edge1.remove(); await edgeType.reset({ toTime: beforeRemove }); const edges = await vertex1.getEdgesFrom(); (0, utils_1.ensure)(edges.length === 2); (0, utils_1.ensure)((await prop1.get(edges[0])) === "p1e1"); (0, utils_1.ensure)((await prop2.get(edges[0])) === "p2e1"); (0, utils_1.ensure)((await prop1.get(edges[1])) === "p1e2"); (0, utils_1.ensure)((await prop2.get(edges[1])) === "p2e2"); // Move edge2 to the front await edge2.remove(beforeEdges); const edges2 = await vertex1.getEdgesFrom(); (0, utils_1.ensure)(edges2.length === 2); (0, utils_1.ensure)((await prop1.get(edges2[0])) === "p1e2"); (0, utils_1.ensure)((await prop2.get(edges2[0])) === "p2e2"); const beforePropDel = (0, utils_1.generateTimestamp)(); await prop2.delete(edges[0]); // delete e2 from prop2 (0, utils_1.ensure)((await prop2.get(edges[0])) === undefined); await edgeType.reset({ toTime: beforePropDel }); const edges3 = await vertex1.getEdgesFrom(); (0, utils_1.ensure)(edges3.length === 2); (0, utils_1.ensure)((await prop1.get(edges3[0])) === "p1e2"); (0, utils_1.ensure)((await prop2.get(edges3[0])) === "p2e2"); } }); //# sourceMappingURL=graph.test.js.map