@360-l/mongo-bulk-data-migration
Version:
MongoDB bulk data migration for node scripts
62 lines (61 loc) • 2.94 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.setGlobalExpect = setGlobalExpect;
exports.doRollbackAndAssertForInitialState = doRollbackAndAssertForInitialState;
const lodash_1 = __importDefault(require("lodash"));
let globalExpect = null;
function setGlobalExpect(expect) {
globalExpect = expect;
}
async function doRollbackAndAssertForInitialState(dataMigration, initialDocuments, { expect = globalExpect, expectedRollbackStatus = {}, } = { expect: globalExpect, expectedRollbackStatus: {} }) {
const { collectionName, migrationInfos } = dataMigration.getInfos();
const rollbackStatus = await dataMigration.rollback();
const documentsAfterRollback = await migrationInfos.db
.collection(collectionName)
.find({})
.toArray();
assertDeepHaveMembers(expect, JSON.parse(JSON.stringify(documentsAfterRollback)), JSON.parse(JSON.stringify(initialDocuments)));
const expectedPartialRollback = lodash_1.default.pick(rollbackStatus, Object.keys(expectedRollbackStatus));
assertDeepEquals(expect, expectedPartialRollback, expectedRollbackStatus);
const rollbackStatus2 = await dataMigration.rollback();
const expectedRollbackProps = lodash_1.default.pick(rollbackStatus2, [
'nModified',
'nMatched',
]);
assertDeepEquals(expect, expectedRollbackProps, {
nModified: 0,
nMatched: 0,
});
}
function assertDeepHaveMembers(expect, effectiveDocs, expectedDocs) {
const compareObjectId = (objA, objB) => {
const sortedIds = [objA, objB].sort();
return sortedIds[0] === objA ? -1 : 1;
};
const sortedEffectiveDocs = lodash_1.default.clone(effectiveDocs).sort((docA, docB) => compareObjectId(docA._id.toString(), docB._id.toString()));
const sortedExpectedDocs = lodash_1.default.clone(expectedDocs).sort((docA, docB) => compareObjectId(docA._id.toString(), docB._id.toString()));
return assertDeepEquals(expect, sortedEffectiveDocs, sortedExpectedDocs);
}
function assertDeepEquals(expect, input, expected) {
const jestOrChai = assertAndGetChaiOrChai(expect);
if (jestOrChai === 'jest') {
expect(input).toEqual(expected);
}
else {
expect(input).to.deep.equal(expected);
}
}
function assertAndGetChaiOrChai(expect) {
if (expect === null) {
throw new Error('MongoBulkDataMigration error: expect lib is not set, use setGlobalExpect once in a global pre test hook, or specify it alongside doRollbackAndAssertForInitialState');
}
const isJest = !!expect.anything;
const isChai = !!expect.fail;
if (!isJest && !isChai) {
throw new Error('MongoBulkDataMigration error: expect lib does not look to be Jest or Chai supported libs');
}
return isJest ? 'jest' : 'chai';
}