diff --git a/tests/mocks/ChromeEvent.ts b/tests/mocks/ChromeEvent.ts index 7c3029b..5b16ed9 100644 --- a/tests/mocks/ChromeEvent.ts +++ b/tests/mocks/ChromeEvent.ts @@ -1,9 +1,9 @@ export default class ChromeEvent implements chrome.events.Event { - 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(); } diff --git a/tests/mocks/ChromeLocalStorageArea.ts b/tests/mocks/ChromeLocalStorageArea.ts index 8aa4f77..e14586e 100644 --- a/tests/mocks/ChromeLocalStorageArea.ts +++ b/tests/mocks/ChromeLocalStorageArea.ts @@ -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; } diff --git a/tests/mocks/ChromeStorageArea.ts b/tests/mocks/ChromeStorageArea.ts index 1372fd3..95609a6 100644 --- a/tests/mocks/ChromeStorageArea.ts +++ b/tests/mocks/ChromeStorageArea.ts @@ -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 => { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { + const change: Record = {}; + 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(); + onChanged = new ChromeStorageChangeEvent(); getKeys = vi.fn(); insertMockedData(data: Record) { diff --git a/tests/mocks/ChromeStorageChangeEvent.ts b/tests/mocks/ChromeStorageChangeEvent.ts new file mode 100644 index 0000000..b4fb187 --- /dev/null +++ b/tests/mocks/ChromeStorageChangeEvent.ts @@ -0,0 +1,27 @@ +import ChromeEvent from "$tests/mocks/ChromeEvent"; +import { EventEmitter } from "node:events"; + +type MockedStorageChanges = Record; +type IncomingStorageChangeListener = (changes: MockedStorageChanges) => void; + +const storageChangeEvent = Symbol(); + +interface StorageChangeEventMap { + [storageChangeEvent]: [MockedStorageChanges]; +} + +export default class ChromeStorageChangeEvent extends ChromeEvent { + #emitter = new EventEmitter(); + + 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); + } +}