ts-patch-mongoose
Version:
Patch history & events for mongoose models
55 lines (41 loc) • 1.67 kB
text/typescript
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
import mongoose, { model } from 'mongoose'
import em from '../src/em'
import { patchHistoryPlugin } from '../src/index'
import { USER_CREATED } from './constants/events'
import server from './mongo/server'
import { type User, UserSchema } from './schemas/User'
vi.mock('../src/em', () => ({ default: { emit: vi.fn() } }))
describe('plugin - preSave test', () => {
const instance = server('plugin-pre-save')
UserSchema.plugin(patchHistoryPlugin, {
eventCreated: USER_CREATED,
omit: ['__v', 'role'],
})
const UserModel = model<User>('User', UserSchema)
beforeAll(async () => {
await instance.create()
})
afterAll(async () => {
await instance.destroy()
})
beforeEach(async () => {
await mongoose.connection.collection('users').deleteMany({})
await mongoose.connection.collection('history').deleteMany({})
})
afterEach(async () => {
vi.resetAllMocks()
})
it('should create a User and execute save, and omit User role in history', async () => {
const john = await UserModel.create({ name: 'John', role: 'user' })
const { __v, role, ...doc } = john.toJSON()
expect(em.emit).toHaveBeenCalledTimes(1)
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc })
expect(john).toMatchObject({ name: 'John', role: 'user' })
const entry = await mongoose.connection.collection('history').findOne({ collectionId: john._id })
expect(entry).not.toBeNull()
expect(entry?.doc).toMatchObject({ name: 'John' })
expect(entry?.doc.role).toBeUndefined()
expect(entry?.patch).toEqual([])
})
})