112112
113113USER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v1/projects/mock-project-id'
114114PROVIDER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2/projects/mock-project-id'
115- TENANT_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2/projects/mock-project-id'
116115
116+ TENANT_MGT_URL = 'https://identitytoolkit.googleapis.com/v2'
117+ TENANT_MGT_URL_PREFIX = f'{ TENANT_MGT_URL } /projects/mock-project-id'
118+ TENANT_MGT_URLS = {
119+ 'URL' : TENANT_MGT_URL ,
120+ 'PREFIX' : TENANT_MGT_URL_PREFIX ,
121+ }
117122
118- @pytest .fixture (scope = 'module' )
119- def tenant_mgt_app ():
123+ TENANT_EMULATOR_HOST_ENV_VAR = 'FIREBASE_TENANT_EMULATOR_HOST'
124+ TENANT_EMULATOR_HOST = 'localhost:9099'
125+
126+ EMULATED_TENANT_MGT_URL = f'http://{ TENANT_EMULATOR_HOST } /identitytoolkit.googleapis.com/v2'
127+ EMULATED_TENANT_MGT_URL_PREFIX = f'{ EMULATED_TENANT_MGT_URL } /projects/mock-project-id'
128+
129+ @pytest .fixture (scope = 'module' , params = [{'emulated' : False }, {'emulated' : True }])
130+ def tenant_mgt_app (request ):
131+ monkeypatch = testutils .new_monkeypatch ()
132+ if request .param ['emulated' ]:
133+ monkeypatch .setenv (TENANT_EMULATOR_HOST_ENV_VAR , TENANT_EMULATOR_HOST )
134+ monkeypatch .setitem (TENANT_MGT_URLS , 'URL' , EMULATED_TENANT_MGT_URL )
135+ monkeypatch .setitem (TENANT_MGT_URLS , 'PREFIX' , EMULATED_TENANT_MGT_URL_PREFIX )
120136 app = firebase_admin .initialize_app (
121137 testutils .MockCredential (), name = 'tenantMgt' , options = {'projectId' : 'mock-project-id' })
122138 yield app
123139 firebase_admin .delete_app (app )
140+ monkeypatch .undo ()
124141
125142
126143def _instrument_tenant_mgt (app , status , payload ):
127144 service = tenant_mgt ._get_tenant_mgt_service (app )
128145 recorder = []
146+ mount_url = service .client ._base_url .rsplit ('/projects/' , 1 )[0 ]
129147 service .client .session .mount (
130- tenant_mgt . _TenantManagementService . TENANT_MGT_URL ,
148+ mount_url ,
131149 testutils .MockAdapter (payload , status , recorder ))
132150 return service , recorder
133151
@@ -197,10 +215,13 @@ def test_get_tenant(self, tenant_mgt_app):
197215 assert len (recorder ) == 1
198216 req = recorder [0 ]
199217 assert req .method == 'GET'
200- assert req .url == f'{ TENANT_MGT_URL_PREFIX } /tenants/tenant-id'
218+ assert req .url == f'{ TENANT_MGT_URLS [ "PREFIX" ] } /tenants/tenant-id'
201219 assert req .headers ['X-Client-Version' ] == f'Python/Admin/{ firebase_admin .__version__ } '
202- expected_metrics_header = _utils .get_metrics_header () + ' mock-cred-metric-tag'
203- assert req .headers ['x-goog-api-client' ] == expected_metrics_header
220+ expected_metrics_headers = [
221+ _utils .get_metrics_header (),
222+ _utils .get_metrics_header () + ' mock-cred-metric-tag' ,
223+ ]
224+ assert req .headers ['x-goog-api-client' ] in expected_metrics_headers
204225
205226 def test_tenant_not_found (self , tenant_mgt_app ):
206227 _instrument_tenant_mgt (tenant_mgt_app , 500 , TENANT_NOT_FOUND_RESPONSE )
@@ -290,10 +311,13 @@ def _assert_request(self, recorder, body):
290311 assert len (recorder ) == 1
291312 req = recorder [0 ]
292313 assert req .method == 'POST'
293- assert req .url == f'{ TENANT_MGT_URL_PREFIX } /tenants'
314+ assert req .url == f'{ TENANT_MGT_URLS [ "PREFIX" ] } /tenants'
294315 assert req .headers ['X-Client-Version' ] == f'Python/Admin/{ firebase_admin .__version__ } '
295- expected_metrics_header = _utils .get_metrics_header () + ' mock-cred-metric-tag'
296- assert req .headers ['x-goog-api-client' ] == expected_metrics_header
316+ expected_metrics_headers = [
317+ _utils .get_metrics_header (),
318+ _utils .get_metrics_header () + ' mock-cred-metric-tag' ,
319+ ]
320+ assert req .headers ['x-goog-api-client' ] in expected_metrics_headers
297321 got = json .loads (req .body .decode ())
298322 assert got == body
299323
@@ -390,10 +414,16 @@ def _assert_request(self, recorder, body, mask):
390414 assert len (recorder ) == 1
391415 req = recorder [0 ]
392416 assert req .method == 'PATCH'
393- assert req .url == f'{ TENANT_MGT_URL_PREFIX } /tenants/tenant-id?updateMask={ "," .join (mask )} '
417+ assert req .url == (
418+ f'{ TENANT_MGT_URLS ["PREFIX" ]} /tenants/tenant-id'
419+ f'?updateMask={ "," .join (mask )} '
420+ )
394421 assert req .headers ['X-Client-Version' ] == f'Python/Admin/{ firebase_admin .__version__ } '
395- expected_metrics_header = _utils .get_metrics_header () + ' mock-cred-metric-tag'
396- assert req .headers ['x-goog-api-client' ] == expected_metrics_header
422+ expected_metrics_headers = [
423+ _utils .get_metrics_header (),
424+ _utils .get_metrics_header () + ' mock-cred-metric-tag' ,
425+ ]
426+ assert req .headers ['x-goog-api-client' ] in expected_metrics_headers
397427 got = json .loads (req .body .decode ())
398428 assert got == body
399429
@@ -413,10 +443,13 @@ def test_delete_tenant(self, tenant_mgt_app):
413443 assert len (recorder ) == 1
414444 req = recorder [0 ]
415445 assert req .method == 'DELETE'
416- assert req .url == f'{ TENANT_MGT_URL_PREFIX } /tenants/tenant-id'
446+ assert req .url == f'{ TENANT_MGT_URLS [ "PREFIX" ] } /tenants/tenant-id'
417447 assert req .headers ['X-Client-Version' ] == f'Python/Admin/{ firebase_admin .__version__ } '
418- expected_metrics_header = _utils .get_metrics_header () + ' mock-cred-metric-tag'
419- assert req .headers ['x-goog-api-client' ] == expected_metrics_header
448+ expected_metrics_headers = [
449+ _utils .get_metrics_header (),
450+ _utils .get_metrics_header () + ' mock-cred-metric-tag' ,
451+ ]
452+ assert req .headers ['x-goog-api-client' ] in expected_metrics_headers
420453
421454 def test_tenant_not_found (self , tenant_mgt_app ):
422455 _instrument_tenant_mgt (tenant_mgt_app , 500 , TENANT_NOT_FOUND_RESPONSE )
@@ -560,8 +593,11 @@ def _assert_request(self, recorder, expected=None):
560593 req = recorder [0 ]
561594 assert req .method == 'GET'
562595 assert req .headers ['X-Client-Version' ] == f'Python/Admin/{ firebase_admin .__version__ } '
563- expected_metrics_header = _utils .get_metrics_header () + ' mock-cred-metric-tag'
564- assert req .headers ['x-goog-api-client' ] == expected_metrics_header
596+ expected_metrics_headers = [
597+ _utils .get_metrics_header (),
598+ _utils .get_metrics_header () + ' mock-cred-metric-tag' ,
599+ ]
600+ assert req .headers ['x-goog-api-client' ] in expected_metrics_headers
565601 request = dict (parse .parse_qsl (parse .urlsplit (req .url ).query ))
566602 assert request == expected
567603
@@ -944,8 +980,11 @@ def _assert_request(
944980 assert req .method == method
945981 assert req .url == f'{ prefix } /tenants/tenant-id{ want_url } '
946982 assert req .headers ['X-Client-Version' ] == f'Python/Admin/{ firebase_admin .__version__ } '
947- expected_metrics_header = _utils .get_metrics_header () + ' mock-cred-metric-tag'
948- assert req .headers ['x-goog-api-client' ] == expected_metrics_header
983+ expected_metrics_headers = [
984+ _utils .get_metrics_header (),
985+ _utils .get_metrics_header () + ' mock-cred-metric-tag' ,
986+ ]
987+ assert req .headers ['x-goog-api-client' ] in expected_metrics_headers
949988 body = json .loads (req .body .decode ())
950989 assert body == want_body
951990
0 commit comments