@@ -105,6 +105,11 @@ public void NoEmail()
105105 async ( ) => await auth . GeneratePasswordResetLinkAsync ( null ) ) ;
106106 Assert . ThrowsAsync < ArgumentException > (
107107 async ( ) => await auth . GeneratePasswordResetLinkAsync ( string . Empty ) ) ;
108+
109+ Assert . ThrowsAsync < ArgumentException > (
110+ async ( ) => await auth . GenerateSignInWithEmailLinkAsync ( null , ActionCodeSettings ) ) ;
111+ Assert . ThrowsAsync < ArgumentException > (
112+ async ( ) => await auth . GenerateSignInWithEmailLinkAsync ( string . Empty , ActionCodeSettings ) ) ;
108113 }
109114
110115 [ Theory ]
@@ -120,6 +125,9 @@ public void InvalidActionCodeSettings(ActionCodeSettings settings)
120125
121126 Assert . ThrowsAsync < ArgumentException > (
122127 async ( ) => await auth . GeneratePasswordResetLinkAsync ( email , settings ) ) ;
128+
129+ Assert . ThrowsAsync < ArgumentException > (
130+ async ( ) => await auth . GenerateSignInWithEmailLinkAsync ( email , settings ) ) ;
123131 }
124132
125133 [ Fact ]
@@ -254,6 +262,65 @@ public async Task PasswordResetLinkUnexpectedResponse()
254262 Assert . Null ( exception . InnerException ) ;
255263 }
256264
265+ [ Fact ]
266+ public void SignInWithEmailLinkNoSettings ( )
267+ {
268+ var handler = new MockMessageHandler ( ) { Response = GenerateEmailLinkResponse } ;
269+ var auth = this . CreateFirebaseAuth ( handler ) ;
270+ 271+
272+ Assert . ThrowsAsync < ArgumentException > (
273+ async ( ) => await auth . GenerateSignInWithEmailLinkAsync ( email , null ) ) ;
274+ }
275+
276+ [ Fact ]
277+ public async Task SignInWithEmailLink ( )
278+ {
279+ var handler = new MockMessageHandler ( ) { Response = GenerateEmailLinkResponse } ;
280+ var auth = this . CreateFirebaseAuth ( handler ) ;
281+
282+ var link = await auth . GenerateSignInWithEmailLinkAsync (
283+ "[email protected] " , ActionCodeSettings ) ; 284+
285+ Assert . Equal ( "https://mock-oob-link.for.auth.tests" , link ) ;
286+
287+ var request = NewtonsoftJsonSerializer . Instance . Deserialize < Dictionary < string , object > > (
288+ handler . LastRequestBody ) ;
289+ Assert . Equal ( 10 , request . Count ) ;
290+ Assert . Equal ( "[email protected] " , request [ "email" ] ) ; 291+ Assert . Equal ( "EMAIL_SIGNIN" , request [ "requestType" ] ) ;
292+ Assert . True ( ( bool ) request [ "returnOobLink" ] ) ;
293+
294+ Assert . Equal ( ActionCodeSettings . Url , request [ "continueUrl" ] ) ;
295+ Assert . True ( ( bool ) request [ "canHandleCodeInApp" ] ) ;
296+ Assert . Equal ( ActionCodeSettings . DynamicLinkDomain , request [ "dynamicLinkDomain" ] ) ;
297+ Assert . Equal ( ActionCodeSettings . IosBundleId , request [ "iOSBundleId" ] ) ;
298+ Assert . Equal ( ActionCodeSettings . AndroidPackageName , request [ "androidPackageName" ] ) ;
299+ Assert . Equal (
300+ ActionCodeSettings . AndroidMinimumVersion , request [ "androidMinimumVersion" ] ) ;
301+ Assert . True ( ( bool ) request [ "androidInstallApp" ] ) ;
302+ this . AssertRequest ( handler . Requests [ 0 ] ) ;
303+ }
304+
305+ [ Fact ]
306+ public async Task SignInWithEmailLinkUnexpectedResponse ( )
307+ {
308+ var handler = new MockMessageHandler ( ) { Response = "{}" } ;
309+ var auth = this . CreateFirebaseAuth ( handler ) ;
310+
311+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
312+ async ( ) => await auth . GenerateSignInWithEmailLinkAsync (
313+ "[email protected] " , ActionCodeSettings ) ) ; 314+
315+ Assert . Equal ( ErrorCode . Unknown , exception . ErrorCode ) ;
316+ Assert . Equal ( AuthErrorCode . UnexpectedResponse , exception . AuthErrorCode ) ;
317+ Assert . Equal (
318+ $ "Failed to generate email action link for: [email protected] ", 319+ exception . Message ) ;
320+ Assert . NotNull ( exception . HttpResponse ) ;
321+ Assert . Null ( exception . InnerException ) ;
322+ }
323+
257324 private FirebaseAuth CreateFirebaseAuth ( HttpMessageHandler handler )
258325 {
259326 var userManager = new FirebaseUserManager ( new FirebaseUserManager . Args
0 commit comments