ts-patch-mongoose 2.5.5 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.eslintrc +5 -25
  2. package/dist/cjs/helpers.js +1 -1
  3. package/dist/cjs/hooks/delete-hooks.js +2 -2
  4. package/dist/cjs/hooks/save-hooks.js +3 -1
  5. package/dist/cjs/hooks/save-hooks.js.map +1 -1
  6. package/dist/cjs/hooks/update-hooks.js +11 -7
  7. package/dist/cjs/hooks/update-hooks.js.map +1 -1
  8. package/dist/cjs/models/History.js +11 -11
  9. package/dist/cjs/patch.js +5 -5
  10. package/dist/cjs/patch.js.map +1 -1
  11. package/dist/cjs/plugin.js +2 -2
  12. package/dist/cjs/plugin.js.map +1 -1
  13. package/dist/cjs/types/helpers.d.ts.map +1 -1
  14. package/dist/cjs/types/hooks/delete-hooks.d.ts +2 -2
  15. package/dist/cjs/types/hooks/delete-hooks.d.ts.map +1 -1
  16. package/dist/cjs/types/hooks/save-hooks.d.ts +2 -2
  17. package/dist/cjs/types/hooks/save-hooks.d.ts.map +1 -1
  18. package/dist/cjs/types/hooks/update-hooks.d.ts +2 -2
  19. package/dist/cjs/types/hooks/update-hooks.d.ts.map +1 -1
  20. package/dist/cjs/types/patch.d.ts.map +1 -1
  21. package/dist/cjs/types/plugin.d.ts +15 -15
  22. package/dist/cjs/types/plugin.d.ts.map +1 -1
  23. package/dist/esm/helpers.js +1 -1
  24. package/dist/esm/hooks/delete-hooks.js +2 -2
  25. package/dist/esm/hooks/save-hooks.js +3 -1
  26. package/dist/esm/hooks/save-hooks.js.map +1 -1
  27. package/dist/esm/hooks/update-hooks.js +12 -8
  28. package/dist/esm/hooks/update-hooks.js.map +1 -1
  29. package/dist/esm/models/History.js +11 -11
  30. package/dist/esm/patch.js +5 -5
  31. package/dist/esm/patch.js.map +1 -1
  32. package/dist/esm/plugin.js +2 -2
  33. package/dist/esm/plugin.js.map +1 -1
  34. package/dist/esm/types/helpers.d.ts.map +1 -1
  35. package/dist/esm/types/hooks/delete-hooks.d.ts +2 -2
  36. package/dist/esm/types/hooks/delete-hooks.d.ts.map +1 -1
  37. package/dist/esm/types/hooks/save-hooks.d.ts +2 -2
  38. package/dist/esm/types/hooks/save-hooks.d.ts.map +1 -1
  39. package/dist/esm/types/hooks/update-hooks.d.ts +2 -2
  40. package/dist/esm/types/hooks/update-hooks.d.ts.map +1 -1
  41. package/dist/esm/types/patch.d.ts.map +1 -1
  42. package/dist/esm/types/plugin.d.ts +15 -15
  43. package/dist/esm/types/plugin.d.ts.map +1 -1
  44. package/jest-mongodb-config.ts +3 -3
  45. package/jest.config.ts +7 -7
  46. package/package.json +11 -10
  47. package/src/helpers.ts +2 -2
  48. package/src/hooks/delete-hooks.ts +3 -3
  49. package/src/hooks/save-hooks.ts +5 -2
  50. package/src/hooks/update-hooks.ts +14 -9
  51. package/src/models/History.ts +11 -11
  52. package/src/patch.ts +17 -17
  53. package/src/plugin.ts +8 -8
  54. package/tests/constants/events.ts +4 -0
  55. package/tests/em.test.ts +2 -2
  56. package/tests/interfaces/IDescription.ts +5 -0
  57. package/tests/interfaces/IProduct.ts +14 -0
  58. package/tests/patch.test.ts +15 -15
  59. package/tests/plugin-event-created.test.ts +34 -34
  60. package/tests/plugin-event-deleted.test.ts +24 -25
  61. package/tests/plugin-event-updated.test.ts +42 -42
  62. package/tests/plugin-global.test.ts +538 -0
  63. package/tests/plugin-omit-all.test.ts +1 -1
  64. package/tests/plugin-patch-history-disabled.test.ts +1 -1
  65. package/tests/plugin-pre-delete.test.ts +15 -15
  66. package/tests/plugin.test.ts +20 -20
  67. package/tests/schemas/DescriptionSchema.ts +12 -0
  68. package/tests/schemas/ProductSchema.ts +28 -0
  69. package/tests/schemas/UserSchema.ts +3 -3
  70. package/tsconfig.json +2 -1
@@ -0,0 +1,538 @@
1
+ import mongoose from 'mongoose'
2
+
3
+ import UserSchema from './schemas/UserSchema'
4
+ import ProductSchema from './schemas/ProductSchema'
5
+ import { patchHistoryPlugin } from '../src/plugin'
6
+ import History from '../src/models/History'
7
+
8
+ import em from '../src/em'
9
+ import { GLOBAL_CREATED, GLOBAL_UPDATED, GLOBAL_DELETED } from './constants/events'
10
+
11
+ jest.mock('../src/em', () => {
12
+ return { emit: jest.fn() }
13
+ })
14
+
15
+ describe('plugin - global', () => {
16
+ const uri = `${globalThis.__MONGO_URI__}${globalThis.__MONGO_DB_NAME__}`
17
+
18
+ mongoose.plugin(patchHistoryPlugin, {
19
+ eventCreated: GLOBAL_CREATED,
20
+ eventUpdated: GLOBAL_UPDATED,
21
+ eventDeleted: GLOBAL_DELETED,
22
+ omit: ['__v', 'createdAt', 'updatedAt'],
23
+ })
24
+
25
+ const User = mongoose.model('User', UserSchema)
26
+ const Product = mongoose.model('Product', ProductSchema)
27
+
28
+ beforeAll(async () => {
29
+ await mongoose.connect(uri)
30
+ })
31
+
32
+ afterAll(async () => {
33
+ await mongoose.connection.close()
34
+ })
35
+
36
+ beforeEach(async () => {
37
+ await mongoose.connection.collection('users').deleteMany({})
38
+ await mongoose.connection.collection('products').deleteMany({})
39
+ await mongoose.connection.collection('history').deleteMany({})
40
+ })
41
+
42
+ it('should save array', async () => {
43
+ const product = await Product.create({ name: 'paper', groups: [] })
44
+ expect(product.name).toBe('paper')
45
+
46
+ product.groups = ['office']
47
+ await product.save()
48
+
49
+ product.groups.push('school')
50
+ await product.save()
51
+
52
+ const history = await History.find({})
53
+ expect(history).toHaveLength(3)
54
+
55
+ const [first, second, third] = history
56
+
57
+ // 1 create
58
+ expect(first.version).toBe(0)
59
+ expect(first.op).toBe('create')
60
+ expect(first.modelName).toBe('Product')
61
+ expect(first.collectionName).toBe('products')
62
+ expect(first.collectionId).toEqual(product._id)
63
+
64
+ expect(first.doc).toHaveProperty('_id', product._id)
65
+ expect(first.doc).toHaveProperty('name', 'paper')
66
+ expect(first.doc).toHaveProperty('groups', [])
67
+ expect(first.doc).toHaveProperty('createdAt')
68
+ expect(first.doc).toHaveProperty('updatedAt')
69
+
70
+ expect(first.patch).toHaveLength(0)
71
+
72
+ // 2 update
73
+ expect(second.version).toBe(1)
74
+ expect(second.op).toBe('update')
75
+ expect(second.modelName).toBe('Product')
76
+ expect(second.collectionName).toBe('products')
77
+ expect(second.collectionId).toEqual(product._id)
78
+
79
+ expect(second.doc).toBeUndefined()
80
+
81
+ expect(second.patch).toHaveLength(1)
82
+ expect(second.patch).toMatchObject([
83
+ { op: 'add', path: '/groups/0', value: 'office' },
84
+ ])
85
+
86
+ // 3 update
87
+ expect(third.version).toBe(2)
88
+ expect(third.op).toBe('update')
89
+ expect(third.modelName).toBe('Product')
90
+ expect(third.collectionName).toBe('products')
91
+ expect(third.collectionId).toEqual(product._id)
92
+
93
+ expect(third.doc).toBeUndefined()
94
+
95
+ expect(third.patch).toHaveLength(1)
96
+ expect(third.patch).toMatchObject([
97
+ { op: 'add', path: '/groups/1', value: 'school' },
98
+ ])
99
+
100
+ expect(em.emit).toHaveBeenCalledTimes(3)
101
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: first.doc })
102
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
103
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', groups: [] }),
104
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', groups: ['office'] }),
105
+ patch: second.patch,
106
+ })
107
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
108
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', groups: ['office'] }),
109
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', groups: ['office', 'school'] }),
110
+ patch: third.patch,
111
+ })
112
+ })
113
+
114
+ it('should update array', async () => {
115
+ const product = await Product.create({ name: 'paper', groups: [] })
116
+ expect(product.name).toBe('paper')
117
+
118
+ await product.updateOne({
119
+ groups: ['office'],
120
+ }).exec()
121
+
122
+ await product.updateOne({
123
+ $push: { groups: 'school' },
124
+ }).exec()
125
+
126
+ const history = await History.find({})
127
+ expect(history).toHaveLength(3)
128
+
129
+ const [first, second, third] = history
130
+
131
+ // 1 create
132
+ expect(first.version).toBe(0)
133
+ expect(first.op).toBe('create')
134
+ expect(first.modelName).toBe('Product')
135
+ expect(first.collectionName).toBe('products')
136
+ expect(first.collectionId).toEqual(product._id)
137
+
138
+ expect(first.doc).toHaveProperty('_id', product._id)
139
+ expect(first.doc).toHaveProperty('name', 'paper')
140
+ expect(first.doc).toHaveProperty('groups', [])
141
+ expect(first.doc).toHaveProperty('createdAt')
142
+ expect(first.doc).toHaveProperty('updatedAt')
143
+
144
+ expect(first.patch).toHaveLength(0)
145
+
146
+ // 2 update
147
+ expect(second.version).toBe(1)
148
+ expect(second.op).toBe('updateOne')
149
+ expect(second.modelName).toBe('Product')
150
+ expect(second.collectionName).toBe('products')
151
+ expect(second.collectionId).toEqual(product._id)
152
+
153
+ expect(second.doc).toBeUndefined()
154
+
155
+ expect(second.patch).toHaveLength(1)
156
+ expect(second.patch).toMatchObject([
157
+ { op: 'add', path: '/groups/0', value: 'office' },
158
+ ])
159
+
160
+ // 3 update
161
+ expect(third.version).toBe(2)
162
+ expect(third.op).toBe('updateOne')
163
+ expect(third.modelName).toBe('Product')
164
+ expect(third.collectionName).toBe('products')
165
+ expect(third.collectionId).toEqual(product._id)
166
+
167
+ expect(third.doc).toBeUndefined()
168
+
169
+ expect(third.patch).toHaveLength(1)
170
+ expect(third.patch).toMatchObject([
171
+ { op: 'add', path: '/groups/1', value: 'school' },
172
+ ])
173
+
174
+ expect(em.emit).toHaveBeenCalledTimes(3)
175
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: first.doc })
176
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
177
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', groups: [] }),
178
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', groups: ['office'] }),
179
+ patch: second.patch,
180
+ })
181
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
182
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', groups: ['office'] }),
183
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', groups: ['office', 'school'] }),
184
+ patch: third.patch,
185
+ })
186
+ })
187
+
188
+ it('should save nested schema', async () => {
189
+ const product = await Product.create({ name: 'paper', description: { summary: 'test1' } })
190
+ expect(product.name).toBe('paper')
191
+
192
+ product.description = { summary: 'test2' }
193
+ await product.save()
194
+
195
+ product.description.summary = 'test3'
196
+ await product.save()
197
+
198
+ const history = await History.find({})
199
+ expect(history).toHaveLength(3)
200
+
201
+ const [first, second, third] = history
202
+
203
+ // 1 create
204
+ expect(first.version).toBe(0)
205
+ expect(first.op).toBe('create')
206
+ expect(first.modelName).toBe('Product')
207
+ expect(first.collectionName).toBe('products')
208
+ expect(first.collectionId).toEqual(product._id)
209
+
210
+ expect(first.doc).toHaveProperty('_id', product._id)
211
+ expect(first.doc).toHaveProperty('name', 'paper')
212
+ expect(first.doc).toHaveProperty('description', { summary: 'test1' })
213
+ expect(first.doc).toHaveProperty('createdAt')
214
+ expect(first.doc).toHaveProperty('updatedAt')
215
+
216
+ expect(first.patch).toHaveLength(0)
217
+
218
+ // 2 update
219
+ expect(second.version).toBe(1)
220
+ expect(second.op).toBe('update')
221
+ expect(second.modelName).toBe('Product')
222
+ expect(second.collectionName).toBe('products')
223
+ expect(second.collectionId).toEqual(product._id)
224
+
225
+ expect(second.doc).toBeUndefined()
226
+
227
+ expect(second.patch).toHaveLength(2)
228
+ expect(second.patch).toMatchObject([
229
+ { op: 'test', path: '/description/summary', value: 'test1' },
230
+ { op: 'replace', path: '/description/summary', value: 'test2' },
231
+ ])
232
+
233
+ // 3 update
234
+ expect(third.version).toBe(2)
235
+ expect(third.op).toBe('update')
236
+ expect(third.modelName).toBe('Product')
237
+ expect(third.collectionName).toBe('products')
238
+ expect(third.collectionId).toEqual(product._id)
239
+
240
+ expect(third.doc).toBeUndefined()
241
+
242
+ expect(third.patch).toHaveLength(2)
243
+ expect(third.patch).toMatchObject([
244
+ { op: 'test', path: '/description/summary', value: 'test2' },
245
+ { op: 'replace', path: '/description/summary', value: 'test3' },
246
+ ])
247
+
248
+ expect(em.emit).toHaveBeenCalledTimes(3)
249
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: first.doc })
250
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
251
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', description: { summary: 'test1' } }),
252
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', description: { summary: 'test2' } }),
253
+ patch: second.patch,
254
+ })
255
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
256
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', description: { summary: 'test2' } }),
257
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', description: { summary: 'test3' } }),
258
+ patch: third.patch,
259
+ })
260
+ })
261
+
262
+ it('should update nested schema', async () => {
263
+ const product = await Product.create({ name: 'paper', description: { summary: 'test1' } })
264
+ expect(product.name).toBe('paper')
265
+
266
+ await product.updateOne({
267
+ description: { summary: 'test2' },
268
+ }).exec()
269
+
270
+ await product.updateOne({
271
+ $set: { 'description.summary': 'test3' },
272
+ }).exec()
273
+
274
+ const history = await History.find({})
275
+ expect(history).toHaveLength(3)
276
+
277
+ const [first, second, third] = history
278
+
279
+ // 1 create
280
+ expect(first.version).toBe(0)
281
+ expect(first.op).toBe('create')
282
+ expect(first.modelName).toBe('Product')
283
+ expect(first.collectionName).toBe('products')
284
+ expect(first.collectionId).toEqual(product._id)
285
+
286
+ expect(first.doc).toHaveProperty('_id', product._id)
287
+ expect(first.doc).toHaveProperty('name', 'paper')
288
+ expect(first.doc).toHaveProperty('description', { summary: 'test1' })
289
+ expect(first.doc).toHaveProperty('createdAt')
290
+ expect(first.doc).toHaveProperty('updatedAt')
291
+
292
+ expect(first.patch).toHaveLength(0)
293
+
294
+ // 2 update
295
+ expect(second.version).toBe(1)
296
+ expect(second.op).toBe('updateOne')
297
+ expect(second.modelName).toBe('Product')
298
+ expect(second.collectionName).toBe('products')
299
+ expect(second.collectionId).toEqual(product._id)
300
+
301
+ expect(second.doc).toBeUndefined()
302
+
303
+ expect(second.patch).toHaveLength(2)
304
+ expect(second.patch).toMatchObject([
305
+ { op: 'test', path: '/description/summary', value: 'test1' },
306
+ { op: 'replace', path: '/description/summary', value: 'test2' },
307
+ ])
308
+
309
+ // 3 update
310
+ expect(third.version).toBe(2)
311
+ expect(third.op).toBe('updateOne')
312
+ expect(third.modelName).toBe('Product')
313
+ expect(third.collectionName).toBe('products')
314
+ expect(third.collectionId).toEqual(product._id)
315
+
316
+ expect(third.doc).toBeUndefined()
317
+
318
+ expect(third.patch).toHaveLength(2)
319
+ expect(third.patch).toMatchObject([
320
+ { op: 'test', path: '/description/summary', value: 'test2' },
321
+ { op: 'replace', path: '/description/summary', value: 'test3' },
322
+ ])
323
+
324
+ expect(em.emit).toHaveBeenCalledTimes(3)
325
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: first.doc })
326
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
327
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', description: { summary: 'test1' } }),
328
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', description: { summary: 'test2' } }),
329
+ patch: second.patch,
330
+ })
331
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
332
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', description: { summary: 'test2' } }),
333
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', description: { summary: 'test3' } }),
334
+ patch: third.patch,
335
+ })
336
+ })
337
+
338
+ it('should save objectID', async () => {
339
+ const john = await User.create({ name: 'John', role: 'user' })
340
+ expect(john.name).toBe('John')
341
+ const alice = await User.create({ name: 'Alice', role: 'user' })
342
+ expect(alice.name).toBe('Alice')
343
+ const product = await Product.create({ name: 'paper', addedBy: john })
344
+ expect(product.name).toBe('paper')
345
+
346
+ product.addedBy = alice._id
347
+ await product.save()
348
+
349
+ const history = await History.find({})
350
+ expect(history).toHaveLength(4)
351
+
352
+ const [first, second, third, fourth] = history
353
+
354
+ // 1 create
355
+ expect(first.version).toBe(0)
356
+ expect(first.op).toBe('create')
357
+ expect(first.modelName).toBe('User')
358
+ expect(first.collectionName).toBe('users')
359
+ expect(first.collectionId).toEqual(john._id)
360
+
361
+ expect(first.doc).toHaveProperty('_id', john._id)
362
+ expect(first.doc).toHaveProperty('name', 'John')
363
+ expect(first.doc).toHaveProperty('role', 'user')
364
+ expect(first.doc).toHaveProperty('createdAt')
365
+ expect(first.doc).toHaveProperty('updatedAt')
366
+
367
+ expect(first.patch).toHaveLength(0)
368
+
369
+ // 2 create
370
+
371
+ expect(second.version).toBe(0)
372
+ expect(second.op).toBe('create')
373
+ expect(second.modelName).toBe('User')
374
+ expect(second.collectionName).toBe('users')
375
+ expect(second.collectionId).toEqual(alice._id)
376
+
377
+ expect(second.doc).toHaveProperty('_id', alice._id)
378
+ expect(second.doc).toHaveProperty('name', 'Alice')
379
+ expect(second.doc).toHaveProperty('role', 'user')
380
+ expect(second.doc).toHaveProperty('createdAt')
381
+ expect(second.doc).toHaveProperty('updatedAt')
382
+
383
+ expect(second.patch).toHaveLength(0)
384
+
385
+ // 3 create
386
+ expect(third.version).toBe(0)
387
+ expect(third.op).toBe('create')
388
+ expect(third.modelName).toBe('Product')
389
+ expect(third.collectionName).toBe('products')
390
+ expect(third.collectionId).toEqual(product._id)
391
+
392
+ expect(third.doc).toHaveProperty('_id', product._id)
393
+ expect(third.doc).toHaveProperty('name', 'paper')
394
+ expect(third.doc).toHaveProperty('addedBy', john._id)
395
+ expect(third.doc).toHaveProperty('createdAt')
396
+ expect(third.doc).toHaveProperty('updatedAt')
397
+
398
+ expect(third.patch).toHaveLength(0)
399
+
400
+ // 4 update
401
+ expect(fourth.version).toBe(1)
402
+ expect(fourth.op).toBe('update')
403
+ expect(fourth.modelName).toBe('Product')
404
+ expect(fourth.collectionName).toBe('products')
405
+ expect(fourth.collectionId).toEqual(product._id)
406
+
407
+ expect(fourth.doc).toBeUndefined()
408
+
409
+ expect(fourth.patch).toHaveLength(2)
410
+ expect(fourth.patch).toMatchObject([
411
+ { op: 'test', path: '/addedBy', value: john._id.toString() },
412
+ { op: 'replace', path: '/addedBy', value: alice._id.toString() },
413
+ ])
414
+
415
+ expect(em.emit).toHaveBeenCalledTimes(4)
416
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: first.doc })
417
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: second.doc })
418
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: third.doc })
419
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
420
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', addedBy: john._id }),
421
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', addedBy: alice._id }),
422
+ patch: fourth.patch,
423
+ })
424
+ })
425
+
426
+ it('should update objectID', async () => {
427
+ const john = await User.create({ name: 'John', role: 'user' })
428
+ expect(john.name).toBe('John')
429
+ const alice = await User.create({ name: 'Alice', role: 'user' })
430
+ expect(alice.name).toBe('Alice')
431
+ const product = await Product.create({ name: 'paper', addedBy: john })
432
+ expect(product.name).toBe('paper')
433
+
434
+ await product.updateOne({
435
+ addedBy: alice,
436
+ }).exec()
437
+
438
+ await product.updateOne({
439
+ addedBy: { _id: john._id, name: 'John', role: 'manager' },
440
+ }).exec()
441
+
442
+ const history = await History.find({})
443
+ expect(history).toHaveLength(5)
444
+
445
+ const [first, second, third, fourth, fifth] = history
446
+
447
+ // 1 create
448
+ expect(first.version).toBe(0)
449
+ expect(first.op).toBe('create')
450
+ expect(first.modelName).toBe('User')
451
+ expect(first.collectionName).toBe('users')
452
+ expect(first.collectionId).toEqual(john._id)
453
+
454
+ expect(first.doc).toHaveProperty('_id', john._id)
455
+ expect(first.doc).toHaveProperty('name', 'John')
456
+ expect(first.doc).toHaveProperty('role', 'user')
457
+ expect(first.doc).toHaveProperty('createdAt')
458
+ expect(first.doc).toHaveProperty('updatedAt')
459
+
460
+ expect(first.patch).toHaveLength(0)
461
+
462
+ // 2 create
463
+
464
+ expect(second.version).toBe(0)
465
+ expect(second.op).toBe('create')
466
+ expect(second.modelName).toBe('User')
467
+ expect(second.collectionName).toBe('users')
468
+ expect(second.collectionId).toEqual(alice._id)
469
+
470
+ expect(second.doc).toHaveProperty('_id', alice._id)
471
+ expect(second.doc).toHaveProperty('name', 'Alice')
472
+ expect(second.doc).toHaveProperty('role', 'user')
473
+ expect(second.doc).toHaveProperty('createdAt')
474
+ expect(second.doc).toHaveProperty('updatedAt')
475
+
476
+ expect(second.patch).toHaveLength(0)
477
+
478
+ // 3 create
479
+ expect(third.version).toBe(0)
480
+ expect(third.op).toBe('create')
481
+ expect(third.modelName).toBe('Product')
482
+ expect(third.collectionName).toBe('products')
483
+ expect(third.collectionId).toEqual(product._id)
484
+
485
+ expect(third.doc).toHaveProperty('_id', product._id)
486
+ expect(third.doc).toHaveProperty('name', 'paper')
487
+ expect(third.doc).toHaveProperty('addedBy', john._id)
488
+ expect(third.doc).toHaveProperty('createdAt')
489
+ expect(third.doc).toHaveProperty('updatedAt')
490
+
491
+ expect(third.patch).toHaveLength(0)
492
+
493
+ // 4 update
494
+ expect(fourth.version).toBe(1)
495
+ expect(fourth.op).toBe('updateOne')
496
+ expect(fourth.modelName).toBe('Product')
497
+ expect(fourth.collectionName).toBe('products')
498
+ expect(fourth.collectionId).toEqual(product._id)
499
+
500
+ expect(fourth.doc).toBeUndefined()
501
+
502
+ expect(fourth.patch).toHaveLength(2)
503
+ expect(fourth.patch).toMatchObject([
504
+ { op: 'test', path: '/addedBy', value: john._id.toString() },
505
+ { op: 'replace', path: '/addedBy', value: alice._id.toString() },
506
+ ])
507
+
508
+ // 5 update
509
+ expect(fifth.version).toBe(2)
510
+ expect(fifth.op).toBe('updateOne')
511
+ expect(fifth.modelName).toBe('Product')
512
+ expect(fifth.collectionName).toBe('products')
513
+ expect(fifth.collectionId).toEqual(product._id)
514
+
515
+ expect(fifth.doc).toBeUndefined()
516
+
517
+ expect(fifth.patch).toHaveLength(2)
518
+ expect(fifth.patch).toMatchObject([
519
+ { op: 'test', path: '/addedBy', value: alice._id.toString() },
520
+ { op: 'replace', path: '/addedBy', value: john._id.toString() },
521
+ ])
522
+
523
+ expect(em.emit).toHaveBeenCalledTimes(5)
524
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: first.doc })
525
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: second.doc })
526
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_CREATED, { doc: third.doc })
527
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
528
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', addedBy: john._id }),
529
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', addedBy: alice._id }),
530
+ patch: fourth.patch,
531
+ })
532
+ expect(em.emit).toHaveBeenCalledWith(GLOBAL_UPDATED, {
533
+ oldDoc: expect.objectContaining({ _id: product._id, name: 'paper', addedBy: alice._id }),
534
+ doc: expect.objectContaining({ _id: product._id, name: 'paper', addedBy: john._id }),
535
+ patch: fifth.patch,
536
+ })
537
+ })
538
+ })
@@ -16,7 +16,7 @@ describe('plugin - omit all', () => {
16
16
  const uri = `${globalThis.__MONGO_URI__}${globalThis.__MONGO_DB_NAME__}`
17
17
 
18
18
  UserSchema.plugin(patchHistoryPlugin, {
19
- omit: ['__v', 'name', 'role', 'createdAt', 'updatedAt']
19
+ omit: ['__v', 'name', 'role', 'createdAt', 'updatedAt'],
20
20
  })
21
21
 
22
22
  const User = model('User', UserSchema)
@@ -16,7 +16,7 @@ describe('plugin - patch history disabled', () => {
16
16
  const uri = `${globalThis.__MONGO_URI__}${globalThis.__MONGO_DB_NAME__}`
17
17
 
18
18
  UserSchema.plugin(patchHistoryPlugin, {
19
- patchHistoryDisabled: true
19
+ patchHistoryDisabled: true,
20
20
  })
21
21
 
22
22
  const User = model('User', UserSchema)
@@ -20,7 +20,7 @@ describe('plugin - preDelete test', () => {
20
20
  UserSchema.plugin(patchHistoryPlugin, {
21
21
  eventDeleted: USER_DELETED,
22
22
  patchHistoryDisabled: true,
23
- preDelete: preDeleteMock
23
+ preDelete: preDeleteMock,
24
24
  })
25
25
 
26
26
  const User = model('User', UserSchema)
@@ -60,8 +60,8 @@ describe('plugin - preDelete test', () => {
60
60
  name: 'Jane',
61
61
  role: 'user',
62
62
  createdAt: jane?.createdAt,
63
- updatedAt: jane?.updatedAt
64
- }
63
+ updatedAt: jane?.updatedAt,
64
+ },
65
65
  })
66
66
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
67
67
  oldDoc: {
@@ -70,8 +70,8 @@ describe('plugin - preDelete test', () => {
70
70
  name: 'John',
71
71
  role: 'user',
72
72
  createdAt: john?.createdAt,
73
- updatedAt: john?.updatedAt
74
- }
73
+ updatedAt: john?.updatedAt,
74
+ },
75
75
  })
76
76
  expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
77
77
  oldDoc: {
@@ -80,8 +80,8 @@ describe('plugin - preDelete test', () => {
80
80
  name: 'Jack',
81
81
  role: 'user',
82
82
  createdAt: jack?.createdAt,
83
- updatedAt: jack?.updatedAt
84
- }
83
+ updatedAt: jack?.updatedAt,
84
+ },
85
85
  })
86
86
  })
87
87
 
@@ -104,8 +104,8 @@ describe('plugin - preDelete test', () => {
104
104
  name: 'John',
105
105
  role: 'user',
106
106
  createdAt: john?.createdAt,
107
- updatedAt: john?.updatedAt
108
- }
107
+ updatedAt: john?.updatedAt,
108
+ },
109
109
  ])
110
110
 
111
111
  expect(em.emit).toHaveBeenCalledTimes(1)
@@ -116,8 +116,8 @@ describe('plugin - preDelete test', () => {
116
116
  name: 'John',
117
117
  role: 'user',
118
118
  createdAt: john?.createdAt,
119
- updatedAt: john?.updatedAt
120
- }
119
+ updatedAt: john?.updatedAt,
120
+ },
121
121
  })
122
122
  })
123
123
 
@@ -138,8 +138,8 @@ describe('plugin - preDelete test', () => {
138
138
  name: 'John',
139
139
  role: 'user',
140
140
  createdAt: john?.createdAt,
141
- updatedAt: john?.updatedAt
142
- }
141
+ updatedAt: john?.updatedAt,
142
+ },
143
143
  ])
144
144
 
145
145
  expect(em.emit).toHaveBeenCalledTimes(1)
@@ -150,8 +150,8 @@ describe('plugin - preDelete test', () => {
150
150
  name: 'John',
151
151
  role: 'user',
152
152
  createdAt: john?.createdAt,
153
- updatedAt: john?.updatedAt
154
- }
153
+ updatedAt: john?.updatedAt,
154
+ },
155
155
  })
156
156
  })
157
157
  })