@@ -70,6 +70,15 @@ describe('internal api', () => {
7070 let storageReadStub : SinonStub ;
7171 let storageWriteStub : SinonStub ;
7272
73+ function stubGetRecaptchaToken (
74+ token : string = fakeRecaptchaToken ,
75+ isSuccess : boolean = true
76+ ) : SinonStub {
77+ getStateReference ( app ) . reCAPTCHAState ! . succeeded = isSuccess ;
78+
79+ return stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( token ) ) ;
80+ }
81+
7382 beforeEach ( ( ) => {
7483 app = getFullApp ( ) ;
7584 storageReadStub = stub ( storage , 'readTokenFromStorage' ) . resolves ( undefined ) ;
@@ -104,9 +113,7 @@ describe('internal api', () => {
104113 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY )
105114 } ) ;
106115
107- const reCAPTCHASpy = stub ( reCAPTCHA , 'getToken' ) . returns (
108- Promise . resolve ( fakeRecaptchaToken )
109- ) ;
116+ const reCAPTCHASpy = stubGetRecaptchaToken ( ) ;
110117 const exchangeTokenStub : SinonStub = stub (
111118 client ,
112119 'exchangeToken'
@@ -127,9 +134,8 @@ describe('internal api', () => {
127134 provider : new ReCaptchaEnterpriseProvider ( FAKE_SITE_KEY )
128135 } ) ;
129136
130- const reCAPTCHASpy = stub ( reCAPTCHA , 'getToken' ) . returns (
131- Promise . resolve ( fakeRecaptchaToken )
132- ) ;
137+ const reCAPTCHASpy = stubGetRecaptchaToken ( ) ;
138+
133139 const exchangeTokenStub : SinonStub = stub (
134140 client ,
135141 'exchangeToken'
@@ -151,9 +157,7 @@ describe('internal api', () => {
151157 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY )
152158 } ) ;
153159
154- const reCAPTCHASpy = stub ( reCAPTCHA , 'getToken' ) . returns (
155- Promise . resolve ( fakeRecaptchaToken )
156- ) ;
160+ const reCAPTCHASpy = stubGetRecaptchaToken ( ) ;
157161
158162 const error = new Error ( 'oops, something went wrong' ) ;
159163 stub ( client , 'exchangeToken' ) . returns ( Promise . reject ( error ) ) ;
@@ -171,6 +175,26 @@ describe('internal api', () => {
171175 errorStub . restore ( ) ;
172176 } ) ;
173177
178+ it ( 'resolves with a dummy token and an error if recaptcha failed' , async ( ) => {
179+ const errorStub = stub ( console , 'error' ) ;
180+ const appCheck = initializeAppCheck ( app , {
181+ provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY )
182+ } ) ;
183+
184+ const reCAPTCHASpy = stubGetRecaptchaToken ( '' , false ) ;
185+ const exchangeTokenStub = stub ( client , 'exchangeToken' ) ;
186+
187+ const token = await getToken ( appCheck as AppCheckService ) ;
188+
189+ expect ( reCAPTCHASpy ) . to . be . called ;
190+ expect ( exchangeTokenStub ) . to . not . be . called ;
191+ expect ( token . token ) . to . equal ( formatDummyToken ( defaultTokenErrorData ) ) ;
192+ expect ( errorStub . args [ 0 ] [ 1 ] . message ) . to . include (
193+ AppCheckError . RECAPTCHA_ERROR
194+ ) ;
195+ errorStub . restore ( ) ;
196+ } ) ;
197+
174198 it ( 'notifies listeners using cached token' , async ( ) => {
175199 storageReadStub . resolves ( fakeCachedAppCheckToken ) ;
176200 const appCheck = initializeAppCheck ( app , {
@@ -213,7 +237,7 @@ describe('internal api', () => {
213237 isTokenAutoRefreshEnabled : true
214238 } ) ;
215239
216- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
240+ stubGetRecaptchaToken ( ) ;
217241 stub ( client , 'exchangeToken' ) . returns (
218242 Promise . resolve ( fakeRecaptchaAppCheckToken )
219243 ) ;
@@ -247,7 +271,7 @@ describe('internal api', () => {
247271 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY ) ,
248272 isTokenAutoRefreshEnabled : true
249273 } ) ;
250- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
274+ stubGetRecaptchaToken ( ) ;
251275 stub ( client , 'exchangeToken' ) . rejects ( 'exchange error' ) ;
252276 const listener1 = spy ( ) ;
253277 const errorFn1 = spy ( ) ;
@@ -271,7 +295,7 @@ describe('internal api', () => {
271295 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY ) ,
272296 isTokenAutoRefreshEnabled : true
273297 } ) ;
274- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
298+ stubGetRecaptchaToken ( ) ;
275299 stub ( client , 'exchangeToken' ) . returns (
276300 Promise . resolve ( fakeRecaptchaAppCheckToken )
277301 ) ;
@@ -324,7 +348,7 @@ describe('internal api', () => {
324348 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY )
325349 } ) ;
326350
327- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
351+ stubGetRecaptchaToken ( ) ;
328352 stub ( client , 'exchangeToken' ) . returns (
329353 Promise . resolve ( fakeRecaptchaAppCheckToken )
330354 ) ;
@@ -365,7 +389,7 @@ describe('internal api', () => {
365389 token : fakeRecaptchaAppCheckToken
366390 } ) ;
367391
368- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
392+ stubGetRecaptchaToken ( ) ;
369393 stub ( client , 'exchangeToken' ) . returns (
370394 Promise . resolve ( {
371395 token : 'new-recaptcha-app-check-token' ,
@@ -390,7 +414,7 @@ describe('internal api', () => {
390414 cachedTokenPromise : undefined
391415 } ) ;
392416
393- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
417+ stubGetRecaptchaToken ( ) ;
394418 stub ( client , 'exchangeToken' ) . returns (
395419 Promise . resolve ( {
396420 token : 'new-recaptcha-app-check-token' ,
@@ -431,7 +455,7 @@ describe('internal api', () => {
431455 cachedTokenPromise : undefined
432456 } ) ;
433457
434- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
458+ stubGetRecaptchaToken ( ) ;
435459 let count = 0 ;
436460 stub ( client , 'exchangeToken' ) . callsFake (
437461 ( ) =>
@@ -485,7 +509,7 @@ describe('internal api', () => {
485509 }
486510 } ) ;
487511
488- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
512+ stubGetRecaptchaToken ( ) ;
489513 stub ( client , 'exchangeToken' ) . returns (
490514 Promise . resolve ( {
491515 token : 'new-recaptcha-app-check-token' ,
@@ -532,7 +556,7 @@ describe('internal api', () => {
532556 issuedAtTimeMillis : 0
533557 } ;
534558
535- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
559+ stubGetRecaptchaToken ( ) ;
536560 stub ( client , 'exchangeToken' ) . returns ( Promise . resolve ( freshToken ) ) ;
537561
538562 expect ( await getToken ( appCheck as AppCheckService ) ) . to . deep . equal ( {
@@ -556,7 +580,7 @@ describe('internal api', () => {
556580 token : fakeRecaptchaAppCheckToken
557581 } ) ;
558582
559- stub ( reCAPTCHA , 'getToken' ) . returns ( Promise . resolve ( fakeRecaptchaToken ) ) ;
583+ stubGetRecaptchaToken ( ) ;
560584 stub ( client , 'exchangeToken' ) . returns ( Promise . reject ( new Error ( 'blah' ) ) ) ;
561585
562586 const tokenResult = await getToken ( appCheck as AppCheckService , true ) ;
@@ -589,6 +613,7 @@ describe('internal api', () => {
589613 const appCheck = initializeAppCheck ( app , {
590614 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY )
591615 } ) ;
616+ stubGetRecaptchaToken ( ) ;
592617 const warnStub = stub ( logger , 'warn' ) ;
593618 stub ( client , 'exchangeToken' ) . returns (
594619 Promise . reject (
@@ -615,6 +640,7 @@ describe('internal api', () => {
615640 const appCheck = initializeAppCheck ( app , {
616641 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY )
617642 } ) ;
643+ stubGetRecaptchaToken ( ) ;
618644 const warnStub = stub ( logger , 'warn' ) ;
619645 stub ( client , 'exchangeToken' ) . returns (
620646 Promise . reject (
@@ -765,6 +791,8 @@ describe('internal api', () => {
765791 } )
766792 ) ;
767793
794+ stubGetRecaptchaToken ( ) ;
795+
768796 addTokenListener (
769797 appCheck as AppCheckService ,
770798 ListenerType . INTERNAL ,
@@ -799,6 +827,8 @@ describe('internal api', () => {
799827 }
800828 } ) ;
801829
830+ stubGetRecaptchaToken ( ) ;
831+
802832 const fakeListener : AppCheckTokenListener = stub ( ) ;
803833
804834 const fakeExchange = stub ( client , 'exchangeToken' ) . returns (
@@ -838,6 +868,8 @@ describe('internal api', () => {
838868 }
839869 } ) ;
840870
871+ stubGetRecaptchaToken ( ) ;
872+
841873 const fakeListener : AppCheckTokenListener = stub ( ) ;
842874
843875 const fakeExchange = stub ( client , 'exchangeToken' ) . returns (
@@ -865,6 +897,8 @@ describe('internal api', () => {
865897 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY ) ,
866898 isTokenAutoRefreshEnabled : true
867899 } ) ;
900+
901+ stubGetRecaptchaToken ( ) ;
868902 setInitialState ( app , {
869903 ...getStateReference ( app ) ,
870904 token : {
@@ -905,6 +939,8 @@ describe('internal api', () => {
905939 provider : new ReCaptchaV3Provider ( FAKE_SITE_KEY ) ,
906940 isTokenAutoRefreshEnabled : true
907941 } ) ;
942+
943+ stubGetRecaptchaToken ( ) ;
908944 setInitialState ( app , {
909945 ...getStateReference ( app ) ,
910946 token : {
0 commit comments