mirror of
https://github.com/koloml/furbooru-tagging-assistant.git
synced 2025-12-23 23:02:58 +00:00
Added initial implementation of mocks for chrome StorageArea, adding first tests for storage helper
This commit is contained in:
40
tests/lib/browser/StorageHelper.spec.ts
Normal file
40
tests/lib/browser/StorageHelper.spec.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import ChromeStorageArea from "$tests/mocks/ChromeStorageArea";
|
||||
import StorageHelper from "$lib/browser/StorageHelper";
|
||||
import { expect } from "vitest";
|
||||
|
||||
describe('StorageHelper', () => {
|
||||
let storageAreaMock: ChromeStorageArea;
|
||||
let storageHelper: StorageHelper;
|
||||
|
||||
beforeEach(() => {
|
||||
storageAreaMock = new ChromeStorageArea();
|
||||
storageHelper = new StorageHelper(storageAreaMock);
|
||||
});
|
||||
|
||||
it("should return value when data exists", async () => {
|
||||
const key = 'existingKey';
|
||||
const value = 'test value';
|
||||
|
||||
storageAreaMock.insertMockedData({[key]: value});
|
||||
|
||||
expect(await storageHelper.read(key)).toBe(value);
|
||||
});
|
||||
|
||||
it('should return default when data is not present', async () => {
|
||||
const fallbackValue = 'fallback';
|
||||
|
||||
expect(await storageHelper.read('nonexistent', fallbackValue)).toBe(fallbackValue);
|
||||
});
|
||||
|
||||
it('should treat falsy values as existing values', async () => {
|
||||
const falsyValues = [false, '', 0];
|
||||
const key = 'testedKey';
|
||||
const fallbackValue = 'fallback';
|
||||
|
||||
for (let testedValue of falsyValues) {
|
||||
storageAreaMock.insertMockedData({[key]: testedValue});
|
||||
|
||||
expect(await storageHelper.read(key, fallbackValue)).toBe(testedValue);
|
||||
}
|
||||
});
|
||||
});
|
||||
9
tests/mocks/ChromeEvent.ts
Normal file
9
tests/mocks/ChromeEvent.ts
Normal file
@@ -0,0 +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();
|
||||
}
|
||||
5
tests/mocks/ChromeLocalStorageArea.ts
Normal file
5
tests/mocks/ChromeLocalStorageArea.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import ChromeStorageArea from "$tests/mocks/ChromeStorageArea";
|
||||
|
||||
export class ChromeLocalStorageArea extends ChromeStorageArea implements chrome.storage.LocalStorageArea {
|
||||
QUOTA_BYTES = 100000;
|
||||
}
|
||||
71
tests/mocks/ChromeStorageArea.ts
Normal file
71
tests/mocks/ChromeStorageArea.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import ChromeEvent from "./ChromeEvent";
|
||||
|
||||
type ChangedEventCallback = (changes: chrome.storage.StorageChange) => void
|
||||
|
||||
export default class ChromeStorageArea implements chrome.storage.StorageArea {
|
||||
#mockedData: Record<string, any> = {};
|
||||
|
||||
getBytesInUse = vi.fn();
|
||||
clear = vi.fn((): Promise<void> => {
|
||||
return new Promise(resolve => {
|
||||
this.#mockedData = {};
|
||||
resolve();
|
||||
})
|
||||
});
|
||||
set = vi.fn((...args: any[]): Promise<void> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.#mockedData = Object.assign(this.#mockedData, args[0]);
|
||||
resolve();
|
||||
})
|
||||
});
|
||||
remove = vi.fn((...args: any[]): Promise<void> => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const key = args[0];
|
||||
|
||||
if (typeof key === 'string') {
|
||||
delete this.#mockedData[key];
|
||||
resolve();
|
||||
}
|
||||
|
||||
reject(new Error('This behavior is not mocked!'));
|
||||
});
|
||||
});
|
||||
get = vi.fn((...args: any[]) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const key = args[0];
|
||||
|
||||
if (!key) {
|
||||
resolve(this.#mockedData);
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof key === 'string') {
|
||||
resolve({[key]: this.#mockedData[key]});
|
||||
return;
|
||||
}
|
||||
|
||||
if (Array.isArray(key)) {
|
||||
resolve(
|
||||
(key as string[]).reduce((entries, key) => {
|
||||
entries[key] = this.#mockedData[key];
|
||||
return entries;
|
||||
}, {} as Record<string, any>)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
reject(new Error('This behavior is not implemented by the mock.'));
|
||||
});
|
||||
});
|
||||
setAccessLevel = vi.fn();
|
||||
onChanged = new ChromeEvent<ChangedEventCallback>();
|
||||
getKeys = vi.fn();
|
||||
|
||||
insertMockedData(data: Record<string, any>) {
|
||||
this.#mockedData = data;
|
||||
}
|
||||
|
||||
get mockedData(): Record<string, any> {
|
||||
return this.#mockedData;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user