@irrelon/forerunnerdb-core
Version:
ForerunnerDB core utilities for operating on JSON data.
571 lines (569 loc) • 24.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _assert = _interopRequireDefault(require("assert"));
var _Collection = _interopRequireDefault(require("./Collection"));
describe("Collection", function () {
describe("operation()", function () {
describe("Positive Path", function () {
it("Can run an operation and provide the correct result", function () {
var coll = new _Collection["default"]();
var result = coll.operation({
"_id": "1"
}, coll.indexViolationCheck);
_assert["default"].strictEqual(result.success.length, 1, "Correct");
_assert["default"].strictEqual(result.success[0].type, "INDEX_VIOLATION_CHECK_SUCCESS", "Correct");
});
it("Can run multiple operations and provide the correct result", function () {
var coll = new _Collection["default"]();
var result = coll.operation([{
"_id": "1"
}, {
"_id": "2"
}], coll.indexViolationCheck);
_assert["default"].strictEqual(result.success.length, 2, "Correct");
_assert["default"].strictEqual(result.success[0].type, "INDEX_VIOLATION_CHECK_SUCCESS", "Correct");
_assert["default"].strictEqual(result.success[1].type, "INDEX_VIOLATION_CHECK_SUCCESS", "Correct");
});
});
describe("Negative Path", function () {
it("Can run an operation and provide the correct result", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
var coll, result;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
coll = new _Collection["default"]();
_context.next = 3;
return coll.insert({
"_id": "1"
});
case 3:
result = coll.operation({
"_id": "1"
}, coll.indexViolationCheck);
_assert["default"].strictEqual(result.success.length, 0, "Correct");
_assert["default"].strictEqual(result.failure.length, 1, "Correct");
_assert["default"].strictEqual(result.failure[0].type, "INDEX_VIOLATION_CHECK_FAILURE", "Correct");
case 7:
case "end":
return _context.stop();
}
}
}, _callee);
})));
it("Can run multiple operations and provide the correct result", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
var coll, result;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
coll = new _Collection["default"]();
_context2.next = 3;
return coll.insert({
"_id": "1"
});
case 3:
result = coll.operation([{
"_id": "1"
}, {
"_id": "2"
}], coll.indexViolationCheck);
_assert["default"].strictEqual(result.success.length, 1, "Correct");
_assert["default"].strictEqual(result.failure.length, 1, "Correct");
_assert["default"].strictEqual(result.failure[0].type, "INDEX_VIOLATION_CHECK_FAILURE", "Correct");
_assert["default"].strictEqual(result.success[0].type, "INDEX_VIOLATION_CHECK_SUCCESS", "Correct");
case 8:
case "end":
return _context2.stop();
}
}
}, _callee2);
})));
});
});
describe("CRUD", function () {
describe("Create", function () {
describe("insertOne()", function () {
it("Can insert a single document", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
var coll, result;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
coll = new _Collection["default"]();
_context3.next = 3;
return coll.insertOne({
"foo": true
});
case 3:
result = _context3.sent;
_assert["default"].strictEqual(result.nInserted, 1, "Number of inserted documents is correct");
case 5:
case "end":
return _context3.stop();
}
}
}, _callee3);
})));
});
describe("insertMany()", function () {
describe("$ordered: true", function () {
it("Can insert an array of documents ordered", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
var coll, result;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
coll = new _Collection["default"]();
_context4.next = 3;
return 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
});
case 3:
result = _context4.sent;
_assert["default"].strictEqual(result.nInserted, 3, "Number of inserted documents is correct");
case 5:
case "end":
return _context4.stop();
}
}
}, _callee4);
})));
it("Can insert an array of documents ordered and fail correctly by index violation", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
var coll, result;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
coll = new _Collection["default"]();
_context5.next = 3;
return 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
});
case 3:
result = _context5.sent;
// The below number should be 1 because we are inserting ordered so on the
// second insert (which will fail) the operation should stop
_assert["default"].strictEqual(result.nInserted, 1, "Number of inserted documents is correct");
_assert["default"].strictEqual(result.nFailed, 1, "Number of failed documents is correct");
_assert["default"].strictEqual(result.failures.length, 1, "Number of failed documents is correct");
_assert["default"].strictEqual(result.failures[0].type, "INDEX_VIOLATION_CHECK_FAILURE", "Error code is correct");
case 8:
case "end":
return _context5.stop();
}
}
}, _callee5);
})));
});
describe("$ordered: false", function () {
it("Can insert an array of documents unordered", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
var coll, result;
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
coll = new _Collection["default"]();
_context6.next = 3;
return 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
});
case 3:
result = _context6.sent;
_assert["default"].strictEqual(result.nInserted, 3, "Number of inserted documents is correct");
case 5:
case "end":
return _context6.stop();
}
}
}, _callee6);
})));
it("Can insert an array of documents unordered and fail correctly by index violation", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
var coll, result, findResult1;
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
coll = new _Collection["default"]();
_context7.next = 3;
return 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
});
case 3:
result = _context7.sent;
_context7.next = 6;
return coll.find();
case 6:
findResult1 = _context7.sent;
_assert["default"].strictEqual(result.nInserted, 2, "Number of inserted documents is correct");
_assert["default"].strictEqual(result.nFailed, 2, "Number of failed documents is correct");
_assert["default"].strictEqual(result.failures.length, 2, "Number of failed documents is correct");
_assert["default"].strictEqual(result.failures[0].type, "INDEX_VIOLATION_CHECK_FAILURE", "Error code is correct");
_assert["default"].strictEqual(findResult1.length, 2, "Number of documents is correct");
_assert["default"].deepStrictEqual(findResult1, [{
"_id": 40,
"item": "lamp",
"qty": 50,
"type": "desk"
}, {
"_id": 42,
"item": "bulk",
"qty": 100
}], "Correct value");
case 13:
case "end":
return _context7.stop();
}
}
}, _callee7);
})));
});
// TODO: Add an atomic operation insert test
});
});
describe("Read", function () {
describe("find()", function () {});
});
describe("Update", function () {
describe("updateOne()", function () {
it("Can update a single document", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
var coll, insertResult, findResult1, updateResult, findResult2;
return _regenerator["default"].wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
coll = new _Collection["default"]();
_context8.next = 3;
return coll.insertMany([{
"_id": "1",
"foo": true
}, {
"_id": "2",
"foo": true
}]);
case 3:
insertResult = _context8.sent;
_context8.next = 6;
return coll.findMany();
case 6:
findResult1 = _context8.sent;
_context8.next = 9;
return coll.updateOne({
"_id": "1"
}, {
"foo": false,
"newVal": "bar"
});
case 9:
updateResult = _context8.sent;
_context8.next = 12;
return coll.findMany();
case 12:
findResult2 = _context8.sent;
_assert["default"].strictEqual(insertResult.nInserted, 2, "Number of inserted documents is correct");
_assert["default"].strictEqual(findResult1.length, 2, "Number of documents is correct");
_assert["default"].strictEqual(updateResult.length, 1, "Number of documents is correct");
_assert["default"].strictEqual(findResult2.length, 2, "Number of documents is correct");
_assert["default"].strictEqual(findResult2[0]._id, "1", "Number of documents is correct");
_assert["default"].strictEqual(findResult2[0].foo, false, "Correct value");
_assert["default"].deepStrictEqual(findResult2, [{
"_id": "1",
"foo": false,
"newVal": "bar"
}, {
"_id": "2",
"foo": true
}], "Correct value");
case 20:
case "end":
return _context8.stop();
}
}
}, _callee8);
})));
it("Can update a single document with an operator", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
var coll, insertResult, findResult1, updateResult, findResult2;
return _regenerator["default"].wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
coll = new _Collection["default"]();
_context9.next = 3;
return coll.insertMany([{
"_id": "1",
"count": 0
}, {
"_id": "2",
"count": 12
}]);
case 3:
insertResult = _context9.sent;
_context9.next = 6;
return coll.findMany();
case 6:
findResult1 = _context9.sent;
_context9.next = 9;
return coll.updateOne({
"_id": "2"
}, {
"$inc": {
"count": 2
}
});
case 9:
updateResult = _context9.sent;
_context9.next = 12;
return coll.findMany();
case 12:
findResult2 = _context9.sent;
_assert["default"].strictEqual(insertResult.nInserted, 2, "Number of inserted documents is correct");
_assert["default"].strictEqual(findResult1.length, 2, "Number of documents is correct");
_assert["default"].strictEqual(updateResult.length, 1, "Number of documents is correct");
_assert["default"].strictEqual(findResult2.length, 2, "Number of documents is correct");
_assert["default"].strictEqual(findResult2[1]._id, "2", "Number of documents is correct");
_assert["default"].strictEqual(findResult2[1].count, 14, "Correct value");
_assert["default"].deepStrictEqual(findResult2, [{
"_id": "1",
"count": 0
}, {
"_id": "2",
"count": 14
}], "Correct value");
case 20:
case "end":
return _context9.stop();
}
}
}, _callee9);
})));
});
});
describe("Delete", function () {
describe("removeOne()", function () {
it("Can remove a single document", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
var coll, insertResult, findResult1, removeResult, findResult2;
return _regenerator["default"].wrap(function _callee10$(_context10) {
while (1) {
switch (_context10.prev = _context10.next) {
case 0:
coll = new _Collection["default"]();
_context10.next = 3;
return coll.insert([{
"_id": "1",
"count": 0
}, {
"_id": "2",
"count": 12
}]);
case 3:
insertResult = _context10.sent;
_context10.next = 6;
return coll.find();
case 6:
findResult1 = _context10.sent;
_context10.next = 9;
return coll.removeOne({
"_id": "2"
});
case 9:
removeResult = _context10.sent;
_context10.next = 12;
return coll.find();
case 12:
findResult2 = _context10.sent;
_assert["default"].strictEqual(insertResult.nInserted, 2, "Number of inserted documents is correct");
_assert["default"].strictEqual(findResult1.length, 2, "Number of documents is correct");
_assert["default"].strictEqual(removeResult.length, 1, "Number of documents is correct");
_assert["default"].strictEqual(findResult2.length, 1, "Number of documents is correct");
_assert["default"].deepStrictEqual(findResult2, [{
"_id": "1",
"count": 0
}], "Correct value");
case 18:
case "end":
return _context10.stop();
}
}
}, _callee10);
})));
});
describe("removeMany()", function () {
it("Can remove multiple documents", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
var coll, insertResult, findResult1, removeResult, findResult2;
return _regenerator["default"].wrap(function _callee11$(_context11) {
while (1) {
switch (_context11.prev = _context11.next) {
case 0:
coll = new _Collection["default"]();
_context11.next = 3;
return coll.insert([{
"_id": "1",
"count": 0
}, {
"_id": "2",
"count": 12
}, {
"_id": "3",
"count": 12
}, {
"_id": "4",
"count": 11
}]);
case 3:
insertResult = _context11.sent;
_context11.next = 6;
return coll.find();
case 6:
findResult1 = _context11.sent;
_context11.next = 9;
return coll.removeMany({
"count": {
"$gt": 11
}
});
case 9:
removeResult = _context11.sent;
_context11.next = 12;
return coll.find();
case 12:
findResult2 = _context11.sent;
_assert["default"].strictEqual(insertResult.nInserted, 4, "Number of inserted documents is correct");
_assert["default"].strictEqual(findResult1.length, 4, "Number of documents is correct");
_assert["default"].strictEqual(removeResult.length, 2, "Number of documents is correct");
_assert["default"].strictEqual(findResult2.length, 2, "Number of documents is correct");
_assert["default"].deepStrictEqual(findResult2, [{
"_id": "1",
"count": 0
}, {
"_id": "4",
"count": 11
}], "Correct value");
case 18:
case "end":
return _context11.stop();
}
}
}, _callee11);
})));
});
});
});
describe("Virtual Queries", function () {
describe("virtual()", function () {
it("Can create a virtual collection", /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12() {
var collectionData, coll, virtualCollection, findResult1, findResult2;
return _regenerator["default"].wrap(function _callee12$(_context12) {
while (1) {
switch (_context12.prev = _context12.next) {
case 0:
collectionData = [{
"nodes": [{
"_id": "1",
"connections": [{
"_id": "1",
"fromNodeId": "1",
"toNodeId": "2"
}]
}, {
"_id": "2",
"connections": [{
"_id": "2",
"fromNodeId": "2",
"toNodeId": "1"
}]
}]
}];
coll = new _Collection["default"]("deepQueryTestCollection");
_context12.next = 4;
return coll.insertMany(collectionData);
case 4:
_context12.next = 6;
return coll.virtual("nodes.$.connections.$");
case 6:
virtualCollection = _context12.sent;
findResult1 = coll.find();
findResult2 = virtualCollection.find();
_assert["default"].strictEqual(findResult1.length, 1, "Number of documents is correct");
_assert["default"].strictEqual(findResult2.length, 2, "Number of documents is correct");
_assert["default"].deepStrictEqual(findResult2, [{
"_id": "1",
"fromNodeId": "1",
"toNodeId": "2"
}, {
"_id": "2",
"fromNodeId": "2",
"toNodeId": "1"
}], "Correct value");
case 12:
case "end":
return _context12.stop();
}
}
}, _callee12);
})));
});
});
});