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:
parent
8a028b1f11
commit
47e9d89038
@ -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(() => {
|
||||||
storageAdapter = {
|
storageMock[storageKey] = {
|
||||||
getItem: jest.fn(() => {
|
|
||||||
return {
|
|
||||||
...defaultValue,
|
|
||||||
message: "saved-before",
|
message: "saved-before",
|
||||||
};
|
} as SettingsStorageModel;
|
||||||
|
|
||||||
|
storageAdapter = {
|
||||||
|
onChange: jest.fn(),
|
||||||
|
getItem: jest.fn((key: string) => {
|
||||||
|
return storageMock[key];
|
||||||
}),
|
}),
|
||||||
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");
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
10
yarn.lock
10
yarn.lock
@ -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"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user