Skip to content

Commit a55bfef

Browse files
further test for ListUsers with RestPagedAsync
1 parent 0dedee7 commit a55bfef

File tree

2 files changed

+108
-3
lines changed

2 files changed

+108
-3
lines changed

FirebaseAdmin/FirebaseAdmin.Tests/Auth/FirebaseUserManagerTest.cs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
using System;
1616
using System.Collections.Generic;
1717
using System.Net;
18+
using System.Net.Http;
1819
using System.Threading.Tasks;
1920
using FirebaseAdmin.Tests;
21+
using Google.Api.Gax;
22+
using Google.Api.Gax.Rest;
2023
using Google.Apis.Auth.OAuth2;
2124
using Xunit;
2225

@@ -118,6 +121,81 @@ await Assert.ThrowsAsync<FirebaseException>(
118121
async () => await userManager.GetUserById("user1"));
119122
}
120123

124+
[Fact]
125+
public async Task ListUsersPaged()
126+
{
127+
var nextPageToken = Guid.NewGuid().ToString();
128+
var handlerInit = new MockMessageHandler()
129+
{
130+
Response = new DownloadAccountResponse()
131+
{
132+
NextPageToken = nextPageToken,
133+
Users = new List<GetAccountInfoResponse.User>()
134+
{
135+
new GetAccountInfoResponse.User() { UserId = "user1" },
136+
new GetAccountInfoResponse.User() { UserId = "user2" },
137+
new GetAccountInfoResponse.User() { UserId = "user3" },
138+
},
139+
},
140+
};
141+
142+
var handlerSecondCall = new MockMessageHandler()
143+
{
144+
Response = new DownloadAccountResponse()
145+
{
146+
NextPageToken = string.Empty,
147+
Users = new List<GetAccountInfoResponse.User>()
148+
{
149+
new GetAccountInfoResponse.User() { UserId = "user4" },
150+
new GetAccountInfoResponse.User() { UserId = "user5" },
151+
new GetAccountInfoResponse.User() { UserId = "user6" },
152+
},
153+
},
154+
};
155+
156+
var factory = new MockHttpClientFactory(new MultipleMockMessageHandler(new Dictionary<Func<HttpRequestMessage, bool>, MockMessageHandler>
157+
{
158+
{ initMessage => initMessage.RequestUri.Query.Equals("?maxResults=3&nextPageToken="), handlerInit },
159+
{ initMessage => initMessage.RequestUri.Query.Equals($"?maxResults=3&nextPageToken={nextPageToken}"), handlerSecondCall },
160+
}));
161+
162+
var userManager = new FirebaseUserManager(
163+
new FirebaseUserManagerArgs
164+
{
165+
Credential = MockCredential,
166+
ProjectId = MockProjectId,
167+
ClientFactory = factory,
168+
});
169+
170+
var requestOptions = new ListUsersOptions();
171+
var usersPage = new RestPagedAsyncEnumerable<ListUsersRequest, ExportedUserRecords, ExportedUserRecord>(
172+
() => userManager.CreateListUserRequest(requestOptions),
173+
new ListUsersPageManager());
174+
175+
var users = new List<ExportedUserRecord>();
176+
var pageCounter = 0;
177+
178+
for (Page<ExportedUserRecord> userPage; (userPage = await usersPage.ReadPageAsync(3)) != null;)
179+
{
180+
pageCounter++;
181+
users.AddRange(userPage);
182+
183+
if (string.IsNullOrEmpty(userPage.NextPageToken))
184+
{
185+
break;
186+
}
187+
}
188+
189+
Assert.Equal(6, users.Count);
190+
Assert.Equal(2, pageCounter);
191+
Assert.Equal("user1", users[0].Uid);
192+
Assert.Equal("user2", users[1].Uid);
193+
Assert.Equal("user3", users[2].Uid);
194+
Assert.Equal("user4", users[3].Uid);
195+
Assert.Equal("user5", users[4].Uid);
196+
Assert.Equal("user6", users[5].Uid);
197+
}
198+
121199
[Fact]
122200
public async Task ListUsers()
123201
{

FirebaseAdmin/FirebaseAdmin.Tests/MockMessageHandler.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using System;
16+
using System.Collections.Generic;
1617
using System.Net;
1718
using System.Net.Http;
1819
using System.Net.Http.Headers;
@@ -53,7 +54,7 @@ public MockMessageHandler()
5354

5455
public SetContentHeaders ApplyContentHeaders { get; set; }
5556

56-
protected override async Task<HttpResponseMessage> SendAsyncCore(
57+
protected internal override async Task<HttpResponseMessage> SendAsyncCore(
5758
HttpRequestMessage request, CancellationToken cancellationToken)
5859
{
5960
if (request.Content != null)
@@ -116,15 +117,41 @@ public int Calls
116117
get { return this.calls; }
117118
}
118119

120+
protected internal abstract Task<HttpResponseMessage> SendAsyncCore(
121+
HttpRequestMessage request, CancellationToken cancellationToken);
122+
119123
protected sealed override Task<HttpResponseMessage> SendAsync(
120124
HttpRequestMessage request, CancellationToken cancellationToken)
121125
{
122126
Interlocked.Increment(ref this.calls);
123127
return this.SendAsyncCore(request, cancellationToken);
124128
}
129+
}
125130

126-
protected abstract Task<HttpResponseMessage> SendAsyncCore(
127-
HttpRequestMessage request, CancellationToken cancellationToken);
131+
internal class MultipleMockMessageHandler : CountableMessageHandler
132+
{
133+
private readonly IDictionary<Func<HttpRequestMessage, bool>, MockMessageHandler> messageHandlers;
134+
135+
public MultipleMockMessageHandler(IDictionary<Func<HttpRequestMessage, bool>, MockMessageHandler> messageHandlers)
136+
{
137+
this.messageHandlers = messageHandlers;
138+
}
139+
140+
protected internal override async Task<HttpResponseMessage> SendAsyncCore(
141+
HttpRequestMessage request, CancellationToken cancellationToken)
142+
{
143+
foreach (var (requestCheck, mockMessageHandler) in this.messageHandlers)
144+
{
145+
// check if the messagehandler is responsible for the current request
146+
if (requestCheck.Invoke(request))
147+
{
148+
this.messageHandlers.Remove(requestCheck);
149+
return await mockMessageHandler.SendAsyncCore(request, cancellationToken);
150+
}
151+
}
152+
153+
return new HttpResponseMessage(HttpStatusCode.NotFound);
154+
}
128155
}
129156

130157
internal class MockHttpClientFactory : HttpClientFactory

0 commit comments

Comments
 (0)