20
20
using FirebaseAdmin . Tests ;
21
21
using FirebaseAdmin . Util ;
22
22
using Google . Apis . Auth . OAuth2 ;
23
+ using Google . Apis . Json ;
24
+ using Newtonsoft . Json . Linq ;
23
25
using Xunit ;
24
26
25
27
namespace FirebaseAdmin . Auth . Multitenancy . Tests
@@ -45,6 +47,12 @@ public class TenantManagerTest
45
47
}
46
48
}" ;
47
49
50
+ private const string UnknownErrorResponse = @"{
51
+ ""error"": {
52
+ ""message"": ""UNKNOWN""
53
+ }
54
+ }" ;
55
+
48
56
private static readonly string ClientVersion =
49
57
$ "DotNet/Admin/{ FirebaseApp . GetSdkVersion ( ) } ";
50
58
@@ -102,6 +110,214 @@ public async Task GetTenantNotFoundError()
102
110
Assert . Null ( exception . InnerException ) ;
103
111
}
104
112
113
+ [ Fact ]
114
+ public async Task CreateTenant ( )
115
+ {
116
+ var handler = new MockMessageHandler ( )
117
+ {
118
+ Response = TenantResponse ,
119
+ } ;
120
+ var auth = CreateFirebaseAuth ( handler ) ;
121
+ var args = new TenantArgs ( )
122
+ {
123
+ DisplayName = "Test Tenant" ,
124
+ PasswordSignUpAllowed = true ,
125
+ EmailLinkSignInEnabled = true ,
126
+ } ;
127
+
128
+ var provider = await auth . TenantManager . CreateTenantAsync ( args ) ;
129
+
130
+ AssertTenant ( provider ) ;
131
+ Assert . Equal ( 1 , handler . Requests . Count ) ;
132
+ var request = handler . Requests [ 0 ] ;
133
+ Assert . Equal ( HttpMethod . Post , request . Method ) ;
134
+ Assert . Equal ( "/v2/projects/project1/tenants" , request . Url . PathAndQuery ) ;
135
+ AssertClientVersionHeader ( request ) ;
136
+
137
+ var body = NewtonsoftJsonSerializer . Instance . Deserialize < JObject > (
138
+ handler . LastRequestBody ) ;
139
+ Assert . Equal ( 3 , body . Count ) ;
140
+ Assert . Equal ( "Test Tenant" , body [ "displayName" ] ) ;
141
+ Assert . True ( ( bool ) body [ "allowPasswordSignup" ] ) ;
142
+ Assert . True ( ( bool ) body [ "enableEmailLinkSignin" ] ) ;
143
+ }
144
+
145
+ [ Fact ]
146
+ public async Task CreateTenantMinimal ( )
147
+ {
148
+ var handler = new MockMessageHandler ( )
149
+ {
150
+ Response = TenantResponse ,
151
+ } ;
152
+ var auth = CreateFirebaseAuth ( handler ) ;
153
+
154
+ var provider = await auth . TenantManager . CreateTenantAsync ( new TenantArgs ( ) ) ;
155
+
156
+ AssertTenant ( provider ) ;
157
+ Assert . Equal ( 1 , handler . Requests . Count ) ;
158
+ var request = handler . Requests [ 0 ] ;
159
+ Assert . Equal ( HttpMethod . Post , request . Method ) ;
160
+ Assert . Equal ( "/v2/projects/project1/tenants" , request . Url . PathAndQuery ) ;
161
+ AssertClientVersionHeader ( request ) ;
162
+
163
+ var body = NewtonsoftJsonSerializer . Instance . Deserialize < JObject > (
164
+ handler . LastRequestBody ) ;
165
+ Assert . Empty ( body ) ;
166
+ }
167
+
168
+ [ Fact ]
169
+ public async Task CreateTenantNullArgs ( )
170
+ {
171
+ var auth = CreateFirebaseAuth ( ) ;
172
+
173
+ await Assert . ThrowsAsync < ArgumentNullException > (
174
+ ( ) => auth . TenantManager . CreateTenantAsync ( null ) ) ;
175
+ }
176
+
177
+ [ Fact ]
178
+ public async Task CreateTenantError ( )
179
+ {
180
+ var handler = new MockMessageHandler ( )
181
+ {
182
+ StatusCode = HttpStatusCode . InternalServerError ,
183
+ Response = UnknownErrorResponse ,
184
+ } ;
185
+ var auth = CreateFirebaseAuth ( handler ) ;
186
+
187
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
188
+ ( ) => auth . TenantManager . CreateTenantAsync ( new TenantArgs ( ) ) ) ;
189
+ Assert . Equal ( ErrorCode . Internal , exception . ErrorCode ) ;
190
+ Assert . Null ( exception . AuthErrorCode ) ;
191
+ Assert . StartsWith (
192
+ "Unexpected HTTP response with status: 500 (InternalServerError)" ,
193
+ exception . Message ) ;
194
+ Assert . NotNull ( exception . HttpResponse ) ;
195
+ Assert . Null ( exception . InnerException ) ;
196
+ }
197
+
198
+ [ Fact ]
199
+ public async Task UpdateTenant ( )
200
+ {
201
+ var handler = new MockMessageHandler ( )
202
+ {
203
+ Response = TenantResponse ,
204
+ } ;
205
+ var auth = CreateFirebaseAuth ( handler ) ;
206
+ var args = new TenantArgs ( )
207
+ {
208
+ DisplayName = "Test Tenant" ,
209
+ PasswordSignUpAllowed = true ,
210
+ EmailLinkSignInEnabled = true ,
211
+ } ;
212
+
213
+ var provider = await auth . TenantManager . UpdateTenantAsync ( "tenant1" , args ) ;
214
+
215
+ AssertTenant ( provider ) ;
216
+ Assert . Equal ( 1 , handler . Requests . Count ) ;
217
+ var request = handler . Requests [ 0 ] ;
218
+ Assert . Equal ( HttpUtils . Patch , request . Method ) ;
219
+ var mask = "allowPasswordSignup,displayName,enableEmailLinkSignin" ;
220
+ Assert . Equal (
221
+ $ "/v2/projects/project1/tenants/tenant1?updateMask={ mask } ",
222
+ request . Url . PathAndQuery ) ;
223
+ AssertClientVersionHeader ( request ) ;
224
+
225
+ var body = NewtonsoftJsonSerializer . Instance . Deserialize < JObject > (
226
+ handler . LastRequestBody ) ;
227
+ Assert . Equal ( 3 , body . Count ) ;
228
+ Assert . Equal ( "Test Tenant" , body [ "displayName" ] ) ;
229
+ Assert . True ( ( bool ) body [ "allowPasswordSignup" ] ) ;
230
+ Assert . True ( ( bool ) body [ "enableEmailLinkSignin" ] ) ;
231
+ }
232
+
233
+ [ Fact ]
234
+ public async Task UpdateTenantMinimal ( )
235
+ {
236
+ var handler = new MockMessageHandler ( )
237
+ {
238
+ Response = TenantResponse ,
239
+ } ;
240
+ var auth = CreateFirebaseAuth ( handler ) ;
241
+ var args = new TenantArgs ( )
242
+ {
243
+ DisplayName = "Test Tenant" ,
244
+ } ;
245
+
246
+ var provider = await auth . TenantManager . UpdateTenantAsync ( "tenant1" , args ) ;
247
+
248
+ AssertTenant ( provider ) ;
249
+ Assert . Equal ( 1 , handler . Requests . Count ) ;
250
+ var request = handler . Requests [ 0 ] ;
251
+ Assert . Equal ( HttpUtils . Patch , request . Method ) ;
252
+ Assert . Equal (
253
+ "/v2/projects/project1/tenants/tenant1?updateMask=displayName" ,
254
+ request . Url . PathAndQuery ) ;
255
+ AssertClientVersionHeader ( request ) ;
256
+
257
+ var body = NewtonsoftJsonSerializer . Instance . Deserialize < JObject > (
258
+ handler . LastRequestBody ) ;
259
+ Assert . Single ( body ) ;
260
+ Assert . Equal ( "Test Tenant" , body [ "displayName" ] ) ;
261
+ }
262
+
263
+ [ Theory ]
264
+ [ MemberData ( nameof ( InvalidStrings ) ) ]
265
+ public async Task UpdateTenantNoId ( string tenantId )
266
+ {
267
+ var auth = CreateFirebaseAuth ( ) ;
268
+ var args = new TenantArgs ( )
269
+ {
270
+ DisplayName = "Test Tenant" ,
271
+ } ;
272
+
273
+ var exception = await Assert . ThrowsAsync < ArgumentException > (
274
+ ( ) => auth . TenantManager . UpdateTenantAsync ( tenantId , args ) ) ;
275
+ Assert . Equal ( "Tenant ID cannot be null or empty." , exception . Message ) ;
276
+ }
277
+
278
+ [ Fact ]
279
+ public async Task UpdateTenantNullArgs ( )
280
+ {
281
+ var auth = CreateFirebaseAuth ( ) ;
282
+
283
+ await Assert . ThrowsAsync < ArgumentNullException > (
284
+ ( ) => auth . TenantManager . UpdateTenantAsync ( "tenant1" , null ) ) ;
285
+ }
286
+
287
+ [ Fact ]
288
+ public async Task UpdateTenantEmptyArgs ( )
289
+ {
290
+ var auth = CreateFirebaseAuth ( ) ;
291
+
292
+ await Assert . ThrowsAsync < ArgumentException > (
293
+ ( ) => auth . TenantManager . UpdateTenantAsync ( "tenant1" , new TenantArgs ( ) ) ) ;
294
+ }
295
+
296
+ [ Fact ]
297
+ public async Task UpdateTenantError ( )
298
+ {
299
+ var handler = new MockMessageHandler ( )
300
+ {
301
+ StatusCode = HttpStatusCode . NotFound ,
302
+ Response = TenantNotFoundResponse ,
303
+ } ;
304
+ var auth = CreateFirebaseAuth ( handler ) ;
305
+ var args = new TenantArgs ( )
306
+ {
307
+ DisplayName = "Test Tenant" ,
308
+ } ;
309
+
310
+ var exception = await Assert . ThrowsAsync < FirebaseAuthException > (
311
+ ( ) => auth . TenantManager . UpdateTenantAsync ( "tenant1" , args ) ) ;
312
+ Assert . Equal ( ErrorCode . NotFound , exception . ErrorCode ) ;
313
+ Assert . Equal ( AuthErrorCode . TenantNotFound , exception . AuthErrorCode ) ;
314
+ Assert . Equal (
315
+ "No tenant found for the given identifier (TENANT_NOT_FOUND)." ,
316
+ exception . Message ) ;
317
+ Assert . NotNull ( exception . HttpResponse ) ;
318
+ Assert . Null ( exception . InnerException ) ;
319
+ }
320
+
105
321
private static FirebaseAuth CreateFirebaseAuth ( HttpMessageHandler handler = null )
106
322
{
107
323
var tenantManager = new TenantManager ( new TenantManager . Args
0 commit comments