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' ;
55import papiBackendMock from '@papi/backend' ;
66import { activate , deactivate } from '@main' ;
77import 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-
4941if ( ! isPapiBackendTestMock ( papiBackendMock ) ) throw new Error ( 'Expected mocked @papi/backend' ) ;
5042const {
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 } ) ;
0 commit comments