Skip to content

Commit 659604c

Browse files
committed
Clean up tests
1 parent 8f46269 commit 659604c

3 files changed

Lines changed: 37 additions & 38 deletions

File tree

src/__tests__/interlinearizer.web-view.test.tsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ if (!InterlinearizerWebView) throw new Error('webViewComponent not loaded');
2222
/** Minimal SerializedVerseRef for hook mock return. */
2323
const defaultScrRef: SerializedVerseRef = { book: 'GEN', chapterNum: 1, verseNum: 1 };
2424

25+
const testProjectId = 'test-project-id';
26+
2527
/** Builds a minimal WebViewProps for tests. */
2628
function makeProps(projectId?: string): WebViewProps {
2729
return {
@@ -69,27 +71,25 @@ describe('InterlinearizerWebView', () => {
6971

7072
it('shows the book and projectId when a project is linked', () => {
7173
mockBookData({ type: 'USJ', version: '3.1', content: [] });
72-
render(<InterlinearizerWebView {...makeProps('test-project-id')} />);
74+
render(<InterlinearizerWebView {...makeProps(testProjectId)} />);
7375

74-
expect(screen.getByText(/test-project-id/)).toBeInTheDocument();
76+
expect(screen.getByText(new RegExp(testProjectId))).toBeInTheDocument();
7577
expect(screen.getByText(/GEN · project/)).toBeInTheDocument();
7678
});
7779

7880
it('shows Loading when projectId is set but book data has not arrived', () => {
7981
mockBookData(undefined, true);
80-
render(<InterlinearizerWebView {...makeProps('test-project-id')} />);
82+
render(<InterlinearizerWebView {...makeProps(testProjectId)} />);
8183

8284
expect(screen.getByText('Loading…')).toBeInTheDocument();
8385
});
8486

8587
it('shows an error when no USJ book is available for the project', () => {
8688
mockBookData(undefined, false);
87-
render(<InterlinearizerWebView {...makeProps('test-project-id')} />);
89+
render(<InterlinearizerWebView {...makeProps(testProjectId)} />);
8890

8991
expect(screen.getByRole('heading', { name: /error loading book/i })).toBeInTheDocument();
90-
expect(
91-
screen.getByText(/no usj book available for gen in project test-project-id/i),
92-
).toBeInTheDocument();
92+
expect(screen.getByText(/no usj book available for gen in project/i)).toBeInTheDocument();
9393
});
9494

9595
it('shows the raw USFM when book data arrives', () => {
@@ -98,14 +98,14 @@ describe('InterlinearizerWebView', () => {
9898
version: '3.1',
9999
content: [{ type: 'book', marker: 'id', code: 'EXO' }],
100100
});
101-
render(<InterlinearizerWebView {...makeProps('test-project-id')} />);
101+
render(<InterlinearizerWebView {...makeProps(testProjectId)} />);
102102

103103
expect(screen.getByText(/"code": "EXO"/)).toBeInTheDocument();
104104
});
105105

106106
it('shows an error heading and message when book data is a PlatformError', () => {
107107
mockBookData({ isPlatformError: true, message: 'Project not found' });
108-
render(<InterlinearizerWebView {...makeProps('test-project-id')} />);
108+
render(<InterlinearizerWebView {...makeProps(testProjectId)} />);
109109

110110
expect(screen.getByRole('heading', { name: /error loading book/i })).toBeInTheDocument();
111111
expect(screen.getByText(/project not found/i)).toBeInTheDocument();

src/__tests__/main.test.ts

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/** @file Unit tests for the extension entry point (main.ts). */
22
/// <reference types="jest" />
33

4-
import type { IWebViewProvider, SavedWebViewDefinition } from '@papi/core';
4+
import type { SavedWebViewDefinition } from '@papi/core';
55
import papiBackendMock from '@papi/backend';
66
import { activate, deactivate } from '@main';
77
import type { InterlinearizerOpenOptions } from '@main';
@@ -38,14 +38,6 @@ function isPapiBackendTestMock(m: unknown): m is PapiBackendTestMock {
3838
);
3939
}
4040

41-
/**
42-
* Type guard for the WebView provider passed to registerWebViewProvider. Used to obtain a properly
43-
* typed provider from the mock without type assertions.
44-
*/
45-
function isIWebViewProvider(x: unknown): x is IWebViewProvider {
46-
return !!x && typeof x === 'object' && 'getWebView' in x && typeof x.getWebView === 'function';
47-
}
48-
4941
if (!isPapiBackendTestMock(papiBackendMock)) throw new Error('Expected mocked @papi/backend');
5042
const {
5143
__mockRegisterWebViewProvider,
@@ -121,20 +113,35 @@ describe('main', () => {
121113
});
122114

123115
describe('mainWebViewProvider.getWebView', () => {
116+
type WebViewProvider = {
117+
getWebView(saved: SavedWebViewDefinition, opts?: object): Promise<unknown>;
118+
};
119+
120+
function isWebViewProvider(x: unknown): x is WebViewProvider {
121+
return (
122+
!!x && typeof x === 'object' && 'getWebView' in x && typeof x.getWebView === 'function'
123+
);
124+
}
125+
126+
/** Retrieves the provider registered with the platform and asserts it exists. */
127+
function getRegisteredProvider(): WebViewProvider {
128+
const raw = jest.mocked(__mockRegisterWebViewProvider).mock.calls[0]?.[1];
129+
if (!isWebViewProvider(raw)) throw new Error('Expected registered provider');
130+
return raw;
131+
}
132+
124133
it('returns WebView definition when webViewType matches', async () => {
125134
const context = createTestActivationContext();
126135

127136
await activate(context);
128137

129-
const rawProvider = jest.mocked(__mockRegisterWebViewProvider).mock.calls[0]?.[1];
130-
expect(rawProvider).toBeDefined();
131-
if (!isIWebViewProvider(rawProvider)) throw new Error('Expected registered provider');
138+
const provider = getRegisteredProvider();
132139
const savedWebView: SavedWebViewDefinition = {
133140
id: 'test-webview-id',
134141
webViewType: mainWebViewType,
135142
};
136143

137-
const result = await rawProvider.getWebView(savedWebView, {}, 'test-nonce');
144+
const result = await provider.getWebView(savedWebView, {});
138145

139146
expect(result).toMatchObject({
140147
...savedWebView,
@@ -148,15 +155,14 @@ describe('main', () => {
148155
const context = createTestActivationContext();
149156
await activate(context);
150157

151-
const rawProvider = jest.mocked(__mockRegisterWebViewProvider).mock.calls[0]?.[1];
152-
if (!isIWebViewProvider(rawProvider)) throw new Error('Expected registered provider');
158+
const provider = getRegisteredProvider();
153159
const savedWebView: SavedWebViewDefinition = {
154160
id: 'test-webview-id',
155161
webViewType: mainWebViewType,
156162
};
157163

158164
const options: InterlinearizerOpenOptions = { projectId: 'my-project' };
159-
const result = await rawProvider.getWebView(savedWebView, options, 'test-nonce');
165+
const result = await provider.getWebView(savedWebView, options);
160166

161167
expect(result).toMatchObject({ projectId: 'my-project' });
162168
});
@@ -165,15 +171,14 @@ describe('main', () => {
165171
const context = createTestActivationContext();
166172
await activate(context);
167173

168-
const rawProvider = jest.mocked(__mockRegisterWebViewProvider).mock.calls[0]?.[1];
169-
if (!isIWebViewProvider(rawProvider)) throw new Error('Expected registered provider');
174+
const provider = getRegisteredProvider();
170175
const savedWebView: SavedWebViewDefinition = {
171176
id: 'test-webview-id',
172177
webViewType: mainWebViewType,
173178
projectId: 'saved-project',
174179
};
175180

176-
const result = await rawProvider.getWebView(savedWebView, {}, 'test-nonce');
181+
const result = await provider.getWebView(savedWebView, {});
177182

178183
expect(result).toMatchObject({ projectId: 'saved-project' });
179184
});
@@ -183,15 +188,13 @@ describe('main', () => {
183188

184189
await activate(context);
185190

186-
const rawProvider = jest.mocked(__mockRegisterWebViewProvider).mock.calls[0]?.[1];
187-
expect(rawProvider).toBeDefined();
188-
if (!isIWebViewProvider(rawProvider)) throw new Error('Expected registered provider');
191+
const provider = getRegisteredProvider();
189192
const savedWebView: SavedWebViewDefinition = {
190193
id: 'other-id',
191194
webViewType: 'other.webView',
192195
};
193196

194-
await expect(rawProvider.getWebView(savedWebView, {}, 'test-nonce')).rejects.toThrow(
197+
await expect(provider.getWebView(savedWebView, {})).rejects.toThrow(
195198
`${mainWebViewType} provider received request to provide a ${savedWebView.webViewType} WebView`,
196199
);
197200
});
@@ -200,16 +203,14 @@ describe('main', () => {
200203
const context = createTestActivationContext();
201204
await activate(context);
202205

203-
const rawProvider = jest.mocked(__mockRegisterWebViewProvider).mock.calls[0]?.[1];
204-
if (!isIWebViewProvider(rawProvider)) throw new Error('Expected registered provider');
206+
const provider = getRegisteredProvider();
205207
const savedWebView: SavedWebViewDefinition = {
206208
id: 'test-webview-id',
207209
webViewType: mainWebViewType,
208210
projectId: 'saved-project',
209211
};
210212

211-
// @ts-expect-error -- intentionally passing undefined to test the defensive fallback path
212-
const result = await rawProvider.getWebView(savedWebView, undefined, 'test-nonce');
213+
const result = await provider.getWebView(savedWebView, undefined);
213214

214215
expect(result).toMatchObject({ projectId: 'saved-project' });
215216
});

src/main.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ const mainWebViewProvider: IWebViewProvider = {
3434
async getWebView(
3535
savedWebView: SavedWebViewDefinition,
3636
openWebViewOptions?: InterlinearizerOpenOptions,
37-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
38-
_webViewNonce?: string,
3937
): Promise<WebViewDefinition | undefined> {
4038
if (savedWebView.webViewType !== mainWebViewType) {
4139
throw new Error(

0 commit comments

Comments
 (0)