Skip to content

Commit bde38c2

Browse files
committed
Merged with master
2 parents 1a887cb + 2c63161 commit bde38c2

File tree

12 files changed

+152
-33
lines changed

12 files changed

+152
-33
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Unreleased
22

3+
-
4+
5+
# v1.8.0
6+
37
- [added] Added `FirebaseMessagingException` class and improved FCM error
48
handling logic.
59

FirebaseAdmin/FirebaseAdmin.IntegrationTests/FirebaseMessagingTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ public async Task SendMulticast()
125125
[Fact]
126126
public async Task SubscribeToTopic()
127127
{
128-
var response = await FirebaseMessaging.DefaultInstance.SubscribeToTopicAsync("test-topic", new List<string> { "token1", "token2" });
128+
var response = await FirebaseMessaging.DefaultInstance.SubscribeToTopicAsync(
129+
new List<string> { "token1", "token2" }, "test-topic");
129130
Assert.NotNull(response);
130131
Assert.Equal(2, response.FailureCount);
131132
Assert.Equal("invalid-argument", response.Errors[0].Reason);
@@ -137,7 +138,8 @@ public async Task SubscribeToTopic()
137138
[Fact]
138139
public async Task UnsubscribeFromTopic()
139140
{
140-
var response = await FirebaseMessaging.DefaultInstance.UnsubscribeFromTopicAsync("test-topic", new List<string> { "token1", "token2" });
141+
var response = await FirebaseMessaging.DefaultInstance.UnsubscribeFromTopicAsync(
142+
new List<string> { "token1", "token2" }, "test-topic");
141143
Assert.NotNull(response);
142144
Assert.Equal(2, response.FailureCount);
143145
Assert.Equal("invalid-argument", response.Errors[0].Reason);

FirebaseAdmin/FirebaseAdmin.Snippets/FirebaseMessagingSnippets.cs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
using System;
1616
using System.Collections.Generic;
17-
using System.Linq;
1817
using System.Threading.Tasks;
1918
using FirebaseAdmin.Messaging;
2019

@@ -321,5 +320,47 @@ internal static Message CreateMultiPlatformsMessage()
321320
// [END multi_platforms_message]
322321
return message;
323322
}
323+
324+
internal static async Task SubscribeToTopicAsync(string topic)
325+
{
326+
// [START subscribe_to_topic]
327+
// These registration tokens come from the client FCM SDKs.
328+
var registrationTokens = new List<string>()
329+
{
330+
"YOUR_REGISTRATION_TOKEN_1",
331+
// ...
332+
"YOUR_REGISTRATION_TOKEN_n",
333+
};
334+
335+
// Subscribe the devices corresponding to the registration tokens to the
336+
// topic
337+
var response = await FirebaseMessaging.DefaultInstance.SubscribeToTopicAsync(
338+
registrationTokens, topic);
339+
// See the TopicManagementResponse reference documentation
340+
// for the contents of response.
341+
Console.WriteLine($"{response.SuccessCount} tokens were subscribed successfully");
342+
// [END subscribe_to_topic]
343+
}
344+
345+
internal static async Task UnsubscribeFromTopicAsync(string topic)
346+
{
347+
// [START unsubscribe_from_topic]
348+
// These registration tokens come from the client FCM SDKs.
349+
var registrationTokens = new List<string>()
350+
{
351+
"YOUR_REGISTRATION_TOKEN_1",
352+
// ...
353+
"YOUR_REGISTRATION_TOKEN_n",
354+
};
355+
356+
// Unsubscribe the devices corresponding to the registration tokens from the
357+
// topic
358+
var response = await FirebaseMessaging.DefaultInstance.UnsubscribeFromTopicAsync(
359+
registrationTokens, topic);
360+
// See the TopicManagementResponse reference documentation
361+
// for the contents of response.
362+
Console.WriteLine($"{response.SuccessCount} tokens were unsubscribed successfully");
363+
// [END unsubscribe_from_topic]
364+
}
324365
}
325366
}

FirebaseAdmin/FirebaseAdmin.Tests/Auth/FirebaseUserManagerTest.cs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Linq;
1818
using System.Net;
1919
using System.Net.Http;
20+
using System.Net.Http.Headers;
2021
using System.Threading.Tasks;
2122
using FirebaseAdmin.Tests;
2223
using Google.Apis.Auth.OAuth2;
@@ -81,6 +82,7 @@ public async Task GetUserById()
8182

8283
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.LastRequestBody);
8384
Assert.Equal(new JArray("user1"), request["localId"]);
85+
this.AssertClientVersion(handler.LastRequestHeaders);
8486
}
8587

8688
[Fact]
@@ -160,6 +162,8 @@ public async Task GetUserByIdWithProperties()
160162
Assert.NotNull(metadata);
161163
Assert.Equal(UserRecord.UnixEpoch.AddMilliseconds(100), metadata.CreationTimestamp);
162164
Assert.Equal(UserRecord.UnixEpoch.AddMilliseconds(150), metadata.LastSignInTimestamp);
165+
166+
this.AssertClientVersion(handler.LastRequestHeaders);
163167
}
164168

165169
[Fact]
@@ -222,6 +226,7 @@ public async Task GetUserByEmail()
222226

223227
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.LastRequestBody);
224228
Assert.Equal(new JArray("[email protected]"), request["email"]);
229+
this.AssertClientVersion(handler.LastRequestHeaders);
225230
}
226231

227232
[Fact]
@@ -284,6 +289,7 @@ public async Task GetUserByPhoneNumber()
284289

285290
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.LastRequestBody);
286291
Assert.Equal(new JArray("+1234567890"), request["phoneNumber"]);
292+
this.AssertClientVersion(handler.LastRequestHeaders);
287293
}
288294

289295
[Fact]
@@ -355,6 +361,9 @@ public async Task ListUsers()
355361
Assert.Equal(2, query.Count);
356362
Assert.Equal("1000", query["maxResults"]);
357363
Assert.Equal("token", query["nextPageToken"]);
364+
365+
this.AssertClientVersion(handler.Requests[0].Headers);
366+
this.AssertClientVersion(handler.Requests[1].Headers);
358367
}
359368

360369
[Fact]
@@ -392,6 +401,9 @@ public void ListUsersForEach()
392401
Assert.Equal(2, query.Count);
393402
Assert.Equal("1000", query["maxResults"]);
394403
Assert.Equal("token", query["nextPageToken"]);
404+
405+
this.AssertClientVersion(handler.Requests[0].Headers);
406+
this.AssertClientVersion(handler.Requests[1].Headers);
395407
}
396408

397409
[Fact]
@@ -431,6 +443,9 @@ public void ListUsersCustomOptions()
431443
Assert.Equal(2, query.Count);
432444
Assert.Equal("3", query["maxResults"]);
433445
Assert.Equal("token", query["nextPageToken"]);
446+
447+
this.AssertClientVersion(handler.Requests[0].Headers);
448+
this.AssertClientVersion(handler.Requests[1].Headers);
434449
}
435450

436451
[Fact]
@@ -466,6 +481,9 @@ public async Task ListUsersReadPage()
466481
query = this.ExtractQueryParams(handler.Requests[1]);
467482
Assert.Single(query);
468483
Assert.Equal("3", query["maxResults"]);
484+
485+
this.AssertClientVersion(handler.Requests[0].Headers);
486+
this.AssertClientVersion(handler.Requests[1].Headers);
469487
}
470488

471489
[Fact]
@@ -511,6 +529,9 @@ public async Task ListUsersByPages()
511529
{
512530
Assert.Equal($"user{i + 1}", users[i].Uid);
513531
}
532+
533+
this.AssertClientVersion(handler.Requests[0].Headers);
534+
this.AssertClientVersion(handler.Requests[1].Headers);
514535
}
515536

516537
[Fact]
@@ -536,6 +557,9 @@ public async Task ListUsersReadLargePageSize()
536557
Assert.Equal(2, query.Count);
537558
Assert.Equal("7", query["maxResults"]);
538559
Assert.Equal("token", query["nextPageToken"]);
560+
561+
this.AssertClientVersion(handler.Requests[0].Headers);
562+
this.AssertClientVersion(handler.Requests[1].Headers);
539563
}
540564

541565
[Fact]
@@ -577,6 +601,9 @@ public async Task ListUsersAsRawResponses()
577601
Assert.Equal(2, query.Count);
578602
Assert.Equal("1000", query["maxResults"]);
579603
Assert.Equal("token", query["nextPageToken"]);
604+
605+
this.AssertClientVersion(handler.Requests[0].Headers);
606+
this.AssertClientVersion(handler.Requests[1].Headers);
580607
}
581608

582609
[Fact]
@@ -760,6 +787,9 @@ public async Task CreateUser()
760787
Assert.Equal(2, handler.Requests.Count);
761788
var request = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>(handler.Requests[0].Body);
762789
Assert.Empty(request);
790+
791+
this.AssertClientVersion(handler.Requests[0].Headers);
792+
this.AssertClientVersion(handler.Requests[1].Headers);
763793
}
764794

765795
[Fact]
@@ -793,6 +823,9 @@ public async Task CreateUserWithArgs()
793823
Assert.Equal("secret", request["password"]);
794824
Assert.Equal("+1234567890", request["phoneNumber"]);
795825
Assert.Equal("https://example.com/user.png", request["photoUrl"]);
826+
827+
this.AssertClientVersion(handler.Requests[0].Headers);
828+
this.AssertClientVersion(handler.Requests[1].Headers);
796829
}
797830

798831
[Fact]
@@ -821,6 +854,9 @@ public async Task CreateUserWithExplicitDefaults()
821854
Assert.Equal(2, request.Count);
822855
Assert.False((bool)request["disabled"]);
823856
Assert.False((bool)request["emailVerified"]);
857+
858+
this.AssertClientVersion(handler.Requests[0].Headers);
859+
this.AssertClientVersion(handler.Requests[1].Headers);
824860
}
825861

826862
[Fact]
@@ -1025,6 +1061,9 @@ public async Task UpdateUser()
10251061
Assert.True((bool)claims["admin"]);
10261062
Assert.Equal(4L, claims["level"]);
10271063
Assert.Equal("gold", claims["package"]);
1064+
1065+
this.AssertClientVersion(handler.Requests[0].Headers);
1066+
this.AssertClientVersion(handler.Requests[1].Headers);
10281067
}
10291068

10301069
[Fact]
@@ -1048,6 +1087,9 @@ public async Task UpdateUserPartial()
10481087
Assert.Equal(2, request.Count);
10491088
Assert.Equal("user1", request["localId"]);
10501089
Assert.True((bool)request["emailVerified"]);
1090+
1091+
this.AssertClientVersion(handler.Requests[0].Headers);
1092+
this.AssertClientVersion(handler.Requests[1].Headers);
10511093
}
10521094

10531095
[Fact]
@@ -1074,6 +1116,9 @@ public async Task UpdateUserRemoveAttributes()
10741116
Assert.Equal(
10751117
new JArray() { "DISPLAY_NAME", "PHOTO_URL" },
10761118
request["deleteAttribute"]);
1119+
1120+
this.AssertClientVersion(handler.Requests[0].Headers);
1121+
this.AssertClientVersion(handler.Requests[1].Headers);
10771122
}
10781123

10791124
[Fact]
@@ -1099,6 +1144,9 @@ public async Task UpdateUserRemoveProviders()
10991144
Assert.Equal(
11001145
new JArray() { "phone" },
11011146
request["deleteProvider"]);
1147+
1148+
this.AssertClientVersion(handler.Requests[0].Headers);
1149+
this.AssertClientVersion(handler.Requests[1].Headers);
11021150
}
11031151

11041152
[Fact]
@@ -1122,6 +1170,8 @@ public async Task UpdateUserSetCustomClaims()
11221170
Assert.True((bool)claims["admin"]);
11231171
Assert.Equal(4L, claims["level"]);
11241172
Assert.Equal("gold", claims["package"]);
1173+
1174+
this.AssertClientVersion(handler.LastRequestHeaders);
11251175
}
11261176

11271177
[Fact]
@@ -1135,6 +1185,7 @@ public async Task LargeClaimsUnderLimit()
11351185
};
11361186

11371187
await auth.SetCustomUserClaimsAsync("user1", customClaims);
1188+
this.AssertClientVersion(handler.LastRequestHeaders);
11381189
}
11391190

11401191
[Fact]
@@ -1148,6 +1199,8 @@ public async Task EmptyClaims()
11481199
var request = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>(handler.LastRequestBody);
11491200
Assert.Equal("user1", request["localId"]);
11501201
Assert.Equal("{}", request["customAttributes"]);
1202+
1203+
this.AssertClientVersion(handler.LastRequestHeaders);
11511204
}
11521205

11531206
[Fact]
@@ -1161,6 +1214,8 @@ public async Task NullClaims()
11611214
var request = NewtonsoftJsonSerializer.Instance.Deserialize<JObject>(handler.LastRequestBody);
11621215
Assert.Equal("user1", request["localId"]);
11631216
Assert.Equal("{}", request["customAttributes"]);
1217+
1218+
this.AssertClientVersion(handler.LastRequestHeaders);
11641219
}
11651220

11661221
[Fact]
@@ -1447,6 +1502,7 @@ public async Task DeleteUser()
14471502
var auth = this.CreateFirebaseAuth(handler);
14481503

14491504
await auth.DeleteUserAsync("user1");
1505+
this.AssertClientVersion(handler.LastRequestHeaders);
14501506
}
14511507

14521508
[Fact]
@@ -1493,5 +1549,12 @@ private IDictionary<string, string> ExtractQueryParams(MockMessageHandler.Incomi
14931549
return req.Url.Query.Substring(1).Split('&').ToDictionary(
14941550
entry => entry.Split('=')[0], entry => entry.Split('=')[1]);
14951551
}
1552+
1553+
private void AssertClientVersion(HttpRequestHeaders header)
1554+
{
1555+
Assert.Equal(
1556+
FirebaseUserManager.ClientVersion,
1557+
header.GetValues(FirebaseUserManager.ClientVersionHeader).First());
1558+
}
14961559
}
14971560
}

FirebaseAdmin/FirebaseAdmin.Tests/Messaging/FirebaseMessagingTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public async Task SubscribeWithClientFactory()
138138
Assert.NotNull(messaging);
139139
Assert.Same(messaging, FirebaseMessaging.GetMessaging(app));
140140

141-
var response = await messaging.SubscribeToTopicAsync("test-topic", new List<string> { "test-token" });
141+
var response = await messaging.SubscribeToTopicAsync(new List<string> { "test-token" }, "test-topic");
142142
Assert.Equal(0, response.FailureCount);
143143
Assert.Equal(1, response.SuccessCount);
144144
app.Delete();
@@ -163,7 +163,7 @@ public async Task UnsubscribeWithClientFactory()
163163
Assert.NotNull(messaging);
164164
Assert.Same(messaging, FirebaseMessaging.GetMessaging(app));
165165

166-
var response = await messaging.UnsubscribeFromTopicAsync("test-topic", new List<string> { "test-token" });
166+
var response = await messaging.UnsubscribeFromTopicAsync(new List<string> { "test-token" }, "test-topic");
167167
Assert.Equal(0, response.FailureCount);
168168
Assert.Equal(1, response.SuccessCount);
169169
app.Delete();

0 commit comments

Comments
 (0)