21
21
import firebase_admin
22
22
from firebase_admin import auth
23
23
from firebase_admin import exceptions
24
- from firebase_admin import _auth_providers
25
24
from tests import testutils
26
25
27
- USER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2beta1/projects/mock-project-id'
26
+ ID_TOOLKIT_URL = 'https://identitytoolkit.googleapis.com/v2beta1'
27
+ EMULATOR_HOST_ENV_VAR = 'FIREBASE_AUTH_EMULATOR_HOST'
28
+ AUTH_EMULATOR_HOST = 'localhost:9099'
29
+ EMULATED_ID_TOOLKIT_URL = 'http://{}/identitytoolkit.googleapis.com/v2beta1' .format (
30
+ AUTH_EMULATOR_HOST )
31
+ URL_PROJECT_SUFFIX = '/projects/mock-project-id'
32
+ USER_MGT_URLS = {
33
+ 'ID_TOOLKIT' : ID_TOOLKIT_URL ,
34
+ 'PREFIX' : ID_TOOLKIT_URL + URL_PROJECT_SUFFIX ,
35
+ }
28
36
OIDC_PROVIDER_CONFIG_RESPONSE = testutils .resource ('oidc_provider_config.json' )
29
37
SAML_PROVIDER_CONFIG_RESPONSE = testutils .resource ('saml_provider_config.json' )
30
38
LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils .resource ('list_oidc_provider_configs.json' )
39
47
INVALID_PROVIDER_IDS = [None , True , False , 1 , 0 , list (), tuple (), dict (), '' ]
40
48
41
49
42
- @pytest .fixture (scope = 'module' )
43
- def user_mgt_app ():
50
+ @pytest .fixture (scope = 'module' , params = [{'emulated' : False }, {'emulated' : True }])
51
+ def user_mgt_app (request ):
52
+ monkeypatch = pytest .MonkeyPatch ()
53
+ if request .param ['emulated' ]:
54
+ monkeypatch .setenv (EMULATOR_HOST_ENV_VAR , AUTH_EMULATOR_HOST )
55
+ monkeypatch .setitem (USER_MGT_URLS , 'ID_TOOLKIT' , EMULATED_ID_TOOLKIT_URL )
56
+ monkeypatch .setitem (USER_MGT_URLS , 'PREFIX' , EMULATED_ID_TOOLKIT_URL + URL_PROJECT_SUFFIX )
44
57
app = firebase_admin .initialize_app (testutils .MockCredential (), name = 'providerConfig' ,
45
58
options = {'projectId' : 'mock-project-id' })
46
59
yield app
47
60
firebase_admin .delete_app (app )
61
+ monkeypatch .undo ()
48
62
49
63
50
64
def _instrument_provider_mgt (app , status , payload ):
51
65
client = auth ._get_client (app )
52
66
provider_manager = client ._provider_manager
53
67
recorder = []
54
68
provider_manager .http_client .session .mount (
55
- _auth_providers . ProviderConfigClient . PROVIDER_CONFIG_URL ,
69
+ USER_MGT_URLS [ 'ID_TOOLKIT' ] ,
56
70
testutils .MockAdapter (payload , status , recorder ))
57
71
return recorder
58
72
@@ -90,7 +104,7 @@ def test_get(self, user_mgt_app):
90
104
assert len (recorder ) == 1
91
105
req = recorder [0 ]
92
106
assert req .method == 'GET'
93
- assert req .url == '{0}{1}' .format (USER_MGT_URL_PREFIX , '/oauthIdpConfigs/oidc.provider' )
107
+ assert req .url == '{0}{1}' .format (USER_MGT_URLS [ 'PREFIX' ] , '/oauthIdpConfigs/oidc.provider' )
94
108
95
109
@pytest .mark .parametrize ('invalid_opts' , [
96
110
{'provider_id' : None }, {'provider_id' : '' }, {'provider_id' : 'saml.provider' },
@@ -116,7 +130,7 @@ def test_create(self, user_mgt_app):
116
130
req = recorder [0 ]
117
131
assert req .method == 'POST'
118
132
assert req .url == '{0}/oauthIdpConfigs?oauthIdpConfigId=oidc.provider' .format (
119
- USER_MGT_URL_PREFIX )
133
+ USER_MGT_URLS [ 'PREFIX' ] )
120
134
got = json .loads (req .body .decode ())
121
135
assert got == self .OIDC_CONFIG_REQUEST
122
136
@@ -136,7 +150,7 @@ def test_create_minimal(self, user_mgt_app):
136
150
req = recorder [0 ]
137
151
assert req .method == 'POST'
138
152
assert req .url == '{0}/oauthIdpConfigs?oauthIdpConfigId=oidc.provider' .format (
139
- USER_MGT_URL_PREFIX )
153
+ USER_MGT_URLS [ 'PREFIX' ] )
140
154
got = json .loads (req .body .decode ())
141
155
assert got == want
142
156
@@ -156,7 +170,7 @@ def test_create_empty_values(self, user_mgt_app):
156
170
req = recorder [0 ]
157
171
assert req .method == 'POST'
158
172
assert req .url == '{0}/oauthIdpConfigs?oauthIdpConfigId=oidc.provider' .format (
159
- USER_MGT_URL_PREFIX )
173
+ USER_MGT_URLS [ 'PREFIX' ] )
160
174
got = json .loads (req .body .decode ())
161
175
assert got == want
162
176
@@ -186,7 +200,7 @@ def test_update(self, user_mgt_app):
186
200
assert req .method == 'PATCH'
187
201
mask = ['clientId' , 'displayName' , 'enabled' , 'issuer' ]
188
202
assert req .url == '{0}/oauthIdpConfigs/oidc.provider?updateMask={1}' .format (
189
- USER_MGT_URL_PREFIX , ',' .join (mask ))
203
+ USER_MGT_URLS [ 'PREFIX' ] , ',' .join (mask ))
190
204
got = json .loads (req .body .decode ())
191
205
assert got == self .OIDC_CONFIG_REQUEST
192
206
@@ -201,7 +215,7 @@ def test_update_minimal(self, user_mgt_app):
201
215
req = recorder [0 ]
202
216
assert req .method == 'PATCH'
203
217
assert req .url == '{0}/oauthIdpConfigs/oidc.provider?updateMask=displayName' .format (
204
- USER_MGT_URL_PREFIX )
218
+ USER_MGT_URLS [ 'PREFIX' ] )
205
219
got = json .loads (req .body .decode ())
206
220
assert got == {'displayName' : 'oidcProviderName' }
207
221
@@ -217,7 +231,7 @@ def test_update_empty_values(self, user_mgt_app):
217
231
assert req .method == 'PATCH'
218
232
mask = ['displayName' , 'enabled' ]
219
233
assert req .url == '{0}/oauthIdpConfigs/oidc.provider?updateMask={1}' .format (
220
- USER_MGT_URL_PREFIX , ',' .join (mask ))
234
+ USER_MGT_URLS [ 'PREFIX' ] , ',' .join (mask ))
221
235
got = json .loads (req .body .decode ())
222
236
assert got == {'displayName' : None , 'enabled' : False }
223
237
@@ -236,7 +250,7 @@ def test_delete(self, user_mgt_app):
236
250
assert len (recorder ) == 1
237
251
req = recorder [0 ]
238
252
assert req .method == 'DELETE'
239
- assert req .url == '{0}{1}' .format (USER_MGT_URL_PREFIX , '/oauthIdpConfigs/oidc.provider' )
253
+ assert req .url == '{0}{1}' .format (USER_MGT_URLS [ 'PREFIX' ] , '/oauthIdpConfigs/oidc.provider' )
240
254
241
255
@pytest .mark .parametrize ('arg' , [None , 'foo' , list (), dict (), 0 , - 1 , 101 , False ])
242
256
def test_invalid_max_results (self , user_mgt_app , arg ):
@@ -259,7 +273,7 @@ def test_list_single_page(self, user_mgt_app):
259
273
assert len (recorder ) == 1
260
274
req = recorder [0 ]
261
275
assert req .method == 'GET'
262
- assert req .url == '{0}{1}' .format (USER_MGT_URL_PREFIX , '/oauthIdpConfigs?pageSize=100' )
276
+ assert req .url == '{0}{1}' .format (USER_MGT_URLS [ 'PREFIX' ] , '/oauthIdpConfigs?pageSize=100' )
263
277
264
278
def test_list_multiple_pages (self , user_mgt_app ):
265
279
sample_response = json .loads (OIDC_PROVIDER_CONFIG_RESPONSE )
@@ -277,7 +291,7 @@ def test_list_multiple_pages(self, user_mgt_app):
277
291
assert len (recorder ) == 1
278
292
req = recorder [0 ]
279
293
assert req .method == 'GET'
280
- assert req .url == '{0}/oauthIdpConfigs?pageSize=10' .format (USER_MGT_URL_PREFIX )
294
+ assert req .url == '{0}/oauthIdpConfigs?pageSize=10' .format (USER_MGT_URLS [ 'PREFIX' ] )
281
295
282
296
# Page 2 (also the last page)
283
297
response = {'oauthIdpConfigs' : configs [2 :]}
@@ -289,7 +303,7 @@ def test_list_multiple_pages(self, user_mgt_app):
289
303
req = recorder [0 ]
290
304
assert req .method == 'GET'
291
305
assert req .url == '{0}/oauthIdpConfigs?pageSize=10&pageToken=token' .format (
292
- USER_MGT_URL_PREFIX )
306
+ USER_MGT_URLS [ 'PREFIX' ] )
293
307
294
308
def test_paged_iteration (self , user_mgt_app ):
295
309
sample_response = json .loads (OIDC_PROVIDER_CONFIG_RESPONSE )
@@ -310,7 +324,7 @@ def test_paged_iteration(self, user_mgt_app):
310
324
assert len (recorder ) == 1
311
325
req = recorder [0 ]
312
326
assert req .method == 'GET'
313
- assert req .url == '{0}/oauthIdpConfigs?pageSize=100' .format (USER_MGT_URL_PREFIX )
327
+ assert req .url == '{0}/oauthIdpConfigs?pageSize=100' .format (USER_MGT_URLS [ 'PREFIX' ] )
314
328
315
329
# Page 2 (also the last page)
316
330
response = {'oauthIdpConfigs' : configs [2 :]}
@@ -322,7 +336,7 @@ def test_paged_iteration(self, user_mgt_app):
322
336
req = recorder [0 ]
323
337
assert req .method == 'GET'
324
338
assert req .url == '{0}/oauthIdpConfigs?pageSize=100&pageToken=token' .format (
325
- USER_MGT_URL_PREFIX )
339
+ USER_MGT_URLS [ 'PREFIX' ] )
326
340
327
341
with pytest .raises (StopIteration ):
328
342
next (iterator )
@@ -421,7 +435,8 @@ def test_get(self, user_mgt_app):
421
435
assert len (recorder ) == 1
422
436
req = recorder [0 ]
423
437
assert req .method == 'GET'
424
- assert req .url == '{0}{1}' .format (USER_MGT_URL_PREFIX , '/inboundSamlConfigs/saml.provider' )
438
+ assert req .url == '{0}{1}' .format (USER_MGT_URLS ['PREFIX' ],
439
+ '/inboundSamlConfigs/saml.provider' )
425
440
426
441
@pytest .mark .parametrize ('invalid_opts' , [
427
442
{'provider_id' : None }, {'provider_id' : '' }, {'provider_id' : 'oidc.provider' },
@@ -451,7 +466,7 @@ def test_create(self, user_mgt_app):
451
466
req = recorder [0 ]
452
467
assert req .method == 'POST'
453
468
assert req .url == '{0}/inboundSamlConfigs?inboundSamlConfigId=saml.provider' .format (
454
- USER_MGT_URL_PREFIX )
469
+ USER_MGT_URLS [ 'PREFIX' ] )
455
470
got = json .loads (req .body .decode ())
456
471
assert got == self .SAML_CONFIG_REQUEST
457
472
@@ -471,7 +486,7 @@ def test_create_minimal(self, user_mgt_app):
471
486
req = recorder [0 ]
472
487
assert req .method == 'POST'
473
488
assert req .url == '{0}/inboundSamlConfigs?inboundSamlConfigId=saml.provider' .format (
474
- USER_MGT_URL_PREFIX )
489
+ USER_MGT_URLS [ 'PREFIX' ] )
475
490
got = json .loads (req .body .decode ())
476
491
assert got == want
477
492
@@ -491,7 +506,7 @@ def test_create_empty_values(self, user_mgt_app):
491
506
req = recorder [0 ]
492
507
assert req .method == 'POST'
493
508
assert req .url == '{0}/inboundSamlConfigs?inboundSamlConfigId=saml.provider' .format (
494
- USER_MGT_URL_PREFIX )
509
+ USER_MGT_URLS [ 'PREFIX' ] )
495
510
got = json .loads (req .body .decode ())
496
511
assert got == want
497
512
@@ -528,7 +543,7 @@ def test_update(self, user_mgt_app):
528
543
'idpConfig.ssoUrl' , 'spConfig.callbackUri' , 'spConfig.spEntityId' ,
529
544
]
530
545
assert req .url == '{0}/inboundSamlConfigs/saml.provider?updateMask={1}' .format (
531
- USER_MGT_URL_PREFIX , ',' .join (mask ))
546
+ USER_MGT_URLS [ 'PREFIX' ] , ',' .join (mask ))
532
547
got = json .loads (req .body .decode ())
533
548
assert got == self .SAML_CONFIG_REQUEST
534
549
@@ -543,7 +558,7 @@ def test_update_minimal(self, user_mgt_app):
543
558
req = recorder [0 ]
544
559
assert req .method == 'PATCH'
545
560
assert req .url == '{0}/inboundSamlConfigs/saml.provider?updateMask=displayName' .format (
546
- USER_MGT_URL_PREFIX )
561
+ USER_MGT_URLS [ 'PREFIX' ] )
547
562
got = json .loads (req .body .decode ())
548
563
assert got == {'displayName' : 'samlProviderName' }
549
564
@@ -559,7 +574,7 @@ def test_update_empty_values(self, user_mgt_app):
559
574
assert req .method == 'PATCH'
560
575
mask = ['displayName' , 'enabled' ]
561
576
assert req .url == '{0}/inboundSamlConfigs/saml.provider?updateMask={1}' .format (
562
- USER_MGT_URL_PREFIX , ',' .join (mask ))
577
+ USER_MGT_URLS [ 'PREFIX' ] , ',' .join (mask ))
563
578
got = json .loads (req .body .decode ())
564
579
assert got == {'displayName' : None , 'enabled' : False }
565
580
@@ -578,7 +593,8 @@ def test_delete(self, user_mgt_app):
578
593
assert len (recorder ) == 1
579
594
req = recorder [0 ]
580
595
assert req .method == 'DELETE'
581
- assert req .url == '{0}{1}' .format (USER_MGT_URL_PREFIX , '/inboundSamlConfigs/saml.provider' )
596
+ assert req .url == '{0}{1}' .format (USER_MGT_URLS ['PREFIX' ],
597
+ '/inboundSamlConfigs/saml.provider' )
582
598
583
599
def test_config_not_found (self , user_mgt_app ):
584
600
_instrument_provider_mgt (user_mgt_app , 500 , CONFIG_NOT_FOUND_RESPONSE )
@@ -613,7 +629,8 @@ def test_list_single_page(self, user_mgt_app):
613
629
assert len (recorder ) == 1
614
630
req = recorder [0 ]
615
631
assert req .method == 'GET'
616
- assert req .url == '{0}{1}' .format (USER_MGT_URL_PREFIX , '/inboundSamlConfigs?pageSize=100' )
632
+ assert req .url == '{0}{1}' .format (USER_MGT_URLS ['PREFIX' ],
633
+ '/inboundSamlConfigs?pageSize=100' )
617
634
618
635
def test_list_multiple_pages (self , user_mgt_app ):
619
636
sample_response = json .loads (SAML_PROVIDER_CONFIG_RESPONSE )
@@ -631,7 +648,7 @@ def test_list_multiple_pages(self, user_mgt_app):
631
648
assert len (recorder ) == 1
632
649
req = recorder [0 ]
633
650
assert req .method == 'GET'
634
- assert req .url == '{0}/inboundSamlConfigs?pageSize=10' .format (USER_MGT_URL_PREFIX )
651
+ assert req .url == '{0}/inboundSamlConfigs?pageSize=10' .format (USER_MGT_URLS [ 'PREFIX' ] )
635
652
636
653
# Page 2 (also the last page)
637
654
response = {'inboundSamlConfigs' : configs [2 :]}
@@ -643,7 +660,7 @@ def test_list_multiple_pages(self, user_mgt_app):
643
660
req = recorder [0 ]
644
661
assert req .method == 'GET'
645
662
assert req .url == '{0}/inboundSamlConfigs?pageSize=10&pageToken=token' .format (
646
- USER_MGT_URL_PREFIX )
663
+ USER_MGT_URLS [ 'PREFIX' ] )
647
664
648
665
def test_paged_iteration (self , user_mgt_app ):
649
666
sample_response = json .loads (SAML_PROVIDER_CONFIG_RESPONSE )
@@ -664,7 +681,7 @@ def test_paged_iteration(self, user_mgt_app):
664
681
assert len (recorder ) == 1
665
682
req = recorder [0 ]
666
683
assert req .method == 'GET'
667
- assert req .url == '{0}/inboundSamlConfigs?pageSize=100' .format (USER_MGT_URL_PREFIX )
684
+ assert req .url == '{0}/inboundSamlConfigs?pageSize=100' .format (USER_MGT_URLS [ 'PREFIX' ] )
668
685
669
686
# Page 2 (also the last page)
670
687
response = {'inboundSamlConfigs' : configs [2 :]}
@@ -676,7 +693,7 @@ def test_paged_iteration(self, user_mgt_app):
676
693
req = recorder [0 ]
677
694
assert req .method == 'GET'
678
695
assert req .url == '{0}/inboundSamlConfigs?pageSize=100&pageToken=token' .format (
679
- USER_MGT_URL_PREFIX )
696
+ USER_MGT_URLS [ 'PREFIX' ] )
680
697
681
698
with pytest .raises (StopIteration ):
682
699
next (iterator )
0 commit comments