@youversion/platform-react-hooks 1.18.1 → 1.19.0
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/.turbo/turbo-build.log +1 -1
- package/AGENTS.md +3 -7
- package/CHANGELOG.md +17 -0
- package/dist/__tests__/mocks/bibles.d.ts +6 -1
- package/dist/__tests__/mocks/bibles.d.ts.map +1 -1
- package/dist/__tests__/mocks/bibles.js +10 -0
- package/dist/__tests__/mocks/bibles.js.map +1 -1
- package/dist/__tests__/mocks/core-mock-factory.d.ts +83 -0
- package/dist/__tests__/mocks/core-mock-factory.d.ts.map +1 -0
- package/dist/__tests__/mocks/core-mock-factory.js +138 -0
- package/dist/__tests__/mocks/core-mock-factory.js.map +1 -0
- package/dist/context/ReaderContext.d.ts +6 -0
- package/dist/context/ReaderContext.d.ts.map +1 -1
- package/dist/context/ReaderContext.js +6 -0
- package/dist/context/ReaderContext.js.map +1 -1
- package/dist/context/ReaderProvider.d.ts +3 -0
- package/dist/context/ReaderProvider.d.ts.map +1 -1
- package/dist/context/ReaderProvider.js +3 -0
- package/dist/context/ReaderProvider.js.map +1 -1
- package/dist/context/VerseSelectionContext.d.ts +6 -0
- package/dist/context/VerseSelectionContext.d.ts.map +1 -1
- package/dist/context/VerseSelectionContext.js +3 -0
- package/dist/context/VerseSelectionContext.js.map +1 -1
- package/dist/context/VerseSelectionProvider.d.ts +3 -0
- package/dist/context/VerseSelectionProvider.d.ts.map +1 -1
- package/dist/context/VerseSelectionProvider.js +3 -0
- package/dist/context/VerseSelectionProvider.js.map +1 -1
- package/dist/test/utils.d.ts +7 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/test/utils.js +7 -0
- package/dist/test/utils.js.map +1 -0
- package/dist/useChapterNavigation.d.ts +3 -0
- package/dist/useChapterNavigation.d.ts.map +1 -1
- package/dist/useChapterNavigation.js +3 -0
- package/dist/useChapterNavigation.js.map +1 -1
- package/dist/useInitData.d.ts +4 -0
- package/dist/useInitData.d.ts.map +1 -1
- package/dist/useInitData.js +4 -0
- package/dist/useInitData.js.map +1 -1
- package/dist/useVerseSelection.d.ts +3 -0
- package/dist/useVerseSelection.d.ts.map +1 -1
- package/dist/useVerseSelection.js +3 -0
- package/dist/useVerseSelection.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/mocks/bibles.ts +18 -1
- package/src/__tests__/mocks/core-mock-factory.ts +226 -0
- package/src/context/ReaderContext.tsx +6 -0
- package/src/context/ReaderProvider.tsx +3 -0
- package/src/context/VerseSelectionContext.tsx +6 -0
- package/src/context/VerseSelectionProvider.tsx +3 -0
- package/src/context/YouVersionAuthProvider.test.tsx +14 -131
- package/src/test/utils.tsx +12 -0
- package/src/useBibleClient.test.tsx +8 -37
- package/src/useBook.test.tsx +158 -0
- package/src/useBooks.test.tsx +148 -0
- package/src/useChapter.test.tsx +70 -128
- package/src/useChapterNavigation.ts +3 -0
- package/src/useChapters.test.tsx +80 -150
- package/src/useHighlights.test.tsx +33 -104
- package/src/useInitData.ts +4 -0
- package/src/useLanguage.test.tsx +8 -10
- package/src/useLanguageClient.test.tsx +9 -25
- package/src/useLanguages.test.tsx +27 -64
- package/src/usePassage.test.tsx +304 -0
- package/src/useTheme.test.tsx +32 -0
- package/src/useVOTD.test.tsx +28 -67
- package/src/useVerse.test.tsx +73 -149
- package/src/useVerseSelection.ts +3 -0
- package/src/useVerses.test.tsx +37 -104
- package/src/useVersion.test.tsx +29 -66
- package/src/useVersions.test.tsx +72 -154
- package/src/useYVAuth.test.tsx +26 -134
- package/src/utility/getDayOfYear.test.ts +48 -0
- package/vitest.config.ts +12 -0
- package/src/context/ReaderProvider.test.tsx +0 -264
- package/src/context/VerseSelectionProvider.test.tsx +0 -362
- package/src/useChapterNavigation.test.tsx +0 -160
- package/src/useVerseSelection.test.tsx +0 -33
- package/vitest.setup.ts +0 -1
package/src/useVOTD.test.tsx
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { renderHook, waitFor } from '@testing-library/react';
|
|
2
|
-
import { describe,
|
|
2
|
+
import { describe, expect, vi, beforeEach, it, type Mock } from 'vitest';
|
|
3
3
|
import type { ReactNode } from 'react';
|
|
4
4
|
import { useVerseOfTheDay } from './useVOTD';
|
|
5
5
|
import { YouVersionContext } from './context';
|
|
6
6
|
import { BibleClient, ApiClient, type VOTD } from '@youversion/platform-core';
|
|
7
|
+
import { createYVWrapper } from './test/utils';
|
|
7
8
|
|
|
8
|
-
// Mock the core package
|
|
9
9
|
vi.mock('@youversion/platform-core', async () => {
|
|
10
10
|
const actual = await vi.importActual('@youversion/platform-core');
|
|
11
11
|
return {
|
|
@@ -20,8 +20,6 @@ vi.mock('@youversion/platform-core', async () => {
|
|
|
20
20
|
});
|
|
21
21
|
|
|
22
22
|
describe('useVerseOfTheDay', () => {
|
|
23
|
-
const mockAppKey = 'test-app-key';
|
|
24
|
-
|
|
25
23
|
const mockVOTD: VOTD = {
|
|
26
24
|
day: 1,
|
|
27
25
|
passage_id: 'ISA.43.19',
|
|
@@ -29,15 +27,7 @@ describe('useVerseOfTheDay', () => {
|
|
|
29
27
|
|
|
30
28
|
let mockGetVOTD: Mock;
|
|
31
29
|
|
|
32
|
-
const createWrapper = (contextValue: { appKey: string }) => {
|
|
33
|
-
return ({ children }: { children: ReactNode }) => (
|
|
34
|
-
<YouVersionContext.Provider value={contextValue}>{children}</YouVersionContext.Provider>
|
|
35
|
-
);
|
|
36
|
-
};
|
|
37
|
-
|
|
38
30
|
beforeEach(() => {
|
|
39
|
-
vi.clearAllMocks();
|
|
40
|
-
|
|
41
31
|
mockGetVOTD = vi.fn().mockResolvedValue(mockVOTD);
|
|
42
32
|
|
|
43
33
|
(BibleClient as unknown as ReturnType<typeof vi.fn>).mockImplementation(function () {
|
|
@@ -61,9 +51,7 @@ describe('useVerseOfTheDay', () => {
|
|
|
61
51
|
});
|
|
62
52
|
|
|
63
53
|
it('should throw error when appKey is missing', () => {
|
|
64
|
-
const wrapper =
|
|
65
|
-
appKey: '',
|
|
66
|
-
});
|
|
54
|
+
const wrapper = createYVWrapper('');
|
|
67
55
|
|
|
68
56
|
expect(() => renderHook(() => useVerseOfTheDay(1), { wrapper })).toThrow(
|
|
69
57
|
'YouVersion context not found. Make sure your component is wrapped with YouVersionProvider and an API key is provided.',
|
|
@@ -73,23 +61,17 @@ describe('useVerseOfTheDay', () => {
|
|
|
73
61
|
|
|
74
62
|
describe('client creation', () => {
|
|
75
63
|
it('should create BibleClient with correct ApiClient config', () => {
|
|
76
|
-
const wrapper =
|
|
77
|
-
appKey: mockAppKey,
|
|
78
|
-
});
|
|
79
|
-
|
|
64
|
+
const wrapper = createYVWrapper();
|
|
80
65
|
renderHook(() => useVerseOfTheDay(1), { wrapper });
|
|
81
66
|
|
|
82
67
|
expect(ApiClient).toHaveBeenCalledWith({
|
|
83
|
-
appKey:
|
|
68
|
+
appKey: 'test-app-key',
|
|
84
69
|
});
|
|
85
70
|
expect(BibleClient).toHaveBeenCalledWith(expect.objectContaining({ isApiClient: true }));
|
|
86
71
|
});
|
|
87
72
|
|
|
88
73
|
it('should memoize BibleClient instance', () => {
|
|
89
|
-
const wrapper =
|
|
90
|
-
appKey: mockAppKey,
|
|
91
|
-
});
|
|
92
|
-
|
|
74
|
+
const wrapper = createYVWrapper();
|
|
93
75
|
const { result, rerender } = renderHook(() => useVerseOfTheDay(1), { wrapper });
|
|
94
76
|
const _firstRefetch = result.current.refetch;
|
|
95
77
|
|
|
@@ -100,7 +82,7 @@ describe('useVerseOfTheDay', () => {
|
|
|
100
82
|
});
|
|
101
83
|
|
|
102
84
|
it('should create new BibleClient when context values change', () => {
|
|
103
|
-
let currentAppKey =
|
|
85
|
+
let currentAppKey = 'test-app-key';
|
|
104
86
|
|
|
105
87
|
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
106
88
|
<YouVersionContext.Provider
|
|
@@ -125,10 +107,7 @@ describe('useVerseOfTheDay', () => {
|
|
|
125
107
|
|
|
126
108
|
describe('fetching VOTD', () => {
|
|
127
109
|
it('should fetch VOTD for day 1', async () => {
|
|
128
|
-
const wrapper =
|
|
129
|
-
appKey: mockAppKey,
|
|
130
|
-
});
|
|
131
|
-
|
|
110
|
+
const wrapper = createYVWrapper();
|
|
132
111
|
const { result } = renderHook(() => useVerseOfTheDay(1), { wrapper });
|
|
133
112
|
|
|
134
113
|
expect(result.current.loading).toBe(true);
|
|
@@ -138,51 +117,42 @@ describe('useVerseOfTheDay', () => {
|
|
|
138
117
|
expect(result.current.loading).toBe(false);
|
|
139
118
|
});
|
|
140
119
|
|
|
141
|
-
expect(mockGetVOTD).toHaveBeenCalledWith(1);
|
|
142
|
-
expect(result.current.data).toEqual(mockVOTD);
|
|
120
|
+
expect.soft(mockGetVOTD).toHaveBeenCalledWith(1);
|
|
121
|
+
expect.soft(result.current.data).toEqual(mockVOTD);
|
|
143
122
|
});
|
|
144
123
|
|
|
145
124
|
it('should fetch VOTD for day 100', async () => {
|
|
125
|
+
const wrapper = createYVWrapper();
|
|
146
126
|
const mockVOTD100: VOTD = { day: 100, passage_id: 'PSA.23.1' };
|
|
147
127
|
mockGetVOTD.mockResolvedValueOnce(mockVOTD100);
|
|
148
128
|
|
|
149
|
-
const wrapper = createWrapper({
|
|
150
|
-
appKey: mockAppKey,
|
|
151
|
-
});
|
|
152
|
-
|
|
153
129
|
const { result } = renderHook(() => useVerseOfTheDay(100), { wrapper });
|
|
154
130
|
|
|
155
131
|
await waitFor(() => {
|
|
156
132
|
expect(result.current.loading).toBe(false);
|
|
157
133
|
});
|
|
158
134
|
|
|
159
|
-
expect(mockGetVOTD).toHaveBeenCalledWith(100);
|
|
160
|
-
expect(result.current.data).toEqual(mockVOTD100);
|
|
135
|
+
expect.soft(mockGetVOTD).toHaveBeenCalledWith(100);
|
|
136
|
+
expect.soft(result.current.data).toEqual(mockVOTD100);
|
|
161
137
|
});
|
|
162
138
|
|
|
163
139
|
it('should fetch VOTD for day 366', async () => {
|
|
140
|
+
const wrapper = createYVWrapper();
|
|
164
141
|
const mockVOTD366: VOTD = { day: 366, passage_id: 'REV.22.21' };
|
|
165
142
|
mockGetVOTD.mockResolvedValueOnce(mockVOTD366);
|
|
166
143
|
|
|
167
|
-
const wrapper = createWrapper({
|
|
168
|
-
appKey: mockAppKey,
|
|
169
|
-
});
|
|
170
|
-
|
|
171
144
|
const { result } = renderHook(() => useVerseOfTheDay(366), { wrapper });
|
|
172
145
|
|
|
173
146
|
await waitFor(() => {
|
|
174
147
|
expect(result.current.loading).toBe(false);
|
|
175
148
|
});
|
|
176
149
|
|
|
177
|
-
expect(mockGetVOTD).toHaveBeenCalledWith(366);
|
|
178
|
-
expect(result.current.data).toEqual(mockVOTD366);
|
|
150
|
+
expect.soft(mockGetVOTD).toHaveBeenCalledWith(366);
|
|
151
|
+
expect.soft(result.current.data).toEqual(mockVOTD366);
|
|
179
152
|
});
|
|
180
153
|
|
|
181
154
|
it('should refetch when day changes', async () => {
|
|
182
|
-
const wrapper =
|
|
183
|
-
appKey: mockAppKey,
|
|
184
|
-
});
|
|
185
|
-
|
|
155
|
+
const wrapper = createYVWrapper();
|
|
186
156
|
const { result, rerender } = renderHook(({ day }) => useVerseOfTheDay(day), {
|
|
187
157
|
wrapper,
|
|
188
158
|
initialProps: { day: 1 },
|
|
@@ -192,8 +162,8 @@ describe('useVerseOfTheDay', () => {
|
|
|
192
162
|
expect(result.current.loading).toBe(false);
|
|
193
163
|
});
|
|
194
164
|
|
|
195
|
-
expect(mockGetVOTD).toHaveBeenCalledTimes(1);
|
|
196
|
-
expect(mockGetVOTD).toHaveBeenLastCalledWith(1);
|
|
165
|
+
expect.soft(mockGetVOTD).toHaveBeenCalledTimes(1);
|
|
166
|
+
expect.soft(mockGetVOTD).toHaveBeenLastCalledWith(1);
|
|
197
167
|
|
|
198
168
|
rerender({ day: 100 });
|
|
199
169
|
|
|
@@ -201,48 +171,39 @@ describe('useVerseOfTheDay', () => {
|
|
|
201
171
|
expect(result.current.loading).toBe(false);
|
|
202
172
|
});
|
|
203
173
|
|
|
204
|
-
expect(mockGetVOTD).toHaveBeenCalledTimes(2);
|
|
205
|
-
expect(mockGetVOTD).toHaveBeenLastCalledWith(100);
|
|
174
|
+
expect.soft(mockGetVOTD).toHaveBeenCalledTimes(2);
|
|
175
|
+
expect.soft(mockGetVOTD).toHaveBeenLastCalledWith(100);
|
|
206
176
|
});
|
|
207
177
|
|
|
208
178
|
it('should not fetch when enabled is false', async () => {
|
|
209
|
-
const wrapper =
|
|
210
|
-
appKey: mockAppKey,
|
|
211
|
-
});
|
|
212
|
-
|
|
179
|
+
const wrapper = createYVWrapper();
|
|
213
180
|
const { result } = renderHook(() => useVerseOfTheDay(1, { enabled: false }), { wrapper });
|
|
214
181
|
|
|
215
182
|
await waitFor(() => {
|
|
216
183
|
expect(result.current.loading).toBe(false);
|
|
217
184
|
});
|
|
218
185
|
|
|
219
|
-
expect(mockGetVOTD).not.toHaveBeenCalled();
|
|
220
|
-
expect(result.current.data).toBe(null);
|
|
186
|
+
expect.soft(mockGetVOTD).not.toHaveBeenCalled();
|
|
187
|
+
expect.soft(result.current.data).toBe(null);
|
|
221
188
|
});
|
|
222
189
|
|
|
223
190
|
it('should handle fetch errors', async () => {
|
|
191
|
+
const wrapper = createYVWrapper();
|
|
224
192
|
const error = new Error('Failed to fetch VOTD');
|
|
225
193
|
mockGetVOTD.mockRejectedValueOnce(error);
|
|
226
194
|
|
|
227
|
-
const wrapper = createWrapper({
|
|
228
|
-
appKey: mockAppKey,
|
|
229
|
-
});
|
|
230
|
-
|
|
231
195
|
const { result } = renderHook(() => useVerseOfTheDay(1), { wrapper });
|
|
232
196
|
|
|
233
197
|
await waitFor(() => {
|
|
234
198
|
expect(result.current.loading).toBe(false);
|
|
235
199
|
});
|
|
236
200
|
|
|
237
|
-
expect(result.current.error).toEqual(error);
|
|
238
|
-
expect(result.current.data).toBe(null);
|
|
201
|
+
expect.soft(result.current.error).toEqual(error);
|
|
202
|
+
expect.soft(result.current.data).toBe(null);
|
|
239
203
|
});
|
|
240
204
|
|
|
241
205
|
it('should support manual refetch', async () => {
|
|
242
|
-
const wrapper =
|
|
243
|
-
appKey: mockAppKey,
|
|
244
|
-
});
|
|
245
|
-
|
|
206
|
+
const wrapper = createYVWrapper();
|
|
246
207
|
const { result } = renderHook(() => useVerseOfTheDay(1), { wrapper });
|
|
247
208
|
|
|
248
209
|
await waitFor(() => {
|
package/src/useVerse.test.tsx
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { renderHook, waitFor, act } from '@testing-library/react';
|
|
2
|
-
import { describe,
|
|
3
|
-
import type { ReactNode } from 'react';
|
|
2
|
+
import { describe, expect, vi, beforeEach, it } from 'vitest';
|
|
4
3
|
import { useVerse } from './useVerse';
|
|
5
|
-
import { YouVersionContext } from './context';
|
|
6
4
|
import { type BibleClient, type BibleVerse } from '@youversion/platform-core';
|
|
7
5
|
import { useBibleClient } from './useBibleClient';
|
|
6
|
+
import { createYVWrapper } from './test/utils';
|
|
8
7
|
|
|
9
8
|
vi.mock('./useBibleClient');
|
|
10
9
|
|
|
11
10
|
describe('useVerse', () => {
|
|
12
|
-
const mockAppKey = 'test-app-key';
|
|
13
11
|
const mockGetVerse = vi.fn();
|
|
14
12
|
|
|
15
13
|
const mockVerse: BibleVerse = {
|
|
@@ -18,15 +16,7 @@ describe('useVerse', () => {
|
|
|
18
16
|
title: '1',
|
|
19
17
|
};
|
|
20
18
|
|
|
21
|
-
const createWrapper = (contextValue: { appKey: string }) => {
|
|
22
|
-
return ({ children }: { children: ReactNode }) => (
|
|
23
|
-
<YouVersionContext.Provider value={contextValue}>{children}</YouVersionContext.Provider>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
19
|
beforeEach(() => {
|
|
28
|
-
vi.resetAllMocks();
|
|
29
|
-
|
|
30
20
|
mockGetVerse.mockResolvedValue(mockVerse);
|
|
31
21
|
|
|
32
22
|
const mockClient: Partial<BibleClient> = { getVerse: mockGetVerse };
|
|
@@ -35,10 +25,7 @@ describe('useVerse', () => {
|
|
|
35
25
|
|
|
36
26
|
describe('fetching verse', () => {
|
|
37
27
|
it('should fetch verse with all 4 parameters', async () => {
|
|
38
|
-
const wrapper =
|
|
39
|
-
appKey: mockAppKey,
|
|
40
|
-
});
|
|
41
|
-
|
|
28
|
+
const wrapper = createYVWrapper();
|
|
42
29
|
const { result } = renderHook(() => useVerse(111, 'MAT', 1, 1), { wrapper });
|
|
43
30
|
|
|
44
31
|
expect(result.current.loading).toBe(true);
|
|
@@ -48,131 +35,74 @@ describe('useVerse', () => {
|
|
|
48
35
|
expect(result.current.loading).toBe(false);
|
|
49
36
|
});
|
|
50
37
|
|
|
51
|
-
expect(mockGetVerse).toHaveBeenCalledWith(111, 'MAT', 1, 1);
|
|
52
|
-
expect(result.current.verse).toEqual(mockVerse);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should refetch when versionId changes', async () => {
|
|
56
|
-
const wrapper = createWrapper({
|
|
57
|
-
appKey: mockAppKey,
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
const { result, rerender } = renderHook(({ versionId }) => useVerse(versionId, 'MAT', 1, 1), {
|
|
61
|
-
wrapper,
|
|
62
|
-
initialProps: { versionId: 1 },
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
await waitFor(() => {
|
|
66
|
-
expect(result.current.loading).toBe(false);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
expect(mockGetVerse).toHaveBeenCalledTimes(1);
|
|
70
|
-
expect(mockGetVerse).toHaveBeenLastCalledWith(1, 'MAT', 1, 1);
|
|
71
|
-
|
|
72
|
-
act(() => {
|
|
73
|
-
rerender({ versionId: 111 });
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
await waitFor(() => {
|
|
77
|
-
expect(result.current.loading).toBe(false);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
expect(mockGetVerse).toHaveBeenCalledTimes(2);
|
|
81
|
-
expect(mockGetVerse).toHaveBeenLastCalledWith(111, 'MAT', 1, 1);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('should refetch when book changes', async () => {
|
|
85
|
-
const wrapper = createWrapper({
|
|
86
|
-
appKey: mockAppKey,
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
const { result, rerender } = renderHook(({ book }) => useVerse(1, book, 1, 1), {
|
|
90
|
-
wrapper,
|
|
91
|
-
initialProps: { book: 'MAT' },
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
await waitFor(() => {
|
|
95
|
-
expect(result.current.loading).toBe(false);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
expect(mockGetVerse).toHaveBeenCalledTimes(1);
|
|
99
|
-
expect(mockGetVerse).toHaveBeenLastCalledWith(1, 'MAT', 1, 1);
|
|
100
|
-
|
|
101
|
-
act(() => {
|
|
102
|
-
rerender({ book: 'GEN' });
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
await waitFor(() => {
|
|
106
|
-
expect(result.current.loading).toBe(false);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
expect(mockGetVerse).toHaveBeenCalledTimes(2);
|
|
110
|
-
expect(mockGetVerse).toHaveBeenLastCalledWith(1, 'GEN', 1, 1);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('should refetch when chapter changes', async () => {
|
|
114
|
-
const wrapper = createWrapper({
|
|
115
|
-
appKey: mockAppKey,
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const { result, rerender } = renderHook(({ chapter }) => useVerse(1, 'MAT', chapter, 1), {
|
|
119
|
-
wrapper,
|
|
120
|
-
initialProps: { chapter: 1 },
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
await waitFor(() => {
|
|
124
|
-
expect(result.current.loading).toBe(false);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
expect(mockGetVerse).toHaveBeenCalledTimes(1);
|
|
128
|
-
expect(mockGetVerse).toHaveBeenLastCalledWith(1, 'MAT', 1, 1);
|
|
129
|
-
|
|
130
|
-
act(() => {
|
|
131
|
-
rerender({ chapter: 5 });
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
await waitFor(() => {
|
|
135
|
-
expect(result.current.loading).toBe(false);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
expect(mockGetVerse).toHaveBeenCalledTimes(2);
|
|
139
|
-
expect(mockGetVerse).toHaveBeenLastCalledWith(1, 'MAT', 5, 1);
|
|
38
|
+
expect.soft(mockGetVerse).toHaveBeenCalledWith(111, 'MAT', 1, 1);
|
|
39
|
+
expect.soft(result.current.verse).toEqual(mockVerse);
|
|
140
40
|
});
|
|
141
41
|
|
|
142
|
-
it(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
42
|
+
it.each([
|
|
43
|
+
{
|
|
44
|
+
param: 'versionId',
|
|
45
|
+
HookFn: ({ val }: { val: number | string }) => useVerse(val as number, 'MAT', 1, 1),
|
|
46
|
+
initial: { val: 1 },
|
|
47
|
+
updated: { val: 111 },
|
|
48
|
+
expectedInitial: [1, 'MAT', 1, 1],
|
|
49
|
+
expectedUpdated: [111, 'MAT', 1, 1],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
param: 'book',
|
|
53
|
+
HookFn: ({ val }: { val: number | string }) => useVerse(1, val as string, 1, 1),
|
|
54
|
+
initial: { val: 'MAT' },
|
|
55
|
+
updated: { val: 'GEN' },
|
|
56
|
+
expectedInitial: [1, 'MAT', 1, 1],
|
|
57
|
+
expectedUpdated: [1, 'GEN', 1, 1],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
param: 'chapter',
|
|
61
|
+
HookFn: ({ val }: { val: number | string }) => useVerse(1, 'MAT', val as number, 1),
|
|
62
|
+
initial: { val: 1 },
|
|
63
|
+
updated: { val: 5 },
|
|
64
|
+
expectedInitial: [1, 'MAT', 1, 1],
|
|
65
|
+
expectedUpdated: [1, 'MAT', 5, 1],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
param: 'verse',
|
|
69
|
+
HookFn: ({ val }: { val: number | string }) => useVerse(1, 'MAT', 1, val as number),
|
|
70
|
+
initial: { val: 1 },
|
|
71
|
+
updated: { val: 10 },
|
|
72
|
+
expectedInitial: [1, 'MAT', 1, 1],
|
|
73
|
+
expectedUpdated: [1, 'MAT', 1, 10],
|
|
74
|
+
},
|
|
75
|
+
])(
|
|
76
|
+
'should refetch when $param changes',
|
|
77
|
+
async ({ HookFn, initial, updated, expectedInitial, expectedUpdated }) => {
|
|
78
|
+
const wrapper = createYVWrapper();
|
|
79
|
+
const { result, rerender } = renderHook(HookFn, {
|
|
80
|
+
wrapper,
|
|
81
|
+
initialProps: initial,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
await waitFor(() => {
|
|
85
|
+
expect(result.current.loading).toBe(false);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
expect.soft(mockGetVerse).toHaveBeenCalledTimes(1);
|
|
89
|
+
expect.soft(mockGetVerse).toHaveBeenLastCalledWith(...expectedInitial);
|
|
90
|
+
|
|
91
|
+
act(() => {
|
|
92
|
+
rerender(updated);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
await waitFor(() => {
|
|
96
|
+
expect(result.current.loading).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
expect.soft(mockGetVerse).toHaveBeenCalledTimes(2);
|
|
100
|
+
expect.soft(mockGetVerse).toHaveBeenLastCalledWith(...expectedUpdated);
|
|
101
|
+
},
|
|
102
|
+
);
|
|
170
103
|
|
|
171
104
|
it('should not fetch when enabled is false', async () => {
|
|
172
|
-
const wrapper =
|
|
173
|
-
appKey: mockAppKey,
|
|
174
|
-
});
|
|
175
|
-
|
|
105
|
+
const wrapper = createYVWrapper();
|
|
176
106
|
const { result } = renderHook(() => useVerse(1, 'MAT', 1, 1, { enabled: false }), {
|
|
177
107
|
wrapper,
|
|
178
108
|
});
|
|
@@ -181,33 +111,27 @@ describe('useVerse', () => {
|
|
|
181
111
|
expect(result.current.loading).toBe(false);
|
|
182
112
|
});
|
|
183
113
|
|
|
184
|
-
expect(mockGetVerse).not.toHaveBeenCalled();
|
|
185
|
-
expect(result.current.verse).toBe(null);
|
|
114
|
+
expect.soft(mockGetVerse).not.toHaveBeenCalled();
|
|
115
|
+
expect.soft(result.current.verse).toBe(null);
|
|
186
116
|
});
|
|
187
117
|
|
|
188
118
|
it('should handle fetch errors', async () => {
|
|
119
|
+
const wrapper = createYVWrapper();
|
|
189
120
|
const error = new Error('Failed to fetch verse');
|
|
190
121
|
mockGetVerse.mockRejectedValueOnce(error);
|
|
191
122
|
|
|
192
|
-
const wrapper = createWrapper({
|
|
193
|
-
appKey: mockAppKey,
|
|
194
|
-
});
|
|
195
|
-
|
|
196
123
|
const { result } = renderHook(() => useVerse(1, 'MAT', 1, 1), { wrapper });
|
|
197
124
|
|
|
198
125
|
await waitFor(() => {
|
|
199
126
|
expect(result.current.loading).toBe(false);
|
|
200
127
|
});
|
|
201
128
|
|
|
202
|
-
expect(result.current.error).toEqual(error);
|
|
203
|
-
expect(result.current.verse).toBe(null);
|
|
129
|
+
expect.soft(result.current.error).toEqual(error);
|
|
130
|
+
expect.soft(result.current.verse).toBe(null);
|
|
204
131
|
});
|
|
205
132
|
|
|
206
133
|
it('should support manual refetch', async () => {
|
|
207
|
-
const wrapper =
|
|
208
|
-
appKey: mockAppKey,
|
|
209
|
-
});
|
|
210
|
-
|
|
134
|
+
const wrapper = createYVWrapper();
|
|
211
135
|
const { result } = renderHook(() => useVerse(1, 'MAT', 1, 1), { wrapper });
|
|
212
136
|
|
|
213
137
|
await waitFor(() => {
|
package/src/useVerseSelection.ts
CHANGED
|
@@ -4,6 +4,9 @@ import {
|
|
|
4
4
|
type VerseSelectionContextData,
|
|
5
5
|
} from './context/VerseSelectionContext';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @deprecated No replacement needed. Remove usage. Will be removed in the next major version.
|
|
9
|
+
*/
|
|
7
10
|
export function useVerseSelection(): VerseSelectionContextData {
|
|
8
11
|
const context = useContext(VerseSelectionContext);
|
|
9
12
|
if (!context) {
|