mongoose-delete-ts
Version:
Mongoose soft delete plugin
185 lines (137 loc) • 5.68 kB
text/typescript
import * as crypto from 'crypto';
import {
Deleted,
DeletedBy,
DeletedByMethods,
DeletedByStaticMethods,
DeletedMethods,
DeletedQueryHelpers,
DeletedStaticMethods
} from '../source';
import { Model, Types } from 'mongoose';
import { describe } from 'mocha';
import setupModel from './utils/setupModel';
import dropModel from './utils/dropModel';
import { expect } from 'chai';
import { expectDeletedCount, expectMatchCount, expectOk } from './utils/mongooseExpects';
type TestDeletedBy = { name: string } & Deleted & DeletedBy<Types.ObjectId>;
type TestQueryHelpers = DeletedQueryHelpers<TestDeletedBy>;
type TestDeletedByModel = Model<TestDeletedBy, TestQueryHelpers, DeletedMethods & DeletedByMethods<Types.ObjectId>> &
DeletedStaticMethods<TestDeletedBy, TestQueryHelpers> &
DeletedByStaticMethods<TestDeletedBy, Types.ObjectId, TestQueryHelpers>;
describe('deletedBy=true', function() {
let TestModel: TestDeletedByModel;
before(async function() {
TestModel = setupModel<TestDeletedBy, TestDeletedByModel>(
'TestDeletedBy',
{ name: String },
{ deletedBy: true });
});
after(async function() {
await dropModel('TestDeletedBy');
});
it('deleteByUser() -> set deletedBy', async function() {
const puffy = await TestModel.create({ name: 'Puffy1' });
const userId = new Types.ObjectId();
const success = await puffy.deleteByUser(userId);
expect(success.deletedBy).to.deep.equal(userId);
});
it('deleteOneByUser() -> set deletedBy', async function() {
await TestModel.create({ name: 'Puffy2' });
const userId = new Types.ObjectId();
const result = await TestModel.deleteOneByUser(userId, { name: 'Puffy2' });
expectOk(result);
expectDeletedCount(result, 1);
const puffy = await TestModel.findOne({ name: 'Puffy2' }).allDocuments().orFail();
expect(puffy.deletedBy).to.deep.equal(userId);
});
it('restore() -> unset deletedBy', async function() {
const puffy = await TestModel.findOne({ name: 'Puffy1' }).allDocuments().orFail();
const success = await puffy.restore();
expect(success.deletedBy).to.not.exist;
});
it('restoreOne() -> unset deletedBy', async function() {
const result = await TestModel.restoreOne({ name: 'Puffy2' });
expectOk(result);
expectMatchCount(result, 1);
const puffy = await TestModel.findOne({ name: 'Puffy2' }).allDocuments().orFail();
expect(puffy.deletedBy).to.not.exist;
});
});
describe('deletedBy=deleted_by', function() {
let TestModel: TestDeletedByModel;
before(async function() {
TestModel = setupModel<TestDeletedBy, TestDeletedByModel>(
'TestDeletedByCustomField',
{ name: String },
{ deletedBy: 'deleted_by' });
});
after(async function() {
await dropModel('TestDeletedByCustomField');
});
it('deleteByUser() -> set deletedBy', async function() {
const puffy = await TestModel.create({ name: 'Puffy1' });
const userId = new Types.ObjectId();
const success = await puffy.deleteByUser(userId);
expect(success.deletedBy).to.deep.equal(userId);
expect(success.get('deleted_by')).to.deep.equal(userId);
});
it('restore() -> unset deletedAt', async function() {
const puffy = await TestModel.findOne({ name: 'Puffy1' }).allDocuments().orFail();
const success = await puffy.restore();
expect(success.deletedBy).to.not.exist;
expect(success.get('deleted_by')).to.not.exist;
});
});
type User = { id: string }
type TestDeletedByString = { name: string } & Deleted & DeletedBy<User>;
type TestDeletedByStringQueryHelpers = DeletedQueryHelpers<TestDeletedByString>;
type TestDeletedByStringModel = Model<TestDeletedByString, TestDeletedByStringQueryHelpers, DeletedMethods & DeletedByMethods<string>> &
DeletedStaticMethods<TestDeletedByString, TestDeletedByStringQueryHelpers> &
DeletedByStaticMethods<TestDeletedByString, string, TestDeletedByStringQueryHelpers>;
describe('deletedBy custom schema', function() {
let TestModel: TestDeletedByStringModel;
before(async function() {
TestModel = setupModel<TestDeletedByString, TestDeletedByStringModel>(
'TestDeletedByCustomSchema',
{ name: String },
{ deletedBy: { name: 'deleted_by', type: String, get: (id: string) => { return id && { id }; } } });
});
after(async function() {
await dropModel('TestDeletedByCustomSchema');
});
it('deleteByUser() -> set deletedBy', async function() {
const puffy = await TestModel.create({ name: 'Puffy1' });
const userId = new Types.ObjectId().toString();
const success = await puffy.deleteByUser(userId);
expect(success.deletedBy).to.deep.equal({ id: userId });
});
it('restore() -> unset deletedAt', async function() {
const puffy = await TestModel.findOne({ name: 'Puffy1' }).allDocuments().orFail();
const success = await puffy.restore();
expect(success.deletedBy).to.not.exist;
});
});
describe('deletedBy object without alias', function() {
let TestModel: TestDeletedByStringModel;
before(async function() {
TestModel = setupModel<TestDeletedByString, TestDeletedByStringModel>(
'TestDeletedByWithoutAlias',
{ name: String },
{ deletedBy: { type: String } });
});
after(async function() {
await dropModel('TestDeletedByWithoutAlias');
});
it('deleteByUser() -> set deletedBy', async function() {
const puffy = await TestModel.create({ name: 'Daffy1' });
const userId = crypto.randomBytes(10).toString('hex');
const success = await puffy.deleteByUser(userId);
expect(success.deletedBy).to.equal(userId);
});
it('restore() -> unset deletedAt', async function() {
const puffy = await TestModel.findOne({ name: 'Daffy1' }).allDocuments().orFail();
const success = await puffy.restore();
expect(success.deletedBy).to.not.exist;
});
});