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", () => {
const storageKey = "mySettings";
const storageMock: Record<string, any> = {
[storageKey]: undefined,
};
const defaultValue = {
message: "hello-world",
deepDataTree: {
other: "stuff",
some: "thing",
}
type SettingsStorageModel = {
[key: string]: any;
message: string;
};
type StorageModel = Partial<typeof defaultValue>;
let storageHelper: StorageHelper<StorageModel>;
let storageHelperAsync: StorageHelper<StorageModel>;
let storageAdapter: StorageAdapter<StorageModel>;
const storageKey = "mySettings";
const storageMock: Record<string, any> = {};
let storageHelper: StorageHelper<SettingsStorageModel>;
let storageHelperAsync: StorageHelper<SettingsStorageModel>;
let storageAdapter: StorageAdapter<SettingsStorageModel>;
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<StorageModel> {
async getItem(key: string): Promise<SettingsStorageModel> {
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",]);
});
});

View File

@ -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<T> {
@ -149,25 +149,18 @@ export class StorageHelper<T> {
@action
merge(value: Partial<T> | ((draft: Draft<T>) => Partial<T> | void)) {
const nextValue = produce(this.toJS(), (draft: Draft<T>) => {
const newValue = typeof value === "function" ? value(draft) : value;
const nextValue = produce(this.toJSON(), (state: Draft<T>) => {
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());
}
}

View File

@ -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"