Skip to content

Commit d0b35c4

Browse files
committed
fix: add indexdb storage
1 parent d0fff94 commit d0b35c4

4 files changed

Lines changed: 71 additions & 2 deletions

File tree

packages/sdk-multichain/src/fixtures.test.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
* Test fixtures and utilities for the Multichain SDK tests
55
* This file is excluded from test discovery via vitest.config.ts
66
*/
7-
7+
import 'fake-indexeddb/auto';
8+
import { IDBFactory } from 'fake-indexeddb';
89
// Additional imports for standardized setup functions
910
import AsyncStorage from '@react-native-async-storage/async-storage';
1011
import { JSDOM as Page } from 'jsdom';
@@ -20,6 +21,7 @@ import { createMetamaskSDK as createMetamaskSDKRN } from './index.native';
2021
import { createMetamaskSDK as createMetamaskSDKNode } from './index.node';
2122
import * as nodeStorage from './store/adapters/node';
2223
import type { DappClient } from '@metamask/mobile-wallet-protocol-dapp-client';
24+
import { updateIndexedDBMock } from '../tests/indexedDBMock';
2325

2426
// Mock logger at the top level
2527
vi.mock('./domain/logger', () => {
@@ -341,7 +343,7 @@ export const setupWebMocks = (nativeStorageStub: NativeStorageStub, dappUrl = 'h
341343
...dom.window,
342344
addEventListener: t.vi.fn(),
343345
removeEventListener: t.vi.fn(),
344-
localStorage: nativeStorageStub,
346+
indexedDB: new IDBFactory(),
345347
ethereum: {
346348
isMetaMask: true,
347349
},
@@ -356,6 +358,22 @@ export const setupWebMocks = (nativeStorageStub: NativeStorageStub, dappUrl = 'h
356358
t.vi.stubGlobal('document', dom.window.document);
357359
t.vi.stubGlobal('HTMLElement', dom.window.HTMLElement);
358360
t.vi.stubGlobal('requestAnimationFrame', t.vi.fn());
361+
362+
const originalSetItem = nativeStorageStub.setItem;
363+
nativeStorageStub.setItem = t.vi.fn((key: string, value: string) => {
364+
originalSetItem(key, value);
365+
updateIndexedDBMock(key, value).catch((err) => {
366+
console.error('Failed to update indexedDB', err);
367+
});
368+
});
369+
370+
const originalRemoveItem = nativeStorageStub.removeItem;
371+
nativeStorageStub.removeItem = t.vi.fn((key: string) => {
372+
originalRemoveItem(key);
373+
updateIndexedDBMock(key, null).catch((err) => {
374+
console.error('Failed to update indexedDB', err);
375+
});
376+
});
359377
};
360378

361379
// Helper functions to create standardized test configurations

packages/sdk-multichain/src/init.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ function testSuite<T extends MultiChainFNOptions>({ platform, createSDK, options
7979
mockedData.nativeStorageStub.setItem('multichain-transport', transportString);
8080
mockedData.mockMultichainClient.getSession.mockResolvedValue(mockSessionData);
8181

82+
// wait for fake-indexeddb to catch up
83+
await Promise.resolve();
84+
8285
sdk = await createSDK(testOptions);
8386

8487
t.expect(sdk.state).toBe('loaded');
@@ -99,6 +102,9 @@ function testSuite<T extends MultiChainFNOptions>({ platform, createSDK, options
99102
// Set the transport type as a string in storage (this is how it's stored)
100103
mockedData.nativeStorageStub.setItem('multichain-transport', transportString);
101104

105+
// wait for fake-indexeddb to catch up
106+
await Promise.resolve();
107+
102108
const onNotification = t.vi.fn();
103109

104110
const optionsWithEvent = {

packages/sdk-multichain/src/store/index.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/** biome-ignore-all lint/suspicious/noExplicitAny: Tests require it */
22
/** biome-ignore-all lint/style/noNonNullAssertion: Tests require it */
3+
import 'fake-indexeddb/auto';
4+
import { IDBFactory } from 'fake-indexeddb';
35
import AsyncStorage from '@react-native-async-storage/async-storage';
46
import * as t from 'vitest';
57
import type { StoreAdapter } from '../domain';
@@ -227,6 +229,7 @@ t.describe(`Store with WebAdapter`, () => {
227229
() => {
228230
t.vi.stubGlobal('window', {
229231
localStorage: nativeStorageStub,
232+
indexedDB: new IDBFactory(),
230233
});
231234
},
232235
);
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { StoreAdapterWeb } from '../src/store/adapters/web';
2+
3+
export async function updateIndexedDBMock(key: string, value: string | null): Promise<void> {
4+
return new Promise((resolve, reject) => {
5+
const dbName = `${StoreAdapterWeb.DB_NAME}-kv-store`;
6+
const storeName = StoreAdapterWeb.stores[0];
7+
8+
const request = window.indexedDB.open(dbName, 1);
9+
10+
request.onupgradeneeded = () => {
11+
const db = request.result;
12+
if (!db.objectStoreNames.contains(storeName)) {
13+
db.createObjectStore(storeName);
14+
}
15+
};
16+
17+
request.onerror = () => reject(new Error('Failed to open IndexedDB.'));
18+
19+
request.onsuccess = () => {
20+
const db = request.result;
21+
try {
22+
const tx = db.transaction(storeName, 'readwrite');
23+
const store = tx.objectStore(storeName);
24+
25+
const req = value === null ? store.delete(key) : store.put(value, key);
26+
27+
tx.oncomplete = () => {
28+
db.close();
29+
resolve();
30+
};
31+
32+
tx.onerror = () => {
33+
db.close();
34+
reject(new Error('Failed to update value in IndexedDB.'));
35+
};
36+
} catch (error) {
37+
db.close();
38+
reject(error);
39+
}
40+
};
41+
});
42+
}

0 commit comments

Comments
 (0)