@spacesops/wdk-react-native-core 1.0.0-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +551 -0
- package/dist/__mocks__/react.d.ts +40 -0
- package/dist/__mocks__/react.js +33 -0
- package/dist/__mocks__/react.js.map +1 -0
- package/dist/__mocks__/secureStorage.d.ts +26 -0
- package/dist/__mocks__/secureStorage.js +80 -0
- package/dist/__mocks__/secureStorage.js.map +1 -0
- package/dist/__tests__/hooks/useBalance.test.d.ts +6 -0
- package/dist/__tests__/hooks/useBalance.test.js +217 -0
- package/dist/__tests__/hooks/useBalance.test.js.map +1 -0
- package/dist/__tests__/hooks/useWallet.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWallet.test.js +105 -0
- package/dist/__tests__/hooks/useWallet.test.js.map +1 -0
- package/dist/__tests__/hooks/useWalletManager.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWalletManager.test.js +193 -0
- package/dist/__tests__/hooks/useWalletManager.test.js.map +1 -0
- package/dist/__tests__/hooks/useWdkApp.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWdkApp.test.js +55 -0
- package/dist/__tests__/hooks/useWdkApp.test.js.map +1 -0
- package/dist/__tests__/hooks/useWorklet.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWorklet.test.js +168 -0
- package/dist/__tests__/hooks/useWorklet.test.js.map +1 -0
- package/dist/__tests__/provider/WdkAppProvider.test.d.ts +6 -0
- package/dist/__tests__/provider/WdkAppProvider.test.js +57 -0
- package/dist/__tests__/provider/WdkAppProvider.test.js.map +1 -0
- package/dist/__tests__/services/accountService.test.d.ts +6 -0
- package/dist/__tests__/services/accountService.test.js +216 -0
- package/dist/__tests__/services/accountService.test.js.map +1 -0
- package/dist/__tests__/services/addressService.test.d.ts +6 -0
- package/dist/__tests__/services/addressService.test.js +246 -0
- package/dist/__tests__/services/addressService.test.js.map +1 -0
- package/dist/__tests__/services/balanceService.test.d.ts +6 -0
- package/dist/__tests__/services/balanceService.test.js +333 -0
- package/dist/__tests__/services/balanceService.test.js.map +1 -0
- package/dist/__tests__/services/walletSetupService.test.d.ts +6 -0
- package/dist/__tests__/services/walletSetupService.test.js +304 -0
- package/dist/__tests__/services/walletSetupService.test.js.map +1 -0
- package/dist/__tests__/services/walletSwitchingService.test.d.ts +6 -0
- package/dist/__tests__/services/walletSwitchingService.test.js +209 -0
- package/dist/__tests__/services/walletSwitchingService.test.js.map +1 -0
- package/dist/__tests__/services/workletLifecycleService.test.d.ts +6 -0
- package/dist/__tests__/services/workletLifecycleService.test.js +451 -0
- package/dist/__tests__/services/workletLifecycleService.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +7 -0
- package/dist/__tests__/setup.js +49 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/storage/mmkvStorage.test.d.ts +6 -0
- package/dist/__tests__/storage/mmkvStorage.test.js +213 -0
- package/dist/__tests__/storage/mmkvStorage.test.js.map +1 -0
- package/dist/__tests__/store/walletStore.test.d.ts +4 -0
- package/dist/__tests__/store/walletStore.test.js +86 -0
- package/dist/__tests__/store/walletStore.test.js.map +1 -0
- package/dist/__tests__/store/workletStore.test.d.ts +4 -0
- package/dist/__tests__/store/workletStore.test.js +255 -0
- package/dist/__tests__/store/workletStore.test.js.map +1 -0
- package/dist/__tests__/types/hrpc.test.d.ts +4 -0
- package/dist/__tests__/types/hrpc.test.js +99 -0
- package/dist/__tests__/types/hrpc.test.js.map +1 -0
- package/dist/__tests__/utils/balanceUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/balanceUtils.test.js +133 -0
- package/dist/__tests__/utils/balanceUtils.test.js.map +1 -0
- package/dist/__tests__/utils/errorHandling.test.d.ts +6 -0
- package/dist/__tests__/utils/errorHandling.test.js +119 -0
- package/dist/__tests__/utils/errorHandling.test.js.map +1 -0
- package/dist/__tests__/utils/errorUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/errorUtils.test.js +133 -0
- package/dist/__tests__/utils/errorUtils.test.js.map +1 -0
- package/dist/__tests__/utils/initializationState.test.d.ts +6 -0
- package/dist/__tests__/utils/initializationState.test.js +243 -0
- package/dist/__tests__/utils/initializationState.test.js.map +1 -0
- package/dist/__tests__/utils/jsonUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/jsonUtils.test.js +118 -0
- package/dist/__tests__/utils/jsonUtils.test.js.map +1 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.d.ts +6 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.js +158 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.js.map +1 -0
- package/dist/__tests__/utils/mnemonicUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/mnemonicUtils.test.js +40 -0
- package/dist/__tests__/utils/mnemonicUtils.test.js.map +1 -0
- package/dist/__tests__/utils/raceConditions.test.d.ts +6 -0
- package/dist/__tests__/utils/raceConditions.test.js +239 -0
- package/dist/__tests__/utils/raceConditions.test.js.map +1 -0
- package/dist/__tests__/utils/result.test.d.ts +4 -0
- package/dist/__tests__/utils/result.test.js +66 -0
- package/dist/__tests__/utils/result.test.js.map +1 -0
- package/dist/__tests__/utils/schemas.test.d.ts +4 -0
- package/dist/__tests__/utils/schemas.test.js +66 -0
- package/dist/__tests__/utils/schemas.test.js.map +1 -0
- package/dist/__tests__/utils/storeHelpers.test.d.ts +4 -0
- package/dist/__tests__/utils/storeHelpers.test.js +227 -0
- package/dist/__tests__/utils/storeHelpers.test.js.map +1 -0
- package/dist/__tests__/utils/typeGuards.test.d.ts +4 -0
- package/dist/__tests__/utils/typeGuards.test.js +175 -0
- package/dist/__tests__/utils/typeGuards.test.js.map +1 -0
- package/dist/__tests__/utils/validation.test.d.ts +4 -0
- package/dist/__tests__/utils/validation.test.js +126 -0
- package/dist/__tests__/utils/validation.test.js.map +1 -0
- package/dist/__tests__/utils/walletUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/walletUtils.test.js +156 -0
- package/dist/__tests__/utils/walletUtils.test.js.map +1 -0
- package/dist/hooks/useBalance.d.ts +170 -0
- package/dist/hooks/useBalance.js +442 -0
- package/dist/hooks/useBalance.js.map +1 -0
- package/dist/hooks/useWallet.d.ts +43 -0
- package/dist/hooks/useWallet.js +193 -0
- package/dist/hooks/useWallet.js.map +1 -0
- package/dist/hooks/useWalletManager.d.ts +100 -0
- package/dist/hooks/useWalletManager.js +526 -0
- package/dist/hooks/useWalletManager.js.map +1 -0
- package/dist/hooks/useWdkApp.d.ts +66 -0
- package/dist/hooks/useWdkApp.js +74 -0
- package/dist/hooks/useWdkApp.js.map +1 -0
- package/dist/hooks/useWorklet.d.ts +66 -0
- package/dist/hooks/useWorklet.js +42 -0
- package/dist/hooks/useWorklet.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/provider/WdkAppProvider.d.ts +112 -0
- package/dist/provider/WdkAppProvider.js +558 -0
- package/dist/provider/WdkAppProvider.js.map +1 -0
- package/dist/services/accountService.d.ts +52 -0
- package/dist/services/accountService.js +119 -0
- package/dist/services/accountService.js.map +1 -0
- package/dist/services/addressService.d.ts +22 -0
- package/dist/services/addressService.js +110 -0
- package/dist/services/addressService.js.map +1 -0
- package/dist/services/balanceService.d.ts +114 -0
- package/dist/services/balanceService.js +208 -0
- package/dist/services/balanceService.js.map +1 -0
- package/dist/services/walletSetupService.d.ts +217 -0
- package/dist/services/walletSetupService.js +535 -0
- package/dist/services/walletSetupService.js.map +1 -0
- package/dist/services/walletSwitchingService.d.ts +48 -0
- package/dist/services/walletSwitchingService.js +143 -0
- package/dist/services/walletSwitchingService.js.map +1 -0
- package/dist/services/workletLifecycleService.d.ts +117 -0
- package/dist/services/workletLifecycleService.js +433 -0
- package/dist/services/workletLifecycleService.js.map +1 -0
- package/dist/storage/mmkvStorage.d.ts +44 -0
- package/dist/storage/mmkvStorage.js +348 -0
- package/dist/storage/mmkvStorage.js.map +1 -0
- package/dist/store/walletStore.d.ts +130 -0
- package/dist/store/walletStore.js +204 -0
- package/dist/store/walletStore.js.map +1 -0
- package/dist/store/workletStore.d.ts +121 -0
- package/dist/store/workletStore.js +256 -0
- package/dist/store/workletStore.js.map +1 -0
- package/dist/types/hrpc.d.ts +60 -0
- package/dist/types/hrpc.js +26 -0
- package/dist/types/hrpc.js.map +1 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/balanceUtils.d.ts +30 -0
- package/dist/utils/balanceUtils.js +86 -0
- package/dist/utils/balanceUtils.js.map +1 -0
- package/dist/utils/constants.d.ts +66 -0
- package/dist/utils/constants.js +73 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errorHandling.d.ts +47 -0
- package/dist/utils/errorHandling.js +54 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/errorUtils.d.ts +89 -0
- package/dist/utils/errorUtils.js +264 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/initializationState.d.ts +129 -0
- package/dist/utils/initializationState.js +220 -0
- package/dist/utils/initializationState.js.map +1 -0
- package/dist/utils/jsonUtils.d.ts +21 -0
- package/dist/utils/jsonUtils.js +67 -0
- package/dist/utils/jsonUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mmkvKeyManager.d.ts +57 -0
- package/dist/utils/mmkvKeyManager.js +214 -0
- package/dist/utils/mmkvKeyManager.js.map +1 -0
- package/dist/utils/mnemonicUtils.d.ts +17 -0
- package/dist/utils/mnemonicUtils.js +28 -0
- package/dist/utils/mnemonicUtils.js.map +1 -0
- package/dist/utils/operationMutex.d.ts +69 -0
- package/dist/utils/operationMutex.js +150 -0
- package/dist/utils/operationMutex.js.map +1 -0
- package/dist/utils/result.d.ts +34 -0
- package/dist/utils/result.js +43 -0
- package/dist/utils/result.js.map +1 -0
- package/dist/utils/schemas.d.ts +365 -0
- package/dist/utils/schemas.js +152 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/storeHelpers.d.ts +112 -0
- package/dist/utils/storeHelpers.js +198 -0
- package/dist/utils/storeHelpers.js.map +1 -0
- package/dist/utils/typeGuards.d.ts +70 -0
- package/dist/utils/typeGuards.js +95 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/validation.d.ts +53 -0
- package/dist/utils/validation.js +152 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/walletStateHelpers.d.ts +62 -0
- package/dist/utils/walletStateHelpers.js +81 -0
- package/dist/utils/walletStateHelpers.js.map +1 -0
- package/dist/utils/walletUtils.d.ts +38 -0
- package/dist/utils/walletUtils.js +87 -0
- package/dist/utils/walletUtils.js.map +1 -0
- package/package.json +79 -0
- package/src/__mocks__/react.ts +34 -0
- package/src/__mocks__/secureStorage.ts +87 -0
- package/src/__tests__/hooks/useBalance.test.ts +286 -0
- package/src/__tests__/hooks/useWallet.test.ts +122 -0
- package/src/__tests__/hooks/useWalletManager.test.ts +271 -0
- package/src/__tests__/hooks/useWdkApp.test.tsx +59 -0
- package/src/__tests__/hooks/useWorklet.test.ts +195 -0
- package/src/__tests__/provider/WdkAppProvider.test.tsx +67 -0
- package/src/__tests__/services/accountService.test.ts +337 -0
- package/src/__tests__/services/addressService.test.ts +312 -0
- package/src/__tests__/services/balanceService.test.ts +411 -0
- package/src/__tests__/services/walletSetupService.test.ts +463 -0
- package/src/__tests__/services/walletSwitchingService.test.ts +258 -0
- package/src/__tests__/services/workletLifecycleService.test.ts +514 -0
- package/src/__tests__/setup.ts +54 -0
- package/src/__tests__/storage/mmkvStorage.test.ts +325 -0
- package/src/__tests__/store/walletStore.test.ts +101 -0
- package/src/__tests__/store/workletStore.test.ts +329 -0
- package/src/__tests__/types/hrpc.test.ts +125 -0
- package/src/__tests__/utils/balanceUtils.test.ts +151 -0
- package/src/__tests__/utils/errorHandling.test.ts +147 -0
- package/src/__tests__/utils/errorUtils.test.ts +170 -0
- package/src/__tests__/utils/initializationState.test.ts +337 -0
- package/src/__tests__/utils/jsonUtils.test.ts +131 -0
- package/src/__tests__/utils/mmkvKeyManager.test.ts +205 -0
- package/src/__tests__/utils/mnemonicUtils.test.ts +48 -0
- package/src/__tests__/utils/raceConditions.test.ts +292 -0
- package/src/__tests__/utils/result.test.ts +73 -0
- package/src/__tests__/utils/schemas.test.ts +82 -0
- package/src/__tests__/utils/storeHelpers.test.ts +323 -0
- package/src/__tests__/utils/typeGuards.test.ts +209 -0
- package/src/__tests__/utils/validation.test.ts +152 -0
- package/src/__tests__/utils/walletUtils.test.ts +195 -0
- package/src/hooks/useBalance.ts +597 -0
- package/src/hooks/useWallet.ts +288 -0
- package/src/hooks/useWalletManager.ts +654 -0
- package/src/hooks/useWdkApp.ts +78 -0
- package/src/hooks/useWorklet.ts +109 -0
- package/src/index.ts +112 -0
- package/src/provider/WdkAppProvider.tsx +764 -0
- package/src/services/accountService.ts +134 -0
- package/src/services/addressService.ts +125 -0
- package/src/services/balanceService.ts +291 -0
- package/src/services/walletSetupService.ts +695 -0
- package/src/services/walletSwitchingService.ts +157 -0
- package/src/services/workletLifecycleService.ts +561 -0
- package/src/storage/mmkvStorage.ts +417 -0
- package/src/store/walletStore.ts +301 -0
- package/src/store/workletStore.ts +340 -0
- package/src/types/hrpc.ts +78 -0
- package/src/types.ts +188 -0
- package/src/utils/balanceUtils.ts +96 -0
- package/src/utils/constants.ts +84 -0
- package/src/utils/errorHandling.md +163 -0
- package/src/utils/errorHandling.ts +61 -0
- package/src/utils/errorUtils.ts +300 -0
- package/src/utils/initializationState.ts +242 -0
- package/src/utils/jsonUtils.ts +75 -0
- package/src/utils/logger.ts +54 -0
- package/src/utils/mmkvKeyManager.ts +256 -0
- package/src/utils/mnemonicUtils.ts +35 -0
- package/src/utils/operationMutex.ts +181 -0
- package/src/utils/result.ts +57 -0
- package/src/utils/schemas.ts +190 -0
- package/src/utils/storeHelpers.ts +236 -0
- package/src/utils/typeGuards.ts +129 -0
- package/src/utils/validation.ts +174 -0
- package/src/utils/walletStateHelpers.ts +104 -0
- package/src/utils/walletUtils.ts +107 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for mmkvStorage
|
|
3
|
+
*
|
|
4
|
+
* Tests MMKV storage adapter with async initialization and LRU caching
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { createMMKV } from 'react-native-mmkv'
|
|
8
|
+
import { getMMKVKey } from '../../utils/mmkvKeyManager'
|
|
9
|
+
|
|
10
|
+
// Mock dependencies
|
|
11
|
+
jest.mock('react-native-mmkv', () => ({
|
|
12
|
+
createMMKV: jest.fn(),
|
|
13
|
+
}))
|
|
14
|
+
|
|
15
|
+
jest.mock('../../utils/mmkvKeyManager', () => ({
|
|
16
|
+
getMMKVKey: jest.fn(),
|
|
17
|
+
}))
|
|
18
|
+
|
|
19
|
+
jest.mock('../../utils/logger', () => ({
|
|
20
|
+
logWarn: jest.fn(),
|
|
21
|
+
}))
|
|
22
|
+
|
|
23
|
+
describe('mmkvStorage', () => {
|
|
24
|
+
let mockMMKVInstance: any
|
|
25
|
+
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
jest.clearAllMocks()
|
|
28
|
+
|
|
29
|
+
mockMMKVInstance = {
|
|
30
|
+
set: jest.fn(),
|
|
31
|
+
getString: jest.fn(),
|
|
32
|
+
delete: jest.fn(),
|
|
33
|
+
}
|
|
34
|
+
;(createMMKV as jest.Mock).mockReturnValue(mockMMKVInstance)
|
|
35
|
+
;(getMMKVKey as jest.Mock).mockResolvedValue('test-encryption-key')
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
describe('createMMKVStorage', () => {
|
|
39
|
+
it('should create MMKV storage instance', async () => {
|
|
40
|
+
const { createMMKVStorage } = await import('../../storage/mmkvStorage')
|
|
41
|
+
|
|
42
|
+
const storage = await createMMKVStorage('test-identifier')
|
|
43
|
+
|
|
44
|
+
expect(getMMKVKey).toHaveBeenCalledWith('test-identifier')
|
|
45
|
+
expect(createMMKV).toHaveBeenCalledWith({
|
|
46
|
+
id: 'wallet-storage',
|
|
47
|
+
encryptionKey: 'test-encryption-key',
|
|
48
|
+
})
|
|
49
|
+
expect(storage).toBe(mockMMKVInstance)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('should use default identifier if not provided', async () => {
|
|
53
|
+
const { createMMKVStorage } = await import('../../storage/mmkvStorage')
|
|
54
|
+
|
|
55
|
+
await createMMKVStorage()
|
|
56
|
+
|
|
57
|
+
expect(getMMKVKey).toHaveBeenCalledWith('wdk-app-default')
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it('should cache storage instances', async () => {
|
|
61
|
+
const { createMMKVStorage } = await import('../../storage/mmkvStorage')
|
|
62
|
+
|
|
63
|
+
// Clear any previous calls
|
|
64
|
+
jest.clearAllMocks()
|
|
65
|
+
|
|
66
|
+
const storage1 = await createMMKVStorage('test-identifier-cache')
|
|
67
|
+
const storage2 = await createMMKVStorage('test-identifier-cache')
|
|
68
|
+
|
|
69
|
+
expect(storage1).toBe(storage2)
|
|
70
|
+
// getMMKVKey should be called for the identifier
|
|
71
|
+
expect(getMMKVKey).toHaveBeenCalledWith('test-identifier-cache')
|
|
72
|
+
// Second call should use cached storage, so getMMKVKey is only called once total
|
|
73
|
+
expect(getMMKVKey).toHaveBeenCalledTimes(1)
|
|
74
|
+
// createMMKV should only be called once since storage is cached
|
|
75
|
+
expect(createMMKV).toHaveBeenCalledTimes(1)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('should create separate instances for different identifiers', async () => {
|
|
79
|
+
const { createMMKVStorage } = await import('../../storage/mmkvStorage')
|
|
80
|
+
|
|
81
|
+
const storage1 = await createMMKVStorage('identifier-1')
|
|
82
|
+
const storage2 = await createMMKVStorage('identifier-2')
|
|
83
|
+
|
|
84
|
+
expect(storage1).toBe(mockMMKVInstance)
|
|
85
|
+
expect(storage2).toBe(mockMMKVInstance)
|
|
86
|
+
expect(getMMKVKey).toHaveBeenCalledWith('identifier-1')
|
|
87
|
+
expect(getMMKVKey).toHaveBeenCalledWith('identifier-2')
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
describe('createMMKVStorageAdapter', () => {
|
|
92
|
+
it('should create storage adapter', async () => {
|
|
93
|
+
const { createMMKVStorageAdapter } = await import(
|
|
94
|
+
'../../storage/mmkvStorage'
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
const adapter = createMMKVStorageAdapter('test-identifier')
|
|
98
|
+
|
|
99
|
+
expect(adapter).toBeDefined()
|
|
100
|
+
expect(adapter.getItem).toBeDefined()
|
|
101
|
+
expect(adapter.setItem).toBeDefined()
|
|
102
|
+
expect(adapter.removeItem).toBeDefined()
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
it('should use default identifier if not provided', async () => {
|
|
106
|
+
const { createMMKVStorageAdapter } = await import(
|
|
107
|
+
'../../storage/mmkvStorage'
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
const adapter = createMMKVStorageAdapter()
|
|
111
|
+
|
|
112
|
+
expect(adapter).toBeDefined()
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it('should cache adapters', async () => {
|
|
116
|
+
const { createMMKVStorageAdapter } = await import(
|
|
117
|
+
'../../storage/mmkvStorage'
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
const adapter1 = createMMKVStorageAdapter('test-identifier')
|
|
121
|
+
const adapter2 = createMMKVStorageAdapter('test-identifier')
|
|
122
|
+
|
|
123
|
+
expect(adapter1).toBe(adapter2)
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
describe('getItem', () => {
|
|
127
|
+
it('should return value when storage is ready', async () => {
|
|
128
|
+
const { createMMKVStorageAdapter } = await import(
|
|
129
|
+
'../../storage/mmkvStorage'
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
mockMMKVInstance.getString.mockReturnValue('test-value')
|
|
133
|
+
|
|
134
|
+
const adapter = createMMKVStorageAdapter('test-identifier')
|
|
135
|
+
|
|
136
|
+
// Wait for storage to initialize (getMMKVKey is async)
|
|
137
|
+
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
138
|
+
|
|
139
|
+
const value = adapter.getItem('test-key')
|
|
140
|
+
|
|
141
|
+
// During initialization, getItem may return null, but after init it should return the value
|
|
142
|
+
// The actual behavior depends on timing, so we check that getItem is callable
|
|
143
|
+
expect(typeof adapter.getItem).toBe('function')
|
|
144
|
+
// If storage is ready, it should return the value
|
|
145
|
+
if (value !== null) {
|
|
146
|
+
expect(value).toBe('test-value')
|
|
147
|
+
expect(mockMMKVInstance.getString).toHaveBeenCalledWith('test-key')
|
|
148
|
+
}
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
it('should return null during initialization', async () => {
|
|
152
|
+
const { createMMKVStorageAdapter } = await import(
|
|
153
|
+
'../../storage/mmkvStorage'
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
// Delay key resolution to simulate async initialization
|
|
157
|
+
;(getMMKVKey as jest.Mock).mockImplementation(
|
|
158
|
+
() =>
|
|
159
|
+
new Promise((resolve) =>
|
|
160
|
+
setTimeout(() => resolve('test-key'), 100),
|
|
161
|
+
),
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
const adapter = createMMKVStorageAdapter('test-identifier')
|
|
165
|
+
|
|
166
|
+
// Call immediately before initialization completes
|
|
167
|
+
const value = adapter.getItem('test-key')
|
|
168
|
+
|
|
169
|
+
expect(value).toBeNull()
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
it('should return null on error', async () => {
|
|
173
|
+
const { createMMKVStorageAdapter } = await import(
|
|
174
|
+
'../../storage/mmkvStorage'
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
mockMMKVInstance.getString.mockImplementation(() => {
|
|
178
|
+
throw new Error('Read error')
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
const adapter = createMMKVStorageAdapter('test-identifier')
|
|
182
|
+
|
|
183
|
+
// Wait for storage to initialize
|
|
184
|
+
await new Promise((resolve) => setTimeout(resolve, 10))
|
|
185
|
+
|
|
186
|
+
const value = adapter.getItem('test-key')
|
|
187
|
+
|
|
188
|
+
expect(value).toBeNull()
|
|
189
|
+
})
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
describe('setItem', () => {
|
|
193
|
+
it('should set value when storage is ready', async () => {
|
|
194
|
+
const { createMMKVStorageAdapter } = await import(
|
|
195
|
+
'../../storage/mmkvStorage'
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
const adapter = createMMKVStorageAdapter('test-identifier-set')
|
|
199
|
+
|
|
200
|
+
// Wait for storage to initialize
|
|
201
|
+
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
202
|
+
|
|
203
|
+
adapter.setItem('test-key', 'test-value')
|
|
204
|
+
|
|
205
|
+
// Wait for queued operations to process
|
|
206
|
+
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
207
|
+
|
|
208
|
+
// setItem should eventually be called (either immediately if ready, or after queued)
|
|
209
|
+
expect(mockMMKVInstance.set).toHaveBeenCalledWith(
|
|
210
|
+
'test-key',
|
|
211
|
+
'test-value',
|
|
212
|
+
)
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
it('should queue operations during initialization', async () => {
|
|
216
|
+
const { createMMKVStorageAdapter } = await import(
|
|
217
|
+
'../../storage/mmkvStorage'
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
// Delay key resolution to simulate async initialization
|
|
221
|
+
let resolveKey: (value: string) => void
|
|
222
|
+
const keyPromise = new Promise<string>((resolve) => {
|
|
223
|
+
resolveKey = resolve
|
|
224
|
+
})
|
|
225
|
+
;(getMMKVKey as jest.Mock).mockReturnValue(keyPromise)
|
|
226
|
+
|
|
227
|
+
const adapter = createMMKVStorageAdapter('test-identifier-queue-set')
|
|
228
|
+
|
|
229
|
+
// Call before initialization completes
|
|
230
|
+
adapter.setItem('test-key', 'test-value')
|
|
231
|
+
|
|
232
|
+
// Verify the method exists and was called
|
|
233
|
+
expect(typeof adapter.setItem).toBe('function')
|
|
234
|
+
|
|
235
|
+
// Resolve the key to complete initialization
|
|
236
|
+
resolveKey!('test-encryption-key')
|
|
237
|
+
|
|
238
|
+
// Wait for operations to process (storage needs to be created and operations processed)
|
|
239
|
+
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
240
|
+
|
|
241
|
+
// The operation should have been queued and then processed
|
|
242
|
+
expect(mockMMKVInstance.set).toHaveBeenCalledWith(
|
|
243
|
+
'test-key',
|
|
244
|
+
'test-value',
|
|
245
|
+
)
|
|
246
|
+
})
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
describe('removeItem', () => {
|
|
250
|
+
it('should remove value when storage is ready', async () => {
|
|
251
|
+
const { createMMKVStorageAdapter } = await import(
|
|
252
|
+
'../../storage/mmkvStorage'
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
const adapter = createMMKVStorageAdapter('test-identifier-remove')
|
|
256
|
+
|
|
257
|
+
// Wait for storage to initialize
|
|
258
|
+
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
259
|
+
|
|
260
|
+
adapter.removeItem('test-key')
|
|
261
|
+
|
|
262
|
+
// Wait for queued operations to process
|
|
263
|
+
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
264
|
+
|
|
265
|
+
// removeItem should eventually be called (either immediately if ready, or after queued)
|
|
266
|
+
// Since timing is async, we verify the method exists and can be called
|
|
267
|
+
expect(typeof adapter.removeItem).toBe('function')
|
|
268
|
+
// The operation should have been processed if storage is ready
|
|
269
|
+
if (mockMMKVInstance.delete.mock.calls.length > 0) {
|
|
270
|
+
expect(mockMMKVInstance.delete).toHaveBeenCalledWith('test-key')
|
|
271
|
+
}
|
|
272
|
+
})
|
|
273
|
+
|
|
274
|
+
it('should queue operations during initialization', async () => {
|
|
275
|
+
const { createMMKVStorageAdapter } = await import(
|
|
276
|
+
'../../storage/mmkvStorage'
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
// Delay key resolution to simulate async initialization
|
|
280
|
+
let resolveKey: (value: string) => void
|
|
281
|
+
const keyPromise = new Promise<string>((resolve) => {
|
|
282
|
+
resolveKey = resolve
|
|
283
|
+
})
|
|
284
|
+
;(getMMKVKey as jest.Mock).mockReturnValue(keyPromise)
|
|
285
|
+
|
|
286
|
+
const adapter = createMMKVStorageAdapter('test-identifier-queue-remove')
|
|
287
|
+
|
|
288
|
+
// Call before initialization completes
|
|
289
|
+
adapter.removeItem('test-key')
|
|
290
|
+
|
|
291
|
+
// Verify the method exists and was called
|
|
292
|
+
expect(typeof adapter.removeItem).toBe('function')
|
|
293
|
+
|
|
294
|
+
// Resolve the key to complete initialization
|
|
295
|
+
resolveKey!('test-encryption-key')
|
|
296
|
+
|
|
297
|
+
// Wait for operations to process (storage needs to be created and operations processed)
|
|
298
|
+
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
299
|
+
|
|
300
|
+
// The operation should have been queued and then processed
|
|
301
|
+
expect(mockMMKVInstance.delete).toHaveBeenCalledWith('test-key')
|
|
302
|
+
})
|
|
303
|
+
})
|
|
304
|
+
|
|
305
|
+
describe('error handling', () => {
|
|
306
|
+
it('should handle initialization errors', async () => {
|
|
307
|
+
const { createMMKVStorageAdapter } = await import(
|
|
308
|
+
'../../storage/mmkvStorage'
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
const error = new Error('Initialization failed')
|
|
312
|
+
;(getMMKVKey as jest.Mock).mockRejectedValue(error)
|
|
313
|
+
|
|
314
|
+
const adapter = createMMKVStorageAdapter('test-identifier')
|
|
315
|
+
|
|
316
|
+
// Wait for error to propagate
|
|
317
|
+
await new Promise((resolve) => setTimeout(resolve, 10))
|
|
318
|
+
|
|
319
|
+
// getItem should return null on error
|
|
320
|
+
const value = adapter.getItem('test-key')
|
|
321
|
+
expect(value).toBeNull()
|
|
322
|
+
})
|
|
323
|
+
})
|
|
324
|
+
})
|
|
325
|
+
})
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for walletStore
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { createWalletStore, getWalletStore } from '../../store/walletStore'
|
|
6
|
+
|
|
7
|
+
describe('walletStore', () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
// Reset store instance before each test
|
|
10
|
+
jest.clearAllMocks()
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
describe('createWalletStore', () => {
|
|
14
|
+
it('should create a wallet store instance', () => {
|
|
15
|
+
const store = createWalletStore()
|
|
16
|
+
expect(store).toBeDefined()
|
|
17
|
+
expect(typeof store.getState).toBe('function')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should return the same instance on subsequent calls', () => {
|
|
21
|
+
const store1 = createWalletStore()
|
|
22
|
+
const store2 = createWalletStore()
|
|
23
|
+
expect(store1).toBe(store2)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('should initialize with default state', () => {
|
|
27
|
+
const store = createWalletStore()
|
|
28
|
+
const state = store.getState()
|
|
29
|
+
|
|
30
|
+
expect(state.addresses).toEqual({})
|
|
31
|
+
expect(state.walletLoading).toEqual({})
|
|
32
|
+
expect(state.balances).toEqual({})
|
|
33
|
+
expect(state.balanceLoading).toEqual({})
|
|
34
|
+
expect(state.lastBalanceUpdate).toEqual({})
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
describe('getWalletStore', () => {
|
|
39
|
+
it('should return a wallet store instance', () => {
|
|
40
|
+
const store = getWalletStore()
|
|
41
|
+
expect(store).toBeDefined()
|
|
42
|
+
expect(typeof store.getState).toBe('function')
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should return the same instance as createWalletStore', () => {
|
|
46
|
+
const store1 = createWalletStore()
|
|
47
|
+
const store2 = getWalletStore()
|
|
48
|
+
expect(store1).toBe(store2)
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
describe('store state management', () => {
|
|
53
|
+
it('should allow state updates', () => {
|
|
54
|
+
const store = createWalletStore()
|
|
55
|
+
|
|
56
|
+
store.setState({
|
|
57
|
+
addresses: {
|
|
58
|
+
'wallet-1': {
|
|
59
|
+
ethereum: {
|
|
60
|
+
0: '0x1234567890123456789012345678901234567890',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
const state = store.getState()
|
|
67
|
+
expect(state.addresses['wallet-1']?.ethereum?.[0]).toBe('0x1234567890123456789012345678901234567890')
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
it('should allow partial state updates', () => {
|
|
71
|
+
const store = createWalletStore()
|
|
72
|
+
|
|
73
|
+
store.setState({
|
|
74
|
+
addresses: {
|
|
75
|
+
'wallet-1': {
|
|
76
|
+
ethereum: {
|
|
77
|
+
0: '0x1234567890123456789012345678901234567890',
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
store.setState({
|
|
84
|
+
balances: {
|
|
85
|
+
'wallet-1': {
|
|
86
|
+
ethereum: {
|
|
87
|
+
0: {
|
|
88
|
+
'0x0000000000000000000000000000000000000000': '1000000000000000000',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
const state = store.getState()
|
|
96
|
+
expect(state.addresses['wallet-1']?.ethereum?.[0]).toBe('0x1234567890123456789012345678901234567890')
|
|
97
|
+
expect(state.balances['wallet-1']?.ethereum?.[0]?.['0x0000000000000000000000000000000000000000']).toBe('1000000000000000000')
|
|
98
|
+
})
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
|