1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

reverted: storageHelper.test.ts / clean up yarn.lock

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2021-10-12 15:08:51 +03:00
parent 8a028b1f11
commit 47e9d89038
3 changed files with 50 additions and 68 deletions

View File

@ -67,30 +67,31 @@ describe("renderer/utils/StorageHelper", () => {
}); });
describe("Using custom StorageAdapter", () => { describe("Using custom StorageAdapter", () => {
const storageKey = "mySettings"; type SettingsStorageModel = {
const storageMock: Record<string, any> = { [key: string]: any;
[storageKey]: undefined, message: string;
};
const defaultValue = {
message: "hello-world",
deepDataTree: {
other: "stuff",
some: "thing",
}
}; };
type StorageModel = Partial<typeof defaultValue>; const storageKey = "mySettings";
let storageHelper: StorageHelper<StorageModel>; const storageMock: Record<string, any> = {};
let storageHelperAsync: StorageHelper<StorageModel>; let storageHelper: StorageHelper<SettingsStorageModel>;
let storageAdapter: StorageAdapter<StorageModel>; let storageHelperAsync: StorageHelper<SettingsStorageModel>;
let storageAdapter: StorageAdapter<SettingsStorageModel>;
const storageHelperDefaultValue: SettingsStorageModel = {
message: "hello-world",
anyOtherStorableData: 123,
};
beforeEach(() => { beforeEach(() => {
storageMock[storageKey] = {
message: "saved-before",
} as SettingsStorageModel;
storageAdapter = { storageAdapter = {
getItem: jest.fn(() => { onChange: jest.fn(),
return { getItem: jest.fn((key: string) => {
...defaultValue, return storageMock[key];
message: "saved-before",
};
}), }),
setItem: jest.fn((key: string, value: any) => { setItem: jest.fn((key: string, value: any) => {
storageMock[key] = value; storageMock[key] = value;
@ -102,16 +103,16 @@ describe("renderer/utils/StorageHelper", () => {
storageHelper = new StorageHelper(storageKey, { storageHelper = new StorageHelper(storageKey, {
autoInit: false, autoInit: false,
defaultValue, defaultValue: storageHelperDefaultValue,
storage: storageAdapter, storage: storageAdapter,
}); });
storageHelperAsync = new StorageHelper(storageKey, { storageHelperAsync = new StorageHelper(storageKey, {
autoInit: false, autoInit: false,
defaultValue, defaultValue: storageHelperDefaultValue,
storage: { storage: {
...storageAdapter, ...storageAdapter,
async getItem(key: string): Promise<StorageModel> { async getItem(key: string): Promise<SettingsStorageModel> {
await delay(500); // fake loading timeout await delay(500); // fake loading timeout
return storageAdapter.getItem(key); return storageAdapter.getItem(key);
@ -121,7 +122,7 @@ describe("renderer/utils/StorageHelper", () => {
}); });
it("loads data from storage with fallback to default-value", () => { it("loads data from storage with fallback to default-value", () => {
expect(storageHelper.get()).toEqual(defaultValue); expect(storageHelper.get()).toEqual(storageHelperDefaultValue);
storageHelper.init(); storageHelper.init();
expect(storageHelper.get().message).toBe("saved-before"); expect(storageHelper.get().message).toBe("saved-before");
@ -132,7 +133,7 @@ describe("renderer/utils/StorageHelper", () => {
expect(storageHelperAsync.initialized).toBeFalsy(); expect(storageHelperAsync.initialized).toBeFalsy();
storageHelperAsync.init(); storageHelperAsync.init();
await delay(300); await delay(300);
expect(storageHelperAsync.get()).toEqual(defaultValue); expect(storageHelperAsync.get()).toEqual(storageHelperDefaultValue);
await delay(200); await delay(200);
expect(storageHelperAsync.get().message).toBe("saved-before"); expect(storageHelperAsync.get().message).toBe("saved-before");
}); });
@ -145,30 +146,22 @@ describe("renderer/utils/StorageHelper", () => {
expect(storageAdapter.setItem).toHaveBeenCalledWith(storageHelper.key, { message: "test2" }); expect(storageAdapter.setItem).toHaveBeenCalledWith(storageHelper.key, { message: "test2" });
}); });
it("merge() does partial data tree updates", async () => { it("merge() does partial data tree updates", () => {
expect(storageHelper.get()).toEqual(defaultValue);
storageHelper.init(); storageHelper.init();
storageHelper.merge({ message: "updated" }); 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 => { storageHelper.merge(draft => {
draft.deepDataTree.some = "blabla"; draft.message = "updated2";
});
expect(storageHelper.get()).toEqual({
message: "updated",
deepDataTree: {
...defaultValue.deepDataTree,
some: "blabla",
}
}); });
expect(storageHelper.get()).toEqual({ ...storageHelperDefaultValue, message: "updated2" });
// allows to get access to current state before merge storageHelper.merge(draft => ({
storageHelper.merge(({ message }) => ({ message: draft.message.replace("2", "3")
message: Array(2).fill(message).join("-"),
})); }));
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", () => { it("storage.get() is observable", () => {
expect(storageHelper.get()).toEqual(defaultValue); expect(storageHelper.get()).toEqual(defaultValue);
reaction(() => storageHelper.toJS(), change => { reaction(() => storageHelper.toJSON(), change => {
observedChanges.push(change); observedChanges.push(change);
}); });
storageHelper.merge({ lastName: "Black" }); storageHelper.merge({ lastName: "Black" });
storageHelper.set("whatever"); storageHelper.set("whatever");
storageHelper.set({ other: "some-data" }); expect(observedChanges).toEqual([{ ...defaultValue, lastName: "Black" }, "whatever",]);
expect(observedChanges[0]).toEqual({ ...defaultValue, lastName: "Black" });
expect(observedChanges[1]).toEqual("whatever");
expect(observedChanges[2].other).toBe("some-data");
}); });
}); });

View File

@ -21,8 +21,8 @@
// Helper for working with storages (e.g. window.localStorage, NodeJS/file-system, etc.) // Helper for working with storages (e.g. window.localStorage, NodeJS/file-system, etc.)
import { action, comparer, makeObservable, observable, toJS, when, } from "mobx"; import { action, comparer, makeObservable, observable, toJS, when, } from "mobx";
import { Draft, produce } from "immer"; import produce, { Draft } from "immer";
import { isEqual, isPlainObject, merge } from "lodash"; import { isEqual, isFunction, isPlainObject } from "lodash";
import logger from "../../main/logger"; import logger from "../../main/logger";
export interface StorageAdapter<T> { export interface StorageAdapter<T> {
@ -149,25 +149,18 @@ export class StorageHelper<T> {
@action @action
merge(value: Partial<T> | ((draft: Draft<T>) => Partial<T> | void)) { merge(value: Partial<T> | ((draft: Draft<T>) => Partial<T> | void)) {
const nextValue = produce(this.toJS(), (draft: Draft<T>) => { const nextValue = produce(this.toJSON(), (state: Draft<T>) => {
const newValue = typeof value === "function" ? value(draft) : value; const newValue = (isFunction(value) ? value(state) : value) as unknown;
// Partial updates for plain objects return isPlainObject(newValue)
if (isPlainObject(newValue)) { ? Object.assign(state, newValue) // partial updates for returned plain objects
merge(draft, newValue); : 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;
}); });
this.set(nextValue); this.set(nextValue as T);
} }
toJS(): T { toJSON(): T {
return toJS(this.get()); return toJS(this.get());
} }
} }

View File

@ -2557,7 +2557,7 @@ agentkeepalive@^3.4.1:
dependencies: dependencies:
humanize-ms "^1.2.1" humanize-ms "^1.2.1"
aggregate-error@^3.1.0: aggregate-error@^3.0.0, aggregate-error@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 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" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
immer@^8.0.4: immer@^9.0.6:
version "8.0.4" version "9.0.6"
resolved "https://registry.yarnpkg.com/immer/-/immer-8.0.4.tgz#3a21605a4e2dded852fb2afd208ad50969737b7a" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73"
integrity sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ== integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ==
import-cwd@^3.0.0: import-cwd@^3.0.0:
version "3.0.0" version "3.0.0"