import test from 'ava'
import sinon from 'sinon'
import Loki from 'lokijs'
import { createDraft } from 'immer'
import { Hooks } from 'member-hooks'
import { createHooksLoki } from 'loki-hooks'
import { immutable } from '.'
const dbHooks = new Hooks()
const collectionHooks = new Hooks()
collectionHooks.register('immutable', immutable)
const HooksLoki = createHooksLoki(dbHooks, collectionHooks)
test('should make docs immutable, accept immer draft and emit immer patches', t => {
const db = new HooksLoki('dbname', {
adapter: new Loki.LokiMemoryAdapter(),
})
const collection = db.addCollection('collection', {
hooks: {
config: [['immutable', {
patches: true,
insertEvent: 'inserted',
updateEvent: 'updated',
deleteEvent: 'deleted',
production: false
}]]
}
})
const insertedSpy = sinon.spy((doc: any, patches: any) => {
t.assert(Object.isFrozen(doc))
t.deepEqual(patches, {
"patches": [
{
"op": "add",
"path": [
"id"
],
"value": "id1"
}
],
"reversePatches": [
{
"op": "remove",
"path": [
"id"
]
}
]
})
})
collection.addListener('inserted', insertedSpy)
const updatedSpy = sinon.spy((doc: any, patches: any) => {
t.assert(Object.isFrozen(doc))
t.deepEqual(patches, {
"patches": [
{
"op": "add",
"path": [
"name"
],
"value": "name1"
}
],
"reversePatches": [
{
"op": "remove",
"path": [
"name"
]
}
]
})
})
collection.addListener('updated', updatedSpy)
const deletedSpy = sinon.spy((doc: any) => {
t.assert(Object.isFrozen(doc))
})
collection.addListener('deleted', deletedSpy)
t.assert(Object.isFrozen(collection.insert({ id: 'id1' })))
t.assert(insertedSpy.calledOnce)
const inserted = collection.get(1)
t.assert(Object.isFrozen(inserted))
const draft = createDraft(inserted)
draft.name = 'name1'
collection.update(draft)
t.assert(updatedSpy.calledOnce)
const updated = collection.get(1)
t.assert(Object.isFrozen(updated))
collection.remove(1)
t.assert(deletedSpy.calledOnce)
})