@youversion/platform-react-hooks 1.18.1 → 1.20.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.
Files changed (79) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/AGENTS.md +3 -7
  3. package/CHANGELOG.md +32 -0
  4. package/dist/__tests__/mocks/bibles.d.ts +6 -1
  5. package/dist/__tests__/mocks/bibles.d.ts.map +1 -1
  6. package/dist/__tests__/mocks/bibles.js +10 -0
  7. package/dist/__tests__/mocks/bibles.js.map +1 -1
  8. package/dist/__tests__/mocks/core-mock-factory.d.ts +83 -0
  9. package/dist/__tests__/mocks/core-mock-factory.d.ts.map +1 -0
  10. package/dist/__tests__/mocks/core-mock-factory.js +138 -0
  11. package/dist/__tests__/mocks/core-mock-factory.js.map +1 -0
  12. package/dist/context/ReaderContext.d.ts +6 -0
  13. package/dist/context/ReaderContext.d.ts.map +1 -1
  14. package/dist/context/ReaderContext.js +6 -0
  15. package/dist/context/ReaderContext.js.map +1 -1
  16. package/dist/context/ReaderProvider.d.ts +3 -0
  17. package/dist/context/ReaderProvider.d.ts.map +1 -1
  18. package/dist/context/ReaderProvider.js +3 -0
  19. package/dist/context/ReaderProvider.js.map +1 -1
  20. package/dist/context/VerseSelectionContext.d.ts +6 -0
  21. package/dist/context/VerseSelectionContext.d.ts.map +1 -1
  22. package/dist/context/VerseSelectionContext.js +3 -0
  23. package/dist/context/VerseSelectionContext.js.map +1 -1
  24. package/dist/context/VerseSelectionProvider.d.ts +3 -0
  25. package/dist/context/VerseSelectionProvider.d.ts.map +1 -1
  26. package/dist/context/VerseSelectionProvider.js +3 -0
  27. package/dist/context/VerseSelectionProvider.js.map +1 -1
  28. package/dist/test/utils.d.ts +7 -0
  29. package/dist/test/utils.d.ts.map +1 -0
  30. package/dist/test/utils.js +7 -0
  31. package/dist/test/utils.js.map +1 -0
  32. package/dist/useChapterNavigation.d.ts +3 -0
  33. package/dist/useChapterNavigation.d.ts.map +1 -1
  34. package/dist/useChapterNavigation.js +3 -0
  35. package/dist/useChapterNavigation.js.map +1 -1
  36. package/dist/useInitData.d.ts +4 -0
  37. package/dist/useInitData.d.ts.map +1 -1
  38. package/dist/useInitData.js +4 -0
  39. package/dist/useInitData.js.map +1 -1
  40. package/dist/useVerseSelection.d.ts +3 -0
  41. package/dist/useVerseSelection.d.ts.map +1 -1
  42. package/dist/useVerseSelection.js +3 -0
  43. package/dist/useVerseSelection.js.map +1 -1
  44. package/package.json +2 -2
  45. package/src/__tests__/mocks/bibles.ts +18 -1
  46. package/src/__tests__/mocks/core-mock-factory.ts +226 -0
  47. package/src/context/ReaderContext.tsx +6 -0
  48. package/src/context/ReaderProvider.tsx +3 -0
  49. package/src/context/VerseSelectionContext.tsx +6 -0
  50. package/src/context/VerseSelectionProvider.tsx +3 -0
  51. package/src/context/YouVersionAuthProvider.test.tsx +14 -131
  52. package/src/test/utils.tsx +12 -0
  53. package/src/useBibleClient.test.tsx +8 -37
  54. package/src/useBook.test.tsx +158 -0
  55. package/src/useBooks.test.tsx +148 -0
  56. package/src/useChapter.test.tsx +70 -128
  57. package/src/useChapterNavigation.ts +3 -0
  58. package/src/useChapters.test.tsx +80 -150
  59. package/src/useHighlights.test.tsx +33 -104
  60. package/src/useInitData.ts +4 -0
  61. package/src/useLanguage.test.tsx +8 -10
  62. package/src/useLanguageClient.test.tsx +9 -25
  63. package/src/useLanguages.test.tsx +27 -64
  64. package/src/usePassage.test.tsx +304 -0
  65. package/src/useTheme.test.tsx +32 -0
  66. package/src/useVOTD.test.tsx +28 -67
  67. package/src/useVerse.test.tsx +73 -149
  68. package/src/useVerseSelection.ts +3 -0
  69. package/src/useVerses.test.tsx +37 -104
  70. package/src/useVersion.test.tsx +29 -66
  71. package/src/useVersions.test.tsx +72 -154
  72. package/src/useYVAuth.test.tsx +26 -134
  73. package/src/utility/getDayOfYear.test.ts +48 -0
  74. package/vitest.config.ts +12 -0
  75. package/src/context/ReaderProvider.test.tsx +0 -264
  76. package/src/context/VerseSelectionProvider.test.tsx +0 -362
  77. package/src/useChapterNavigation.test.tsx +0 -160
  78. package/src/useVerseSelection.test.tsx +0 -33
  79. package/vitest.setup.ts +0 -1
@@ -1,11 +1,11 @@
1
1
  import { renderHook, waitFor } from '@testing-library/react';
2
- import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest';
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 = createWrapper({
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 = createWrapper({
77
- appKey: mockAppKey,
78
- });
79
-
64
+ const wrapper = createYVWrapper();
80
65
  renderHook(() => useVerseOfTheDay(1), { wrapper });
81
66
 
82
67
  expect(ApiClient).toHaveBeenCalledWith({
83
- appKey: mockAppKey,
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 = createWrapper({
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 = mockAppKey;
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 = createWrapper({
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 = createWrapper({
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 = createWrapper({
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 = createWrapper({
243
- appKey: mockAppKey,
244
- });
245
-
206
+ const wrapper = createYVWrapper();
246
207
  const { result } = renderHook(() => useVerseOfTheDay(1), { wrapper });
247
208
 
248
209
  await waitFor(() => {
@@ -1,15 +1,13 @@
1
1
  import { renderHook, waitFor, act } from '@testing-library/react';
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
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 = createWrapper({
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('should refetch when verse changes', async () => {
143
- const wrapper = createWrapper({
144
- appKey: mockAppKey,
145
- });
146
-
147
- const { result, rerender } = renderHook(({ verse }) => useVerse(1, 'MAT', 1, verse), {
148
- wrapper,
149
- initialProps: { verse: 1 },
150
- });
151
-
152
- await waitFor(() => {
153
- expect(result.current.loading).toBe(false);
154
- });
155
-
156
- expect(mockGetVerse).toHaveBeenCalledTimes(1);
157
- expect(mockGetVerse).toHaveBeenLastCalledWith(1, 'MAT', 1, 1);
158
-
159
- act(() => {
160
- rerender({ verse: 10 });
161
- });
162
-
163
- await waitFor(() => {
164
- expect(result.current.loading).toBe(false);
165
- });
166
-
167
- expect(mockGetVerse).toHaveBeenCalledTimes(2);
168
- expect(mockGetVerse).toHaveBeenLastCalledWith(1, 'MAT', 1, 10);
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 = createWrapper({
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 = createWrapper({
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(() => {
@@ -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) {