@stenneepro/mongoose-soft-delete
Version:
Mongoose soft delete plugin
171 lines (170 loc) • 8.49 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const chai_1 = require("chai");
const mocha_1 = require("mocha");
const setupModel_1 = __importDefault(require("./utils/setupModel"));
const dropModel_1 = __importDefault(require("./utils/dropModel"));
const mongooseExpects_1 = require("./utils/mongooseExpects");
(0, mocha_1.describe)('simple delete', function () {
let TestModel;
before(async function () {
TestModel = (0, setupModel_1.default)('TestSimpleDelete', { name: String });
});
after(async function () {
await (0, dropModel_1.default)('TestSimpleDelete');
});
it('deleteOne() -> set deleted=true', async function () {
const puffy = await TestModel.create({ name: 'Puffy1' });
const result = await puffy.deleteOne();
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectDeletedCount)(result, 1);
const doc = await TestModel.findById(puffy.id).withDeleted().orFail();
(0, chai_1.expect)(doc.deleted).to.equal(true);
});
it('deleteOne() -> set deleted=true', async function () {
const puffy = await TestModel.create({ name: 'Puffy2' });
const result = await TestModel.deleteOne({ name: 'Puffy2' });
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectDeletedCount)(result, 1);
const doc = await TestModel.findById(puffy.id).withDeleted().orFail();
(0, chai_1.expect)(doc.deleted).to.equal(true);
});
it('deleteMany() -> set deleted=true', async function () {
await TestModel.create({ name: 'Puffy' });
await TestModel.create({ name: 'Puffy' });
const result = await TestModel.deleteMany({ name: 'Puffy' });
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectDeletedCount)(result, 2);
});
it('findByIdAndDelete() -> set deleted=true', async function () {
const puffy = await TestModel.create({ name: 'Puffy3' });
await TestModel.findByIdAndDelete(puffy.id);
const result = await TestModel.findById(puffy.id).withDeleted().orFail();
(0, chai_1.expect)(result.deleted).to.equal(true);
});
it('findOneAndDelete() -> set deleted=true', async function () {
await TestModel.create({ name: 'Puffy4' });
await TestModel.findOneAndDelete({ name: 'Puffy4' });
const result = await TestModel.findOne({ name: 'Puffy4' }).withDeleted().orFail();
(0, chai_1.expect)(result.deleted).to.equal(true);
});
it('restoreOne() -> set deleted=false', async function () {
const puffy = await TestModel.findOne({ name: 'Puffy1' }).withDeleted().orFail();
const doc = await puffy.restoreOne();
(0, chai_1.expect)(doc.deleted).to.equal(false);
});
it('restoreOne() -> set deleted=false', async function () {
const result = await TestModel.restoreOne({ name: 'Puffy2' });
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectModifiedCount)(result, 1);
const puffy = await TestModel.findOne({ name: 'Puffy2' }).orFail();
(0, chai_1.expect)(puffy.deleted).to.equal(false);
});
it('restoreMany() -> set deleted=false', async function () {
const result = await TestModel.restoreMany({ name: 'Puffy' });
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectModifiedCount)(result, 2);
const [puffy1, puffy2] = await TestModel.find({ name: 'Puffy' });
(0, chai_1.expect)(puffy1.deleted).to.equal(false);
(0, chai_1.expect)(puffy2.deleted).to.equal(false);
});
});
(0, mocha_1.describe)('delete with timestamps', function () {
let TestModel;
before(async function () {
TestModel = (0, setupModel_1.default)('TestDeleteWithTimestamps', { name: String }, {}, { timestamps: true });
});
after(async function () {
await (0, dropModel_1.default)('TestDeleteWithTimestamps');
});
it('deleteOne() -> will not change updatedAt', async function () {
const puffy = await TestModel.create({ name: 'Puffy1' });
const updatedAt = new Date(puffy.updatedAt);
const result = await puffy.deleteOne();
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectDeletedCount)(result, 1);
const doc = await TestModel.findById(puffy.id).withDeleted().orFail();
(0, chai_1.expect)(doc.updatedAt).to.deep.equal(updatedAt);
});
it('deleteOne() -> will not change updatedAt', async function () {
const puffy = await TestModel.create({ name: 'Puffy2' });
const updatedAt = new Date(puffy.updatedAt);
const result = await TestModel.deleteOne({ name: 'Puffy2' });
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectDeletedCount)(result, 1);
const doc = await TestModel.findById(puffy.id).withDeleted().orFail();
(0, chai_1.expect)(doc.deleted).to.equal(true);
(0, chai_1.expect)(doc.updatedAt).to.deep.equal(updatedAt);
});
it('restoreOne() -> will not change updatedAt', async function () {
const puffy = await TestModel.findOne({ name: 'Puffy1' }).withDeleted().orFail();
const updatedAt = new Date(puffy.updatedAt);
const doc = await puffy.restoreOne();
(0, chai_1.expect)(doc.deleted).to.equal(false);
(0, chai_1.expect)(doc.updatedAt).to.deep.equal(updatedAt);
});
it('restoreOne() -> will not change updatedAt', async function () {
const before = await TestModel.findOne({ name: 'Puffy2' }).withDeleted().orFail();
const updatedAt = new Date(before.updatedAt);
await TestModel.restoreOne({ name: 'Puffy2' });
const puffy = await TestModel.findOne({ name: 'Puffy2' }).orFail();
(0, chai_1.expect)(puffy.deleted).to.equal(false);
(0, chai_1.expect)(puffy.updatedAt).to.deep.equal(updatedAt);
});
});
(0, mocha_1.describe)('delete with validateBeforeDelete', function () {
let TestModelTrue;
let TestModelFalse;
before(async function () {
TestModelTrue = (0, setupModel_1.default)('TestValidateBeforeDeleteTrue', { name: { type: String, required: true } }, { validateBeforeDelete: true });
TestModelFalse = (0, setupModel_1.default)('TestValidateBeforeDeleteFalse', { name: { type: String, required: true } }, { validateBeforeDelete: false });
});
after(async function () {
await (0, dropModel_1.default)('TestValidateBeforeDeleteTrue');
await (0, dropModel_1.default)('TestValidateBeforeDeleteFalse');
});
it('deleteOne() -> will raise ValidationError error', async function () {
const puffy = await TestModelTrue.create({ name: 'Puffy1' });
puffy.name = '';
try {
const result = await puffy.deleteOne();
(0, mongooseExpects_1.expectDeletedCount)(result, 0);
}
catch (error) {
expectError(error);
(0, chai_1.expect)(error.name).to.equal('ValidationError');
}
});
it('deleteOne() -> will not raise ValidationError error', async function () {
const puffy = await TestModelFalse.create({ name: 'Puffy1' });
puffy.name = '';
const result = await puffy.deleteOne();
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectDeletedCount)(result, 1);
});
});
(0, mocha_1.describe)('deleted schema options', function () {
let TestModel;
before(async function () {
TestModel = (0, setupModel_1.default)('TestSchemaOptions', { name: String }, { deleted: { alias: 'destroyed' } });
});
after(async function () {
await (0, dropModel_1.default)('TestSchemaOptions');
});
it('use custom schema alias', async function () {
const puffy = await TestModel.create({ name: 'Puffy1' });
const result = await puffy.deleteOne();
(0, mongooseExpects_1.expectOk)(result);
(0, mongooseExpects_1.expectDeletedCount)(result, 1);
const doc = await TestModel.findById(puffy.id).withDeleted().orFail();
(0, chai_1.expect)(doc.destroyed).to.equal(true);
});
});
function expectError(error) {
if (!(error instanceof Error)) {
throw new TypeError('error is not of type Error');
}
}