mirror of
https://github.com/koloml/furbooru-tagging-assistant.git
synced 2025-12-23 23:02:58 +00:00
Mocked storage change events for mocked storage area
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
export default class ChromeEvent<T extends Function> implements chrome.events.Event<T> {
|
||||
addListener = vi.fn();
|
||||
getRules = vi.fn();
|
||||
hasListener = vi.fn();
|
||||
removeRules = vi.fn();
|
||||
addRules = vi.fn();
|
||||
removeListener = vi.fn();
|
||||
hasListeners = vi.fn();
|
||||
addListener = vi.fn();
|
||||
getRules = vi.fn();
|
||||
hasListener = vi.fn();
|
||||
removeRules = vi.fn();
|
||||
addRules = vi.fn();
|
||||
removeListener = vi.fn();
|
||||
hasListeners = vi.fn();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import ChromeStorageArea from "$tests/mocks/ChromeStorageArea";
|
||||
|
||||
export class ChromeLocalStorageArea extends ChromeStorageArea implements chrome.storage.LocalStorageArea {
|
||||
QUOTA_BYTES = 100000;
|
||||
QUOTA_BYTES = 100000;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import ChromeEvent from "./ChromeEvent";
|
||||
import ChromeStorageChangeEvent from "$tests/mocks/ChromeStorageChangeEvent";
|
||||
|
||||
type ChangedEventCallback = (changes: chrome.storage.StorageChange) => void
|
||||
|
||||
@@ -13,8 +13,20 @@ export default class ChromeStorageArea implements chrome.storage.StorageArea {
|
||||
})
|
||||
});
|
||||
set = vi.fn((...args: any[]): Promise<void> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
return new Promise((resolve) => {
|
||||
const change: Record<string, chrome.storage.StorageChange> = {};
|
||||
const setter = args[0];
|
||||
|
||||
for (let targetKey of Object.keys(setter)) {
|
||||
change[targetKey] = {
|
||||
oldValue: this.#mockedData[targetKey] ?? undefined,
|
||||
newValue: setter[targetKey],
|
||||
};
|
||||
}
|
||||
|
||||
this.#mockedData = Object.assign(this.#mockedData, args[0]);
|
||||
this.onChanged.mockEmitStorageChange(change);
|
||||
|
||||
resolve();
|
||||
})
|
||||
});
|
||||
@@ -23,7 +35,16 @@ export default class ChromeStorageArea implements chrome.storage.StorageArea {
|
||||
const key = args[0];
|
||||
|
||||
if (typeof key === 'string') {
|
||||
const change: chrome.storage.StorageChange = {
|
||||
oldValue: this.#mockedData[key],
|
||||
};
|
||||
|
||||
delete this.#mockedData[key];
|
||||
|
||||
this.onChanged.mockEmitStorageChange({
|
||||
[key]: change
|
||||
});
|
||||
|
||||
resolve();
|
||||
}
|
||||
|
||||
@@ -58,7 +79,7 @@ export default class ChromeStorageArea implements chrome.storage.StorageArea {
|
||||
});
|
||||
});
|
||||
setAccessLevel = vi.fn();
|
||||
onChanged = new ChromeEvent<ChangedEventCallback>();
|
||||
onChanged = new ChromeStorageChangeEvent();
|
||||
getKeys = vi.fn();
|
||||
|
||||
insertMockedData(data: Record<string, any>) {
|
||||
|
||||
27
tests/mocks/ChromeStorageChangeEvent.ts
Normal file
27
tests/mocks/ChromeStorageChangeEvent.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import ChromeEvent from "$tests/mocks/ChromeEvent";
|
||||
import { EventEmitter } from "node:events";
|
||||
|
||||
type MockedStorageChanges = Record<string, chrome.storage.StorageChange>;
|
||||
type IncomingStorageChangeListener = (changes: MockedStorageChanges) => void;
|
||||
|
||||
const storageChangeEvent = Symbol();
|
||||
|
||||
interface StorageChangeEventMap {
|
||||
[storageChangeEvent]: [MockedStorageChanges];
|
||||
}
|
||||
|
||||
export default class ChromeStorageChangeEvent extends ChromeEvent<IncomingStorageChangeListener> {
|
||||
#emitter = new EventEmitter<StorageChangeEventMap>();
|
||||
|
||||
addListener = vi.fn((actualListener: IncomingStorageChangeListener) => {
|
||||
this.#emitter.addListener(storageChangeEvent, actualListener);
|
||||
});
|
||||
|
||||
removeListener = vi.fn((actualListener: IncomingStorageChangeListener) => {
|
||||
this.#emitter.removeListener(storageChangeEvent, actualListener);
|
||||
});
|
||||
|
||||
mockEmitStorageChange(changes: MockedStorageChanges) {
|
||||
this.#emitter.emit(storageChangeEvent, changes);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user