Repository navigation
Expand file tree
/
Copy pathjest.setup.js
More file actions
122 lines (112 loc) · 4.26 KB
/
Copy pathjest.setup.js
File metadata and controls
122 lines (112 loc) · 4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// react-native-mmkv 本体は import 時に react-native-nitro-modules(ネイティブ
// バイナリ必須)を引き込んで落ちるため、ライブラリ同梱のインメモリ実装
// createMockMMKV だけを取り出して createMMKV を差し替える。
jest.mock("react-native-mmkv", () => {
const {
createMockMMKV,
} = require("react-native-mmkv/lib/createMMKV/createMockMMKV");
return {
createMMKV: (config) => createMockMMKV(config),
};
});
// AsyncStorage は MMKV への移行処理(src/lib/storage.ts)でのみ参照される
jest.mock("@react-native-async-storage/async-storage", () => ({
__esModule: true,
default: {
getItem: jest.fn(() => Promise.resolve(null)),
setItem: jest.fn(() => Promise.resolve()),
removeItem: jest.fn(() => Promise.resolve()),
clear: jest.fn(() => Promise.resolve()),
getAllKeys: jest.fn(() => Promise.resolve([])),
multiGet: jest.fn((keys) => Promise.resolve(keys.map((key) => [key, null]))),
multiSet: jest.fn(() => Promise.resolve()),
multiRemove: jest.fn(() => Promise.resolve()),
},
}));
jest.mock("~/hooks", () => ({
useCurrentStation: jest.fn(() => null),
useThemeStore: jest.fn(() => ({})),
useCurrentLine: jest.fn(() => ({})),
useNextStation: jest.fn(() => ({})),
usePrevious: jest.fn((value) => value),
useLazyPrevious: jest.fn((value) => value),
useIsNextLastStop: jest.fn(() => false),
useCurrentTrainType: jest.fn(() => ({})),
useBoundText: jest.fn(() => ({})),
useLoopLine: jest.fn(() => ({})),
useNumbering: jest.fn(() => []),
useClock: jest.fn(() => []),
useInterval: jest.fn(() => null),
useLandscapeWindowDimensions: jest.fn(() => ({ width: 812, height: 375 })),
}));
jest.mock("react-native-reanimated", () => {
const Reanimated = require("react-native-reanimated/mock");
return {
...Reanimated,
useSharedValue: jest.fn(() => ({ value: 1 })),
useAnimatedStyle: jest.fn(() => ({})),
withTiming: jest.fn((value) => value),
runOnJS: jest.fn((fn) => fn),
Easing: {
ease: jest.fn(),
linear: jest.fn(),
quad: jest.fn(),
in: jest.fn((fn) => fn),
out: jest.fn((fn) => fn),
inOut: jest.fn((fn) => fn),
bezier: jest.fn(() => jest.fn()),
},
};
});
jest.mock("~/utils/isTablet", () => ({
__esModule: true,
default: false,
}));
jest.mock("react-native-localize", () => ({
findBestLanguageTag: jest.fn(() => "ja"),
}));
// react-native-device-info はネイティブ依存(NativeEventEmitter)のためモックする。
// isDevApp 経由で広く import されるため、グローバル setup でモックしておく。
jest.mock("react-native-device-info", () =>
require("react-native-device-info/jest/react-native-device-info-mock")
);
// react-native-maps は読み込むだけでネイティブモジュール(RNMapsAirModule)を要求するため、
// 地図と図形を props と子要素をそのまま持つ View に置き換える
jest.mock("react-native-maps", () => {
const React = require("react");
const { View } = require("react-native");
const make = (name) => {
const Component = (props) => React.createElement(View, props, props.children);
Component.displayName = name;
return Component;
};
return {
__esModule: true,
default: make("MapView"),
Marker: make("Marker"),
Polyline: make("Polyline"),
Circle: make("Circle"),
};
});
// SecureStore はネイティブモジュール依存のためインメモリでモックする。
// store はモジュールスコープで保持されるため、テスト間で値がリークしないよう
// 各テスト前にリセットする(mock 接頭辞が必要)。
const mockSecureStore = {};
jest.mock("expo-secure-store", () => ({
getItemAsync: jest.fn(async (key) => mockSecureStore[key] ?? null),
setItemAsync: jest.fn(async (key, value) => {
mockSecureStore[key] = value;
}),
deleteItemAsync: jest.fn(async (key) => {
delete mockSecureStore[key];
}),
}));
beforeEach(() => {
for (const key of Object.keys(mockSecureStore)) {
delete mockSecureStore[key];
}
// 共有 MMKV インスタンス(Jest では react-native-mmkv 組み込みの
// インメモリ実装)をテストごとに空へ戻す
const { storage } = require("./src/lib/storage");
storage.clearAll();
});