UNPKG

@irrelon/forerunnerdb-core

Version:

ForerunnerDB core utilities for operating on JSON data.

356 lines (307 loc) 11.2 kB
import assert from "assert"; import Collection from "./Collection"; describe("Collection", () => { describe("operation()", () => { describe("Positive Path", () => { it("Can run an operation and provide the correct result", () => { const coll = new Collection(); const result = coll.operation({ "_id": "1" }, coll.indexViolationCheck); assert.strictEqual(result.success.length, 1, "Correct"); assert.strictEqual(result.success[0].type, "INDEX_VIOLATION_CHECK_SUCCESS", "Correct"); }); it("Can run multiple operations and provide the correct result", () => { const coll = new Collection(); const result = coll.operation([{ "_id": "1" }, { "_id": "2" }], coll.indexViolationCheck); assert.strictEqual(result.success.length, 2, "Correct"); assert.strictEqual(result.success[0].type, "INDEX_VIOLATION_CHECK_SUCCESS", "Correct"); assert.strictEqual(result.success[1].type, "INDEX_VIOLATION_CHECK_SUCCESS", "Correct"); }); }); describe("Negative Path", () => { it("Can run an operation and provide the correct result", async () => { const coll = new Collection(); await coll.insert({ "_id": "1" }); const result = coll.operation({ "_id": "1" }, coll.indexViolationCheck); assert.strictEqual(result.success.length, 0, "Correct"); assert.strictEqual(result.failure.length, 1, "Correct"); assert.strictEqual(result.failure[0].type, "INDEX_VIOLATION_CHECK_FAILURE", "Correct"); }); it("Can run multiple operations and provide the correct result", async () => { const coll = new Collection(); await coll.insert({ "_id": "1" }); const result = coll.operation([{ "_id": "1" }, { "_id": "2" }], coll.indexViolationCheck); assert.strictEqual(result.success.length, 1, "Correct"); assert.strictEqual(result.failure.length, 1, "Correct"); assert.strictEqual(result.failure[0].type, "INDEX_VIOLATION_CHECK_FAILURE", "Correct"); assert.strictEqual(result.success[0].type, "INDEX_VIOLATION_CHECK_SUCCESS", "Correct"); }); }); }); describe("CRUD", () => { describe("Create", () => { describe("insertOne()", () => { it("Can insert a single document", async () => { const coll = new Collection(); const result = await coll.insertOne({ "foo": true }); assert.strictEqual(result.nInserted, 1, "Number of inserted documents is correct"); }); }); describe("insertMany()", () => { describe("$ordered: true", () => { it("Can insert an array of documents ordered", async () => { const coll = new Collection(); const result = await coll.insert([ {"_id": 20, "item": "lamp", "qty": 50, "type": "desk"}, {"_id": 21, "item": "lamp", "qty": 20, "type": "floor"}, {"_id": 22, "item": "bulk", "qty": 100} ], {"$ordered": true}); assert.strictEqual(result.nInserted, 3, "Number of inserted documents is correct"); }); it("Can insert an array of documents ordered and fail correctly by index violation", async () => { const coll = new Collection(); const result = await coll.insert([ {"_id": 30, "item": "lamp", "qty": 50, "type": "desk"}, {"_id": 30, "item": "lamp", "qty": 20, "type": "floor"}, {"_id": 32, "item": "bulk", "qty": 100} ], {"$ordered": true}); // The below number should be 1 because we are inserting ordered so on the // second insert (which will fail) the operation should stop assert.strictEqual(result.nInserted, 1, "Number of inserted documents is correct"); assert.strictEqual(result.nFailed, 1, "Number of failed documents is correct"); assert.strictEqual(result.failures.length, 1, "Number of failed documents is correct"); assert.strictEqual(result.failures[0].type, "INDEX_VIOLATION_CHECK_FAILURE", "Error code is correct"); }); }); describe("$ordered: false", () => { it("Can insert an array of documents unordered", async () => { const coll = new Collection(); const result = await coll.insert([ {"_id": 20, "item": "lamp", "qty": 50, "type": "desk"}, {"_id": 21, "item": "lamp", "qty": 20, "type": "floor"}, {"_id": 22, "item": "bulk", "qty": 100} ], {"$ordered": false}); assert.strictEqual(result.nInserted, 3, "Number of inserted documents is correct"); }); it("Can insert an array of documents unordered and fail correctly by index violation", async () => { const coll = new Collection(); const result = await coll.insert([ {"_id": 40, "item": "lamp", "qty": 50, "type": "desk"}, {"_id": 40, "item": "lamp", "qty": 20, "type": "floor"}, {"_id": 42, "item": "bulk", "qty": 100}, {"_id": 40, "item": "lamp", "qty": 20, "type": "floor"} ], {"$ordered": false}); const findResult1 = await coll.find(); assert.strictEqual(result.nInserted, 2, "Number of inserted documents is correct"); assert.strictEqual(result.nFailed, 2, "Number of failed documents is correct"); assert.strictEqual(result.failures.length, 2, "Number of failed documents is correct"); assert.strictEqual(result.failures[0].type, "INDEX_VIOLATION_CHECK_FAILURE", "Error code is correct"); assert.strictEqual(findResult1.length, 2, "Number of documents is correct"); assert.deepStrictEqual(findResult1, [{ "_id": 40, "item": "lamp", "qty": 50, "type": "desk" }, { "_id": 42, "item": "bulk", "qty": 100 }], "Correct value"); }); }); // TODO: Add an atomic operation insert test }); }); describe("Read", () => { describe("find()", () => { }); }); describe("Update", () => { describe("updateOne()", () => { it("Can update a single document", async () => { const coll = new Collection(); const insertResult = await coll.insertMany([{ "_id": "1", "foo": true }, { "_id": "2", "foo": true }]); const findResult1 = await coll.findMany(); const updateResult = await coll.updateOne({ "_id": "1" }, { "foo": false, "newVal": "bar" }); const findResult2 = await coll.findMany(); assert.strictEqual(insertResult.nInserted, 2, "Number of inserted documents is correct"); assert.strictEqual(findResult1.length, 2, "Number of documents is correct"); assert.strictEqual(updateResult.length, 1, "Number of documents is correct"); assert.strictEqual(findResult2.length, 2, "Number of documents is correct"); assert.strictEqual(findResult2[0]._id, "1", "Number of documents is correct"); assert.strictEqual(findResult2[0].foo, false, "Correct value"); assert.deepStrictEqual(findResult2, [{ "_id": "1", "foo": false, "newVal": "bar" }, { "_id": "2", "foo": true }], "Correct value"); }); it("Can update a single document with an operator", async () => { const coll = new Collection(); const insertResult = await coll.insertMany([{ "_id": "1", "count": 0 }, { "_id": "2", "count": 12 }]); const findResult1 = await coll.findMany(); const updateResult = await coll.updateOne({ "_id": "2" }, { "$inc": { "count": 2 } }); const findResult2 = await coll.findMany(); assert.strictEqual(insertResult.nInserted, 2, "Number of inserted documents is correct"); assert.strictEqual(findResult1.length, 2, "Number of documents is correct"); assert.strictEqual(updateResult.length, 1, "Number of documents is correct"); assert.strictEqual(findResult2.length, 2, "Number of documents is correct"); assert.strictEqual(findResult2[1]._id, "2", "Number of documents is correct"); assert.strictEqual(findResult2[1].count, 14, "Correct value"); assert.deepStrictEqual(findResult2, [{ "_id": "1", "count": 0 }, { "_id": "2", "count": 14 }], "Correct value"); }); }); }); describe("Delete", () => { describe("removeOne()", () => { it("Can remove a single document", async () => { const coll = new Collection(); const insertResult = await coll.insert([{ "_id": "1", "count": 0 }, { "_id": "2", "count": 12 }]); const findResult1 = await coll.find(); const removeResult = await coll.removeOne({ "_id": "2" }); const findResult2 = await coll.find(); assert.strictEqual(insertResult.nInserted, 2, "Number of inserted documents is correct"); assert.strictEqual(findResult1.length, 2, "Number of documents is correct"); assert.strictEqual(removeResult.length, 1, "Number of documents is correct"); assert.strictEqual(findResult2.length, 1, "Number of documents is correct"); assert.deepStrictEqual(findResult2, [{ "_id": "1", "count": 0 }], "Correct value"); }); }); describe("removeMany()", () => { it("Can remove multiple documents", async () => { const coll = new Collection(); const insertResult = await coll.insert([{ "_id": "1", "count": 0 }, { "_id": "2", "count": 12 }, { "_id": "3", "count": 12 }, { "_id": "4", "count": 11 }]); const findResult1 = await coll.find(); const removeResult = await coll.removeMany({ "count": { "$gt": 11 } }); const findResult2 = await coll.find(); assert.strictEqual(insertResult.nInserted, 4, "Number of inserted documents is correct"); assert.strictEqual(findResult1.length, 4, "Number of documents is correct"); assert.strictEqual(removeResult.length, 2, "Number of documents is correct"); assert.strictEqual(findResult2.length, 2, "Number of documents is correct"); assert.deepStrictEqual(findResult2, [{ "_id": "1", "count": 0 }, { "_id": "4", "count": 11 }], "Correct value"); }); }); }); }); describe("Virtual Queries", () => { describe("virtual()", () => { it("Can create a virtual collection", async () => { const collectionData = [{ "nodes": [{ "_id": "1", "connections": [{ "_id": "1", "fromNodeId": "1", "toNodeId": "2" }] }, { "_id": "2", "connections": [{ "_id": "2", "fromNodeId": "2", "toNodeId": "1" }] }] }]; const coll = new Collection("deepQueryTestCollection"); await coll.insertMany(collectionData); const virtualCollection = await coll.virtual("nodes.$.connections.$"); const findResult1 = coll.find(); const findResult2 = virtualCollection.find(); assert.strictEqual(findResult1.length, 1, "Number of documents is correct"); assert.strictEqual(findResult2.length, 2, "Number of documents is correct"); assert.deepStrictEqual(findResult2, [{ "_id": "1", "fromNodeId": "1", "toNodeId": "2" }, { "_id": "2", "fromNodeId": "2", "toNodeId": "1" }], "Correct value"); }); }); }); });