diff --git a/src/index.ts b/src/index.ts index 7abf635..e932123 100644 --- a/src/index.ts +++ b/src/index.ts @@ -34,6 +34,7 @@ export const persist: IArgs = (name, store, options = {}) => { const blacklistDict = arrToDict(blacklist) onSnapshot(store, (_snapshot: StrToAnyMap) => { + // need to shallow clone as otherwise properties are non-configurable (https://github.com/agilgur5/mst-persist/pull/21#discussion_r348105595) const snapshot = { ..._snapshot } Object.keys(snapshot).forEach((key) => { if (whitelist && !whitelistDict[key]) { diff --git a/test/fixtures.ts b/test/fixtures.ts index 3c97e89..ec78157 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -3,4 +3,8 @@ import { types } from 'mobx-state-tree' export const UserStore = types.model('UserStore', { name: 'John Doe', age: 32 -}) +}).actions((self) => ({ + changeName(name: string) { + self.name = name + } +})) diff --git a/test/index.spec.ts b/test/index.spec.ts index 5b9b3e7..58853db 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -1,15 +1,53 @@ /// +import { getSnapshot } from 'mobx-state-tree' import { persist } from '../src/index' import { UserStore } from './fixtures' -describe('initialization', () => { +function getItem(key: string) { + const item = window.localStorage.getItem(key) + return item ? JSON.parse(item) : null // can only parse strings +} + +describe('basic persist options', () => { beforeEach(() => window.localStorage.clear()) it('should persist nothing if no actions are used', async () => { const user = UserStore.create() await persist('user', user) - expect(window.localStorage.getItem('user')).toBe(null) + expect(getItem('user')).toBe(null) + }) + + it('should persist snapshot when action used', async () => { + const user = UserStore.create() + await persist('user', user) + + user.changeName('Joe') // fire action to trigger onSnapshot + expect(getItem('user')).toStrictEqual(getSnapshot(user)) + }) + + it('should whitelist', async () => { + const user = UserStore.create() + await persist('user', user, { + whitelist: ['name'] + }) + + user.changeName('Joe') // fire action to trigger onSnapshot + const snapshot = { ...getSnapshot(user) } // need to shallow clone as otherwise properties are non-configurable (https://github.com/agilgur5/mst-persist/pull/21#discussion_r348105595) + delete snapshot['age'] + expect(getItem('user')).toStrictEqual(snapshot) + }) + + it('should blacklist', async () => { + const user = UserStore.create() + await persist('user', user, { + blacklist: ['age'] + }) + + user.changeName('Joe') // fire action to trigger onSnapshot + const snapshot = { ...getSnapshot(user) } // need to shallow clone as otherwise properties are non-configurable (https://github.com/agilgur5/mst-persist/pull/21#discussion_r348105595) + delete snapshot['age'] + expect(getItem('user')).toStrictEqual(snapshot) }) })