Skip to content

Commit 9e8cb6d

Browse files
committed
More error handling and tests
1 parent 60c3589 commit 9e8cb6d

File tree

3 files changed

+127
-91
lines changed

3 files changed

+127
-91
lines changed

FirebaseAdmin/FirebaseAdmin.Tests/Auth/FirebaseUserManagerTest.cs

Lines changed: 119 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,82 @@ public async Task GetUserByPhoneNumberEmpty()
317317
await Assert.ThrowsAsync<ArgumentException>(() => userManager.GetUserByPhoneNumberAsync(string.Empty));
318318
}
319319

320+
[Fact]
321+
public void ListUsers()
322+
{
323+
var handler = new MockMessageHandler()
324+
{
325+
Response = ListUsersResponse,
326+
};
327+
var userManager = this.CreateFirebaseUserManager(handler);
328+
var users = new List<ExportedUserRecord>();
329+
330+
var pagedEnumerable = userManager.ListUsers(null);
331+
foreach (var user in pagedEnumerable.ToEnumerable())
332+
{
333+
users.Add(user);
334+
}
335+
336+
Assert.Equal(6, users.Count);
337+
Assert.Equal("user1", users[0].Uid);
338+
Assert.Equal("user2", users[1].Uid);
339+
Assert.Equal("user3", users[2].Uid);
340+
Assert.Equal("user4", users[3].Uid);
341+
Assert.Equal("user5", users[4].Uid);
342+
Assert.Equal("user6", users[5].Uid);
343+
344+
Assert.Equal(2, handler.Requests.Count);
345+
var query = this.ExtractQueryParams(handler.Requests[0]);
346+
Assert.Single(query);
347+
Assert.Equal("1000", query["maxResults"]);
348+
349+
query = this.ExtractQueryParams(handler.Requests[1]);
350+
Assert.Equal(2, query.Count);
351+
Assert.Equal("1000", query["maxResults"]);
352+
Assert.Equal("token", query["nextPageToken"]);
353+
}
354+
355+
[Fact]
356+
public void ListUsersCustomOptions()
357+
{
358+
var handler = new MockMessageHandler()
359+
{
360+
Response = ListUsersResponse,
361+
};
362+
var userManager = this.CreateFirebaseUserManager(handler);
363+
var users = new List<ExportedUserRecord>();
364+
var customOptions = new ListUsersOptions()
365+
{
366+
PageSize = 3,
367+
PageToken = "custom-token",
368+
};
369+
370+
var pagedEnumerable = userManager.ListUsers(customOptions);
371+
foreach (var user in pagedEnumerable.ToEnumerable())
372+
{
373+
users.Add(user);
374+
}
375+
376+
Assert.Equal(6, users.Count);
377+
Assert.Equal("user1", users[0].Uid);
378+
Assert.Equal("user2", users[1].Uid);
379+
Assert.Equal("user3", users[2].Uid);
380+
Assert.Equal("user4", users[3].Uid);
381+
Assert.Equal("user5", users[4].Uid);
382+
Assert.Equal("user6", users[5].Uid);
383+
384+
Assert.Equal(2, handler.Requests.Count);
385+
var query = this.ExtractQueryParams(handler.Requests[0]);
386+
Assert.Equal(2, query.Count);
387+
Assert.Equal("3", query["maxResults"]);
388+
Assert.Equal("custom-token", query["nextPageToken"]);
389+
390+
query = this.ExtractQueryParams(handler.Requests[1]);
391+
Assert.Equal(2, query.Count);
392+
Assert.Equal("3", query["maxResults"]);
393+
Assert.Equal("token", query["nextPageToken"]);
394+
}
395+
320396
[Fact]
321397
public async Task ListUsersPaged()
322398
{
@@ -327,12 +403,10 @@ public async Task ListUsersPaged()
327403
var userManager = this.CreateFirebaseUserManager(handler);
328404
var users = new List<ExportedUserRecord>();
329405
var tokens = new List<string>();
330-
var pageCounter = 0;
331406

332407
var pagedEnumerable = userManager.ListUsers(new ListUsersOptions());
333408
for (Page<ExportedUserRecord> userPage; (userPage = await pagedEnumerable.ReadPageAsync(3)) != null;)
334409
{
335-
pageCounter++;
336410
tokens.Add(userPage.NextPageToken);
337411
users.AddRange(userPage);
338412
if (userPage.NextPageToken == null)
@@ -341,10 +415,11 @@ public async Task ListUsersPaged()
341415
}
342416
}
343417

344-
Assert.Equal(2, pageCounter);
345-
Assert.Equal(6, users.Count);
418+
Assert.Equal(2, tokens.Count);
346419
Assert.Equal("token", tokens[0]);
347420
Assert.Null(tokens[1]);
421+
422+
Assert.Equal(6, users.Count);
348423
Assert.Equal("user1", users[0].Uid);
349424
Assert.Equal("user2", users[1].Uid);
350425
Assert.Equal("user3", users[2].Uid);
@@ -364,21 +439,28 @@ public async Task ListUsersPaged()
364439
}
365440

366441
[Fact]
367-
public void ListUsersByEntries()
442+
public void ListUsersAsRawResponses()
368443
{
369444
var handler = new MockMessageHandler()
370445
{
371446
Response = ListUsersResponse,
372447
};
373448
var userManager = this.CreateFirebaseUserManager(handler);
374449
var users = new List<ExportedUserRecord>();
450+
var tokens = new List<string>();
375451

376452
var pagedEnumerable = userManager.ListUsers(null);
377-
foreach (var user in pagedEnumerable.ToEnumerable())
453+
var responses = pagedEnumerable.AsRawResponses();
454+
foreach (var records in responses.ToEnumerable())
378455
{
379-
users.Add(user);
456+
users.AddRange(records.Users);
457+
tokens.Add(records.NextPageToken);
380458
}
381459

460+
Assert.Equal(2, tokens.Count);
461+
Assert.Equal("token", tokens[0]);
462+
Assert.Null(tokens[1]);
463+
382464
Assert.Equal(6, users.Count);
383465
Assert.Equal("user1", users[0].Uid);
384466
Assert.Equal("user2", users[1].Uid);
@@ -416,24 +498,28 @@ public void ListUsersPageSizeTooLarge()
416498
}
417499

418500
[Fact]
419-
public void ListUsersPageSizeZero()
501+
public void ListUsersPageSizeTooSmall()
420502
{
421503
var handler = new MockMessageHandler()
422504
{
423505
Response = ListUsersResponse,
424506
};
425507
var userManager = this.CreateFirebaseUserManager(handler);
426-
var options = new ListUsersOptions()
508+
509+
foreach (var pageSize in new int[] { 0, -1 })
427510
{
428-
PageSize = 0,
429-
};
511+
var options = new ListUsersOptions()
512+
{
513+
PageSize = pageSize,
514+
};
430515

431-
Assert.Throws<ArgumentException>(() => userManager.ListUsers(options));
432-
Assert.Empty(handler.Requests);
516+
Assert.Throws<ArgumentException>(() => userManager.ListUsers(options));
517+
Assert.Empty(handler.Requests);
518+
}
433519
}
434520

435521
[Fact]
436-
public void ListUsersPageSizeNegative()
522+
public void ListUsersStartingPageTokenEmpty()
437523
{
438524
var handler = new MockMessageHandler()
439525
{
@@ -442,114 +528,58 @@ public void ListUsersPageSizeNegative()
442528
var userManager = this.CreateFirebaseUserManager(handler);
443529
var options = new ListUsersOptions()
444530
{
445-
PageSize = -1,
531+
PageToken = string.Empty,
446532
};
447533

448534
Assert.Throws<ArgumentException>(() => userManager.ListUsers(options));
449535
Assert.Empty(handler.Requests);
450536
}
451537

452538
[Fact]
453-
public void ListUsersAsRawResponses()
539+
public async Task ListUsersHttpError()
454540
{
455541
var handler = new MockMessageHandler()
456542
{
457-
Response = ListUsersResponse,
543+
StatusCode = HttpStatusCode.InternalServerError,
458544
};
459545
var userManager = this.CreateFirebaseUserManager(handler);
460-
var users = new List<ExportedUserRecord>();
461546

462547
var pagedEnumerable = userManager.ListUsers(null);
463-
var responses = pagedEnumerable.AsRawResponses();
464-
foreach (var records in responses.ToEnumerable())
465-
{
466-
users.AddRange(records.Users);
467-
}
548+
await Assert.ThrowsAsync<FirebaseException>(async () => await pagedEnumerable.First());
468549

469-
Assert.Equal(6, users.Count);
470-
Assert.Equal("user1", users[0].Uid);
471-
Assert.Equal("user2", users[1].Uid);
472-
Assert.Equal("user3", users[2].Uid);
473-
Assert.Equal("user4", users[3].Uid);
474-
Assert.Equal("user5", users[4].Uid);
475-
Assert.Equal("user6", users[5].Uid);
476-
477-
Assert.Equal(2, handler.Requests.Count);
550+
Assert.Single(handler.Requests);
478551
var query = this.ExtractQueryParams(handler.Requests[0]);
479552
Assert.Single(query);
480553
Assert.Equal("1000", query["maxResults"]);
481-
482-
query = this.ExtractQueryParams(handler.Requests[1]);
483-
Assert.Equal(2, query.Count);
484-
Assert.Equal("1000", query["maxResults"]);
485-
Assert.Equal("token", query["nextPageToken"]);
486554
}
487555

488556
[Fact]
489-
public async Task ListUsers()
557+
public async Task ListUsersIntermittentHttpError()
490558
{
491-
var nextPageToken = Guid.NewGuid().ToString();
492559
var handler = new MockMessageHandler()
493560
{
494-
Response = new DownloadAccountResponse()
495-
{
496-
NextPageToken = nextPageToken,
497-
Users = new List<GetAccountInfoResponse.User>()
498-
{
499-
new GetAccountInfoResponse.User() { UserId = "user1" },
500-
new GetAccountInfoResponse.User() { UserId = "user2" },
501-
new GetAccountInfoResponse.User() { UserId = "user3" },
502-
},
503-
},
561+
Response = ListUsersResponse,
504562
};
505563
var userManager = this.CreateFirebaseUserManager(handler);
564+
var users = new List<ExportedUserRecord>();
506565

507-
var pagedEnumerable = userManager.ListUsers(new ListUsersOptions());
508-
var usersPage = await pagedEnumerable.ReadPageAsync(3);
566+
var pagedEnumerable = userManager.ListUsers(null);
567+
var page = await pagedEnumerable.ReadPageAsync(3);
568+
Assert.Equal(3, page.Count());
509569

510-
var userRecords = usersPage.ToList();
511-
Assert.Equal(nextPageToken, usersPage.NextPageToken);
512-
Assert.Equal(3, userRecords.Count);
513-
Assert.Equal("user1", userRecords[0].Uid);
514-
Assert.Equal("user2", userRecords[1].Uid);
515-
Assert.Equal("user3", userRecords[2].Uid);
570+
handler.StatusCode = HttpStatusCode.InternalServerError;
571+
await Assert.ThrowsAsync<FirebaseException>(
572+
async () => await pagedEnumerable.ReadPageAsync(3));
516573

517-
Assert.Single(handler.Requests);
574+
Assert.Equal(2, handler.Requests.Count);
518575
var query = this.ExtractQueryParams(handler.Requests[0]);
519576
Assert.Single(query);
520577
Assert.Equal("3", query["maxResults"]);
521-
}
522-
523-
[Fact]
524-
public void ListUsersMaxDefault()
525-
{
526-
var nextPageToken = Guid.NewGuid().ToString();
527-
var handler = new MockMessageHandler()
528-
{
529-
Response = new DownloadAccountResponse()
530-
{
531-
Users = new List<GetAccountInfoResponse.User>()
532-
{
533-
new GetAccountInfoResponse.User() { UserId = "user1" },
534-
new GetAccountInfoResponse.User() { UserId = "user2" },
535-
new GetAccountInfoResponse.User() { UserId = "user3" },
536-
},
537-
},
538-
};
539-
var userManager = this.CreateFirebaseUserManager(handler);
540-
541-
var pagedEnumerable = userManager.ListUsers(new ListUsersOptions());
542-
var userRecords = pagedEnumerable.ToEnumerable().ToList();
543578

544-
Assert.Equal(3, userRecords.Count);
545-
Assert.Equal("user1", userRecords[0].Uid);
546-
Assert.Equal("user2", userRecords[1].Uid);
547-
Assert.Equal("user3", userRecords[2].Uid);
548-
Assert.Single(handler.Requests);
549-
550-
var query = this.ExtractQueryParams(handler.Requests[0]);
551-
Assert.Single(query);
552-
Assert.Equal("1000", query["maxResults"]);
579+
query = this.ExtractQueryParams(handler.Requests[1]);
580+
Assert.Equal(2, query.Count);
581+
Assert.Equal("3", query["maxResults"]);
582+
Assert.Equal("token", query["nextPageToken"]);
553583
}
554584

555585
[Fact]

FirebaseAdmin/FirebaseAdmin/Auth/FirebaseAuth.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,8 @@ public async Task SetCustomUserClaimsAsync(
528528
/// <summary>
529529
/// Gets an async enumerable to iterate or page through users starting from the specified
530530
/// page token. If the page token is null or unspecified, iteration starts from the first
531-
/// page.
531+
/// page. See <a href="https://googleapis.github.io/google-cloud-dotnet/docs/guides/page-streaming.html">
532+
/// Page Streaming</a> for more details on how to use this API.
532533
/// </summary>
533534
/// <param name="options">The options to control the starting point and page size.</param>
534535
/// <returns>A <see cref="PagedAsyncEnumerable{ExportedUserRecords, ExportedUserRecord}"/> instance.</returns>

FirebaseAdmin/FirebaseAdmin/Auth/ListUsersRequest.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,12 @@ internal ListUsersRequest(string baseUrl, HttpClient httpClient, ListUsersOption
4646
this.options = new ListUsersOptions(options);
4747
this.RequestParameters = new Dictionary<string, IParameter>();
4848
this.SetPageSize(this.options.PageSize ?? MaxListUsersResults);
49-
if (!string.IsNullOrEmpty(this.options.PageToken))
49+
50+
if (this.options.PageToken == string.Empty)
51+
{
52+
throw new ArgumentException("Starting page token must not be empty.");
53+
}
54+
else if (this.options.PageToken != null)
5055
{
5156
this.SetPageToken(this.options.PageToken);
5257
}

0 commit comments

Comments
 (0)