UNPKG

vue-savedata

Version:

vuex插件 指定数据持久化(配置简,性能佳,体积小)

483 lines (428 loc) 11.5 kB
/*global it expect window jest*/ /*eslint-disable*/ import createPersisted from './../packages' import Vue from 'vue' import Vuex from 'vuex' Vue.config.productionTip = false; Vue.use(Vuex); // 用 store._subscribers[0]({type: 'increment2'}, { module2:{count: 88888} }); 可以脱离 本地数 mock 数据 // 没办法 全局使用 - 会被改掉 const module1 = { state: { count100: 100, count200: 200 }, mutations: { increment1(state) { state.count100++; }, decrement1(state) { state.count100--; } } } const module4 = { namespaced: true, state: { count100: 100, count200: 200 }, mutations: { increment1(state) { state.count100++; }, decrement1(state) { state.count100--; } } } const module2 = { state: { count: 666 }, mutations: { increment2(state) { state.count+=2; }, decrement2(state) { state.count-=2; } } } // 数组情况 和 base解析 const module3 = { state: { one: 666, count: { c: 3 } }, mutations: { increment3(state) { state.count+=3; }, decrement3(state) { state.count-=3; } } } function clear () { window.localStorage.clear() window.sessionStorage.clear() } // 二级 深度合并 it("二级 深度合并", () => { window.localStorage.setItem('saveData', JSON.stringify({ module1: { one: 333, count: { a: 2 } } })) const store = new Vuex.Store({ modules: { module1: module3 } } ); store.replaceState = jest.fn() store.subscribe = jest.fn() const plugin = createPersisted( { LS: { // 新添属性3 module: module3, storePath: "module1" } } ); plugin(store); expect(store.replaceState).toBeCalledWith( { module1: { one: 333, count: { a: 2, c: 3 } } }); expect(store.subscribe).toBeCalled(); }); it("base64 解析是否正确", () => { var encode = (data) => { return window.btoa(encodeURIComponent(JSON.stringify(data))) } var decode = (data) => { return JSON.parse(decodeURIComponent(window.atob(data))) } expect(JSON.stringify(decode(encode({"name":"saveData"})))).toBe(JSON.stringify({"name":"saveData"})); }); it("初始化state和修改state存本地", () => { clear() window.localStorage.setItem('saveData', JSON.stringify({ module1: { count: 333 } })) const store = new Vuex.Store({ modules: { module1 } } ); store.replaceState = jest.fn(); store.subscribe = jest.fn(); const plugin = createPersisted( { LS: { module: module1, storePath: "module1" } } ); plugin(store); expect(store.replaceState).toBeCalledWith( { module1: { count: 333 , count100: 100, count200: 200 } }); expect(store.subscribe).toBeCalled(); }); it("默认存全部", () => { clear() const all = { state: { count100: 100, count200: 200 }, mutations: { increment1(state) { state.count100++; } } } const store = new Vuex.Store({ modules: { all }, state: { count: 1 } }); const plugin = createPersisted({ mode: 'LS' }); plugin(store); store.commit("increment1") // store._subscribers[0]({type: 'increment1'}, { module1:{count: 56789} }); // store._subscribers[0]({type: 'increment1'}, { module1:{count: 56789, age: 18} }); expect(window.localStorage.getItem('saveData')).toBe( JSON.stringify({ count: 1, all: { count100: 101, count200: 200 } }) ); }); it("默认取全部", () => { clear() const store = new Vuex.Store({ modules: { module1 } } ); window.localStorage.setItem('saveData', JSON.stringify({ module1: { count: 666666 } })) const plugin = createPersisted({ mode: 'LS' }); store.replaceState = jest.fn(); store.subscribe = jest.fn(); plugin(store); expect(store.replaceState).toBeCalledWith({ module1: {count: 666666, count100: 100, count200: 200 }}); expect(store.subscribe).toBeCalled(); }); it(' LS更改状态 保存到本地', () => { clear() const store = new Vuex.Store({ modules: { module1, } } ); const plugin = createPersisted( { LS: { module: module1, storePath: "module1" } } ); plugin(store); store._subscribers[0]({type: 'increment1'}, { module1:{count: 6666} }); expect(window.localStorage.getItem('saveData')).toBe( JSON.stringify({ module1:{count: 6666} }) ); }); it(' LS更改状态 保存到本地开启namespaced', () => { clear() const store = new Vuex.Store({ modules: { module4, } } ); const plugin = createPersisted( { LS: { module: module4, storePath: "module4" } } ); plugin(store); store._subscribers[0]({type: 'module4/increment1'}, { module4:{count: 6666} }); expect(window.localStorage.getItem('saveData')).toBe( JSON.stringify({ module4:{count: 6666} }) ); }); it(' SS更改状态 保存到本地', () => { clear() const store = new Vuex.Store({ modules: { module2, } } ); const plugin = createPersisted( { SS: { module: module2, storePath: "module2" } } ); plugin(store); store._subscribers[0]({type: 'increment2'}, { module2:{count: 88888} }); // console.log(store.) expect(window.sessionStorage.getItem('saveData')).toBe( JSON.stringify({module2:{count: 88888}}) ); }); it(' SS,LS更改状态 保存到本地', () => { clear() const store = new Vuex.Store({ state:{ name: "saveData" }, modules: { module1, module2, user: module2 }}); const plugin = createPersisted( { SS: [ { module: module2, storePath: "module2" }, { module: module2, storePath: "user" } ], LS: { module: module1, storePath: "module1" } } ); plugin(store); // console.dir(store) // 这边是直接调用 那个方法 到时候会传入正确的 state的 store._subscribers[0]({type: 'increment2'}, {module2:{count: 88888},module1:{count: 6666},user:{age:18}}); store._subscribers[0]({type: 'increment1'}, {module2:{count: 88888},module1:{count: 6666},user:{age:18}}); expect(window.sessionStorage.getItem('saveData')).toBe( JSON.stringify({ module2:{count: 88888},user:{age:18} }) ); expect(window.localStorage.getItem('saveData')).toBe( JSON.stringify({ module1:{count: 6666} }) ); }); it('SS效验不通过module,取存全部', () => { window.localStorage.setItem('saveData', JSON.stringify({ module1: {count: 123456789} })) const store = new Vuex.Store({ modules: { module1 } } ); store.replaceState = jest.fn(); store.subscribe = jest.fn(); const plugin = createPersisted( { SS: { module: module2, } } ); plugin(store); expect(store.replaceState).toBeCalledWith( {module1: { count: 123456789, count100: 100, count200: 200 }}); expect(store.subscribe).toBeCalled(); }); it('LS效验不通过module,取存全部', () => { window.localStorage.setItem('saveData', JSON.stringify({ module1: {count: 123456789} })) const store = new Vuex.Store({ modules: { module1 } } ); store.replaceState = jest.fn(); store.subscribe = jest.fn(); const plugin = createPersisted( { LS: { module: module2, } } ); plugin(store); expect(store.replaceState).toBeCalledWith( {module1: {count: 123456789, count100: 100, count200: 200}}); expect(store.subscribe).toBeCalled(); }); // LS 不合法 // 加密 解密 it("在本地存不合法的数据 null", () => { window.localStorage.setItem('saveData', JSON.stringify(null)); const store = new Vuex.Store({ modules: { module1 } } ); store.replaceState = jest.fn(); store.subscribe = jest.fn(); const plugin = createPersisted( { LS: { module: module1, storePath: "module1" } } ); plugin(store); expect(store.replaceState).not.toBeCalled(); expect(store.subscribe).toBeCalled(); }) it("在本地存JSON不能解析数据 <不合法>", () => { window.localStorage.setItem('saveData', '<不合法>'); const store = new Vuex.Store({ modules: { module1 } } ); store.replaceState = jest.fn(); store.subscribe = jest.fn(); const plugin = createPersisted( { LS: { module: module1, storePath: "module1" } } ); plugin(store); expect(store.replaceState).not.toBeCalled(); expect(store.subscribe).toBeCalled(); }) it('传入模块不合法', () => { clear() const store = new Vuex.Store({ modules: { a: 123 }, state: { default: 'vue-savedata' } }); const plugin = createPersisted( { LS: { module: module4, storePath: "module4" } } ); plugin(store); store.commit('module4/increment1') expect(window.localStorage.getItem('saveData')).toBe(null); }); it('传入模块正常', () => { clear() const store = new Vuex.Store({ modules: { module4 }, state: { default: 'vue-savedata' } }); const plugin = createPersisted( { LS: { module: module4, storePath: "module4" } } ); plugin(store); store.commit('module4/increment1') // 上面这是在干嘛 expect(window.localStorage.getItem('saveData')).toBe( JSON.stringify({ module4:{count100: 101, count200: 200} }) ); });