@@ -119,7 +119,169 @@ public async Task SetCustomUserClaimsWithWrongUid()
119119 var customClaims = new Dictionary < string , object > ( ) ;
120120
121121 await Assert . ThrowsAsync < FirebaseException > (
122- async ( ) => await FirebaseAuth . DefaultInstance . SetCustomUserClaimsAsync ( "mock-uid" , customClaims ) ) ;
122+ async ( ) => await FirebaseAuth . DefaultInstance . SetCustomUserClaimsAsync ( "non.existing" , customClaims ) ) ;
123+ }
124+
125+ [ Fact ]
126+ public async Task CreateUserWithParams ( )
127+ {
128+ var randomUser = RandomUser . Create ( ) ;
129+ var args = new UserRecordArgs ( )
130+ {
131+ Uid = randomUser . Uid ,
132+ Email = randomUser . Email ,
133+ PhoneNumber = randomUser . PhoneNumber ,
134+ DisplayName = "Random User" ,
135+ PhotoUrl = "https://example.com/photo.png" ,
136+ EmailVerified = true ,
137+ Password = "password" ,
138+ } ;
139+
140+ var user = await FirebaseAuth . DefaultInstance . CreateUserAsync ( args ) ;
141+
142+ try
143+ {
144+ Assert . Equal ( randomUser . Uid , user . Uid ) ;
145+ Assert . Equal ( randomUser . Email , user . Email ) ;
146+ Assert . Equal ( randomUser . PhoneNumber , user . PhoneNumber ) ;
147+ Assert . Equal ( args . DisplayName , user . DisplayName ) ;
148+ Assert . Equal ( args . PhotoUrl , user . PhotoUrl ) ;
149+ Assert . True ( user . EmailVerified ) ;
150+ Assert . False ( user . Disabled ) ;
151+
152+ // Cannot recreate the same user.
153+ await Assert . ThrowsAsync < FirebaseException > (
154+ async ( ) => await FirebaseAuth . DefaultInstance . CreateUserAsync ( args ) ) ;
155+ }
156+ finally
157+ {
158+ await FirebaseAuth . DefaultInstance . DeleteUserAsync ( user . Uid ) ;
159+ }
160+ }
161+
162+ [ Fact ]
163+ public async Task UserLifecycle ( )
164+ {
165+ // Create user
166+ var user = await FirebaseAuth . DefaultInstance . CreateUserAsync ( new UserRecordArgs ( ) ) ;
167+ var uid = user . Uid ;
168+ try
169+ {
170+ Assert . Null ( user . Email ) ;
171+ Assert . Null ( user . PhoneNumber ) ;
172+ Assert . Null ( user . DisplayName ) ;
173+ Assert . Null ( user . PhotoUrl ) ;
174+ Assert . False ( user . EmailVerified ) ;
175+ Assert . False ( user . Disabled ) ;
176+ Assert . NotNull ( user . UserMetaData . CreationTimestamp ) ;
177+ Assert . Null ( user . UserMetaData . LastSignInTimestamp ) ;
178+ Assert . Empty ( user . ProviderData ) ;
179+ Assert . Empty ( user . CustomClaims ) ;
180+
181+ // Get user by ID
182+ user = await FirebaseAuth . DefaultInstance . GetUserAsync ( uid ) ;
183+ Assert . Equal ( uid , user . Uid ) ;
184+ Assert . Null ( user . Email ) ;
185+ Assert . Null ( user . PhoneNumber ) ;
186+ Assert . Null ( user . DisplayName ) ;
187+ Assert . Null ( user . PhotoUrl ) ;
188+ Assert . False ( user . EmailVerified ) ;
189+ Assert . False ( user . Disabled ) ;
190+ Assert . NotNull ( user . UserMetaData . CreationTimestamp ) ;
191+ Assert . Null ( user . UserMetaData . LastSignInTimestamp ) ;
192+ Assert . Empty ( user . ProviderData ) ;
193+ Assert . Empty ( user . CustomClaims ) ;
194+
195+ // Update user
196+ var randomUser = RandomUser . Create ( ) ;
197+ var updateArgs = new UserRecordArgs ( )
198+ {
199+ Uid = uid ,
200+ DisplayName = "Updated Name" ,
201+ Email = randomUser . Email ,
202+ PhoneNumber = randomUser . PhoneNumber ,
203+ PhotoUrl = "https://example.com/photo.png" ,
204+ EmailVerified = true ,
205+ Password = "secret" ,
206+ } ;
207+ user = await FirebaseAuth . DefaultInstance . UpdateUserAsync ( updateArgs ) ;
208+ Assert . Equal ( uid , user . Uid ) ;
209+ Assert . Equal ( randomUser . Email , user . Email ) ;
210+ Assert . Equal ( randomUser . PhoneNumber , user . PhoneNumber ) ;
211+ Assert . Equal ( "Updated Name" , user . DisplayName ) ;
212+ Assert . Equal ( "https://example.com/photo.png" , user . PhotoUrl ) ;
213+ Assert . True ( user . EmailVerified ) ;
214+ Assert . False ( user . Disabled ) ;
215+ Assert . NotNull ( user . UserMetaData . CreationTimestamp ) ;
216+ Assert . Null ( user . UserMetaData . LastSignInTimestamp ) ;
217+ Assert . Equal ( 2 , user . ProviderData . Length ) ;
218+ Assert . Empty ( user . CustomClaims ) ;
219+
220+ // Get user by email
221+ user = await FirebaseAuth . DefaultInstance . GetUserByEmailAsync ( randomUser . Email ) ;
222+ Assert . Equal ( uid , user . Uid ) ;
223+
224+ // Disable user and remove properties
225+ var disableArgs = new UserRecordArgs ( )
226+ {
227+ Uid = uid ,
228+ Disabled = true ,
229+ DisplayName = null ,
230+ PhoneNumber = null ,
231+ PhotoUrl = null ,
232+ } ;
233+ user = await FirebaseAuth . DefaultInstance . UpdateUserAsync ( disableArgs ) ;
234+ Assert . Equal ( uid , user . Uid ) ;
235+ Assert . Equal ( randomUser . Email , user . Email ) ;
236+ Assert . Null ( user . PhoneNumber ) ;
237+ Assert . Null ( user . DisplayName ) ;
238+ Assert . Null ( user . PhotoUrl ) ;
239+ Assert . True ( user . EmailVerified ) ;
240+ Assert . True ( user . Disabled ) ;
241+ Assert . NotNull ( user . UserMetaData . CreationTimestamp ) ;
242+ Assert . Null ( user . UserMetaData . LastSignInTimestamp ) ;
243+ Assert . Single ( user . ProviderData ) ;
244+ Assert . Empty ( user . CustomClaims ) ;
245+ }
246+ finally
247+ {
248+ // Delete user
249+ await FirebaseAuth . DefaultInstance . DeleteUserAsync ( uid ) ;
250+ await Assert . ThrowsAsync < FirebaseException > (
251+ async ( ) => await FirebaseAuth . DefaultInstance . GetUserAsync ( uid ) ) ;
252+ }
253+ }
254+
255+ [ Fact ]
256+ public async Task GetUserNonExistingUid ( )
257+ {
258+ await Assert . ThrowsAsync < FirebaseException > (
259+ async ( ) => await FirebaseAuth . DefaultInstance . GetUserAsync ( "non.existing" ) ) ;
260+ }
261+
262+ [ Fact ]
263+ public async Task GetUserNonExistingEmail ( )
264+ {
265+ await Assert . ThrowsAsync < FirebaseException > (
266+ async ( ) => await FirebaseAuth . DefaultInstance . GetUserByEmailAsync ( "[email protected] " ) ) ; 267+ }
268+
269+ [ Fact ]
270+ public async Task UpdateUserNonExistingUid ( )
271+ {
272+ var args = new UserRecordArgs ( )
273+ {
274+ Uid = "non.existing" ,
275+ } ;
276+ await Assert . ThrowsAsync < FirebaseException > (
277+ async ( ) => await FirebaseAuth . DefaultInstance . UpdateUserAsync ( args ) ) ;
278+ }
279+
280+ [ Fact ]
281+ public async Task DeleteUserNonExistingUid ( )
282+ {
283+ await Assert . ThrowsAsync < FirebaseException > (
284+ async ( ) => await FirebaseAuth . DefaultInstance . DeleteUserAsync ( "non.existing" ) ) ;
123285 }
124286
125287 private static async Task < string > SignInWithCustomTokenAsync ( string customToken )
@@ -163,4 +325,33 @@ internal class SignInResponse
163325 [ Newtonsoft . Json . JsonProperty ( "idToken" ) ]
164326 public string IdToken { get ; set ; }
165327 }
328+
329+ internal class RandomUser
330+ {
331+ internal string Uid { get ; private set ; }
332+
333+ internal string Email { get ; private set ; }
334+
335+ internal string PhoneNumber { get ; private set ; }
336+
337+ internal static RandomUser Create ( )
338+ {
339+ var uid = Guid . NewGuid ( ) . ToString ( ) . Replace ( "-" , string . Empty ) ;
340+ var email = $ "test{ uid . Substring ( 0 , 12 ) } @example.{ uid . Substring ( 12 ) } .com";
341+
342+ var phone = "+1" ;
343+ var rand = new Random ( ) ;
344+ for ( int i = 0 ; i < 10 ; i ++ )
345+ {
346+ phone += rand . Next ( 10 ) ;
347+ }
348+
349+ return new RandomUser ( )
350+ {
351+ Uid = uid ,
352+ Email = email ,
353+ PhoneNumber = phone ,
354+ } ;
355+ }
356+ }
166357}
0 commit comments