Skip to content

Commit 3a5da50

Browse files
fix: expo doctor
1 parent 96d0a9c commit 3a5da50

4 files changed

Lines changed: 175 additions & 162 deletions

File tree

__mocks__/react-native-mmkv.ts

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,48 @@
11
const sharedMockStorage = new Map<string, string>();
22

3-
const createMockStorage = () => ({
4-
getString: (key: string): string | undefined => sharedMockStorage.get(key),
5-
set: (key: string, value: string): void => {
3+
const createMockStorage = () => {
4+
const mockGetString = jest.fn((key: string): string | undefined =>
5+
sharedMockStorage.get(key),
6+
);
7+
8+
const mockSet = jest.fn((key: string, value: string): void => {
69
sharedMockStorage.set(key, value);
7-
},
8-
remove: (key: string): void => {
10+
});
11+
12+
const mockRemove = jest.fn((key: string): void => {
913
sharedMockStorage.delete(key);
10-
},
11-
clearAll: (): void => {
12-
sharedMockStorage.clear();
13-
},
14-
getAllKeys: (): Array<string> => Array.from(sharedMockStorage.keys()),
15-
contains: (key: string): boolean => sharedMockStorage.has(key),
16-
getNumber: (key: string): number | undefined => {
17-
const value = sharedMockStorage.get(key);
18-
return value ? Number(value) : undefined;
19-
},
20-
getBoolean: (key: string): boolean | undefined => {
21-
const value = sharedMockStorage.get(key);
22-
if (value === undefined) {
23-
return undefined;
24-
}
25-
return value === 'true';
26-
},
27-
setNumber: (key: string, value: number): void => {
28-
sharedMockStorage.set(key, String(value));
29-
},
30-
setBoolean: (key: string, value: boolean): void => {
31-
sharedMockStorage.set(key, String(value));
32-
},
33-
});
14+
});
15+
16+
return {
17+
getString: mockGetString,
18+
set: mockSet,
19+
remove: mockRemove,
20+
clearAll: jest.fn((): void => {
21+
sharedMockStorage.clear();
22+
}),
23+
getAllKeys: jest.fn(
24+
(): Array<string> => Array.from(sharedMockStorage.keys()),
25+
),
26+
contains: jest.fn((key: string): boolean => sharedMockStorage.has(key)),
27+
getNumber: jest.fn((key: string): number | undefined => {
28+
const value = sharedMockStorage.get(key);
29+
return value ? Number(value) : undefined;
30+
}),
31+
getBoolean: jest.fn((key: string): boolean | undefined => {
32+
const value = sharedMockStorage.get(key);
33+
if (value === undefined) {
34+
return undefined;
35+
}
36+
return value === 'true';
37+
}),
38+
setNumber: jest.fn((key: string, value: number): void => {
39+
sharedMockStorage.set(key, String(value));
40+
}),
41+
setBoolean: jest.fn((key: string, value: boolean): void => {
42+
sharedMockStorage.set(key, String(value));
43+
}),
44+
};
45+
};
3446

3547
export function createMMKV(_options?: { id?: string }) {
3648
return createMockStorage();

__tests__/lib/storage.test.tsx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
1-
import { type MMKV } from 'react-native-mmkv';
2-
31
import { getItem, removeItem, setItem, storage } from '@/lib/storage';
42

53
const TEST_VALUE = 123;
64
const TEST_NUMBER = 42;
75

86
// Mock react-native-mmkv
9-
jest.mock('react-native-mmkv', () => ({
10-
MMKV: jest.fn().mockImplementation(() => ({
11-
getString: jest.fn(),
12-
set: jest.fn(),
13-
delete: jest.fn(),
14-
})),
15-
}));
16-
7+
// Note: The mock is already set up globally in jest-setup.ts
8+
// We just need to cast the storage to access jest mock functions
179
function setupMockStorage() {
18-
const mockStorage = storage as jest.Mocked<MMKV>;
10+
const mockStorage = storage as unknown as {
11+
getString: jest.Mock;
12+
set: jest.Mock;
13+
remove: jest.Mock;
14+
};
1915
jest.clearAllMocks();
2016
return mockStorage;
2117
}
2218

2319
describe('storage utilities', () => {
24-
let mockStorage: jest.Mocked<MMKV>;
20+
let mockStorage: {
21+
getString: jest.Mock;
22+
set: jest.Mock;
23+
remove: jest.Mock;
24+
};
2525

2626
beforeEach(() => {
2727
mockStorage = setupMockStorage();
@@ -83,10 +83,10 @@ describe('storage utilities', () => {
8383
});
8484

8585
describe('removeItem', () => {
86-
it('should delete the key from storage', async () => {
86+
it('should remove the key from storage', async () => {
8787
await removeItem('test-key');
8888

89-
expect(mockStorage.delete).toHaveBeenCalledWith('test-key');
89+
expect(mockStorage.remove).toHaveBeenCalledWith('test-key');
9090
});
9191
});
9292
});

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,16 @@
7171
"app-icon-badge": "^0.1.2",
7272
"axios": "^1.7.5",
7373
"dayjs": "^1.11.13",
74-
"expo": "~54.0.31",
74+
"expo": "~54.0.32",
7575
"expo-build-properties": "^1.0.10",
7676
"expo-constants": "~18.0.13",
7777
"expo-crypto": "^15.0.8",
7878
"expo-dev-client": "~6.0.20",
79-
"expo-font": "~14.0.10",
79+
"expo-font": "~14.0.11",
8080
"expo-image": "~3.0.11",
8181
"expo-linking": "~8.0.11",
8282
"expo-localization": "~17.0.8",
83-
"expo-router": "~6.0.21",
83+
"expo-router": "~6.0.22",
8484
"expo-splash-screen": "~31.0.13",
8585
"expo-status-bar": "~3.0.9",
8686
"expo-system-ui": "~6.0.9",

0 commit comments

Comments
 (0)