From 47e9d890380af94141fe7e1a16c8e9ad5026418c Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 12 Oct 2021 15:08:51 +0300 Subject: [PATCH] reverted: storageHelper.test.ts / clean up yarn.lock Signed-off-by: Roman --- .../utils/__tests__/storageHelper.test.ts | 83 ++++++++----------- src/renderer/utils/storageHelper.ts | 25 ++---- yarn.lock | 10 +-- 3 files changed, 50 insertions(+), 68 deletions(-) diff --git a/src/renderer/utils/__tests__/storageHelper.test.ts b/src/renderer/utils/__tests__/storageHelper.test.ts index 7054298296..11127ee3c4 100644 --- a/src/renderer/utils/__tests__/storageHelper.test.ts +++ b/src/renderer/utils/__tests__/storageHelper.test.ts @@ -67,30 +67,31 @@ describe("renderer/utils/StorageHelper", () => { }); describe("Using custom StorageAdapter", () => { - const storageKey = "mySettings"; - const storageMock: Record = { - [storageKey]: undefined, - }; - const defaultValue = { - message: "hello-world", - deepDataTree: { - other: "stuff", - some: "thing", - } + type SettingsStorageModel = { + [key: string]: any; + message: string; }; - type StorageModel = Partial; - let storageHelper: StorageHelper; - let storageHelperAsync: StorageHelper; - let storageAdapter: StorageAdapter; + const storageKey = "mySettings"; + const storageMock: Record = {}; + let storageHelper: StorageHelper; + let storageHelperAsync: StorageHelper; + let storageAdapter: StorageAdapter; + + const storageHelperDefaultValue: SettingsStorageModel = { + message: "hello-world", + anyOtherStorableData: 123, + }; beforeEach(() => { + storageMock[storageKey] = { + message: "saved-before", + } as SettingsStorageModel; + storageAdapter = { - getItem: jest.fn(() => { - return { - ...defaultValue, - message: "saved-before", - }; + onChange: jest.fn(), + getItem: jest.fn((key: string) => { + return storageMock[key]; }), setItem: jest.fn((key: string, value: any) => { storageMock[key] = value; @@ -102,16 +103,16 @@ describe("renderer/utils/StorageHelper", () => { storageHelper = new StorageHelper(storageKey, { autoInit: false, - defaultValue, + defaultValue: storageHelperDefaultValue, storage: storageAdapter, }); storageHelperAsync = new StorageHelper(storageKey, { autoInit: false, - defaultValue, + defaultValue: storageHelperDefaultValue, storage: { ...storageAdapter, - async getItem(key: string): Promise { + async getItem(key: string): Promise { await delay(500); // fake loading timeout return storageAdapter.getItem(key); @@ -121,7 +122,7 @@ describe("renderer/utils/StorageHelper", () => { }); it("loads data from storage with fallback to default-value", () => { - expect(storageHelper.get()).toEqual(defaultValue); + expect(storageHelper.get()).toEqual(storageHelperDefaultValue); storageHelper.init(); expect(storageHelper.get().message).toBe("saved-before"); @@ -132,7 +133,7 @@ describe("renderer/utils/StorageHelper", () => { expect(storageHelperAsync.initialized).toBeFalsy(); storageHelperAsync.init(); await delay(300); - expect(storageHelperAsync.get()).toEqual(defaultValue); + expect(storageHelperAsync.get()).toEqual(storageHelperDefaultValue); await delay(200); expect(storageHelperAsync.get().message).toBe("saved-before"); }); @@ -145,30 +146,22 @@ describe("renderer/utils/StorageHelper", () => { expect(storageAdapter.setItem).toHaveBeenCalledWith(storageHelper.key, { message: "test2" }); }); - it("merge() does partial data tree updates", async () => { - expect(storageHelper.get()).toEqual(defaultValue); - + it("merge() does partial data tree updates", () => { storageHelper.init(); storageHelper.merge({ message: "updated" }); - expect(storageHelper.get()).toEqual({ ...defaultValue, message: "updated" }); - // deep store updates + expect(storageHelper.get()).toEqual({ ...storageHelperDefaultValue, message: "updated" }); + expect(storageAdapter.setItem).toHaveBeenCalledWith(storageHelper.key, { ...storageHelperDefaultValue, message: "updated" }); + storageHelper.merge(draft => { - draft.deepDataTree.some = "blabla"; - }); - expect(storageHelper.get()).toEqual({ - message: "updated", - deepDataTree: { - ...defaultValue.deepDataTree, - some: "blabla", - } + draft.message = "updated2"; }); + expect(storageHelper.get()).toEqual({ ...storageHelperDefaultValue, message: "updated2" }); - // allows to get access to current state before merge - storageHelper.merge(({ message }) => ({ - message: Array(2).fill(message).join("-"), + storageHelper.merge(draft => ({ + message: draft.message.replace("2", "3") })); - expect(storageHelper.get().message).toEqual("updated-updated"); + expect(storageHelper.get()).toEqual({ ...storageHelperDefaultValue, message: "updated3" }); }); }); @@ -194,17 +187,13 @@ describe("renderer/utils/StorageHelper", () => { it("storage.get() is observable", () => { expect(storageHelper.get()).toEqual(defaultValue); - reaction(() => storageHelper.toJS(), change => { + reaction(() => storageHelper.toJSON(), change => { observedChanges.push(change); }); storageHelper.merge({ lastName: "Black" }); storageHelper.set("whatever"); - storageHelper.set({ other: "some-data" }); - - expect(observedChanges[0]).toEqual({ ...defaultValue, lastName: "Black" }); - expect(observedChanges[1]).toEqual("whatever"); - expect(observedChanges[2].other).toBe("some-data"); + expect(observedChanges).toEqual([{ ...defaultValue, lastName: "Black" }, "whatever",]); }); }); diff --git a/src/renderer/utils/storageHelper.ts b/src/renderer/utils/storageHelper.ts index 5d78b553a3..ff121eab3c 100755 --- a/src/renderer/utils/storageHelper.ts +++ b/src/renderer/utils/storageHelper.ts @@ -21,8 +21,8 @@ // Helper for working with storages (e.g. window.localStorage, NodeJS/file-system, etc.) import { action, comparer, makeObservable, observable, toJS, when, } from "mobx"; -import { Draft, produce } from "immer"; -import { isEqual, isPlainObject, merge } from "lodash"; +import produce, { Draft } from "immer"; +import { isEqual, isFunction, isPlainObject } from "lodash"; import logger from "../../main/logger"; export interface StorageAdapter { @@ -149,25 +149,18 @@ export class StorageHelper { @action merge(value: Partial | ((draft: Draft) => Partial | void)) { - const nextValue = produce(this.toJS(), (draft: Draft) => { - const newValue = typeof value === "function" ? value(draft) : value; + const nextValue = produce(this.toJSON(), (state: Draft) => { + const newValue = (isFunction(value) ? value(state) : value) as unknown; - // Partial updates for plain objects - if (isPlainObject(newValue)) { - merge(draft, newValue); - - return; // draft is modified, no need to return anything - } - - // Replacing with a new value - // See also: https://immerjs.github.io/immer/return - return newValue as unknown; + return isPlainObject(newValue) + ? Object.assign(state, newValue) // partial updates for returned plain objects + : newValue; }); - this.set(nextValue); + this.set(nextValue as T); } - toJS(): T { + toJSON(): T { return toJS(this.get()); } } diff --git a/yarn.lock b/yarn.lock index 02d9b55fff..32e734ae1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2557,7 +2557,7 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -aggregate-error@^3.1.0: +aggregate-error@^3.0.0, aggregate-error@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== @@ -7265,10 +7265,10 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -immer@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a" - integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ== +immer@^9.0.6: + version "9.0.6" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" + integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== import-cwd@^3.0.0: version "3.0.0"