From 248a194a50495fb741aef67272a729d723412c4b Mon Sep 17 00:00:00 2001 From: pragatimodi <110490169+pragatimodi@users.noreply.github.com> Date: Thu, 30 Mar 2023 17:55:05 +0000 Subject: [PATCH 1/3] `v2beta1` -> `v2` --- firebase_admin/_auth_client.py | 14 ++- firebase_admin/_auth_providers.py | 62 ++++++---- firebase_admin/tenant_mgt.py | 14 ++- tests/test_auth_providers.py | 172 +++++++++++++++++--------- tests/test_tenant_mgt.py | 196 ++++++++++++++++++++---------- 5 files changed, 301 insertions(+), 157 deletions(-) diff --git a/firebase_admin/_auth_client.py b/firebase_admin/_auth_client.py index eaf491f32..c4b458b94 100644 --- a/firebase_admin/_auth_client.py +++ b/firebase_admin/_auth_client.py @@ -39,7 +39,8 @@ def __init__(self, app, tenant_id=None): credential = None version_header = 'Python/Admin/{0}'.format(firebase_admin.__version__) - timeout = app.options.get('httpTimeout', _http_client.DEFAULT_TIMEOUT_SECONDS) + timeout = app.options.get( + 'httpTimeout', _http_client.DEFAULT_TIMEOUT_SECONDS) # Non-default endpoint URLs for emulator support are set in this dict later. endpoint_urls = {} self.emulated = False @@ -48,9 +49,10 @@ def __init__(self, app, tenant_id=None): # endpoint URLs to use the emulator. Additionally, use a fake credential. emulator_host = _auth_utils.get_emulator_host() if emulator_host: - base_url = 'http://{0}/identitytoolkit.googleapis.com'.format(emulator_host) + base_url = 'http://{0}/identitytoolkit.googleapis.com'.format( + emulator_host) endpoint_urls['v1'] = base_url + '/v1' - endpoint_urls['v2beta1'] = base_url + '/v2beta1' + endpoint_urls['v2'] = base_url + '/v2' credential = _utils.EmulatorAdminCredentials() self.emulated = True else: @@ -67,7 +69,7 @@ def __init__(self, app, tenant_id=None): self._user_manager = _user_mgt.UserManager( http_client, app.project_id, tenant_id, url_override=endpoint_urls.get('v1')) self._provider_manager = _auth_providers.ProviderConfigClient( - http_client, app.project_id, tenant_id, url_override=endpoint_urls.get('v2beta1')) + http_client, app.project_id, tenant_id, url_override=endpoint_urls.get('v2')) @property def tenant_id(self): @@ -284,7 +286,7 @@ def download(page_token, max_results): return self._user_manager.list_users(page_token, max_results) return _user_mgt.ListUsersPage(download, page_token, max_results) - def create_user(self, **kwargs): # pylint: disable=differing-param-doc + def create_user(self, **kwargs): # pylint: disable=differing-param-doc """Creates a new user account with the specified properties. Args: @@ -311,7 +313,7 @@ def create_user(self, **kwargs): # pylint: disable=differing-param-doc uid = self._user_manager.create_user(**kwargs) return self.get_user(uid=uid) - def update_user(self, uid, **kwargs): # pylint: disable=differing-param-doc + def update_user(self, uid, **kwargs): # pylint: disable=differing-param-doc """Updates an existing user account with the specified properties. Args: diff --git a/firebase_admin/_auth_providers.py b/firebase_admin/_auth_providers.py index 31511f3c5..948d0ccc6 100644 --- a/firebase_admin/_auth_providers.py +++ b/firebase_admin/_auth_providers.py @@ -176,7 +176,7 @@ def items(self): class ProviderConfigClient: """Client for managing Auth provider configurations.""" - PROVIDER_CONFIG_URL = 'https://identitytoolkit.googleapis.com/v2beta1' + PROVIDER_CONFIG_URL = 'https://identitytoolkit.googleapis.com/v2' def __init__(self, http_client, project_id, tenant_id=None, url_override=None): self.http_client = http_client @@ -187,7 +187,8 @@ def __init__(self, http_client, project_id, tenant_id=None, url_override=None): def get_oidc_provider_config(self, provider_id): _validate_oidc_provider_id(provider_id) - body = self._make_request('get', '/oauthIdpConfigs/{0}'.format(provider_id)) + body = self._make_request( + 'get', '/oauthIdpConfigs/{0}'.format(provider_id)) return OIDCProviderConfig(body) def create_oidc_provider_config( @@ -200,7 +201,8 @@ def create_oidc_provider_config( 'issuer': _validate_url(issuer, 'issuer'), } if display_name is not None: - req['displayName'] = _auth_utils.validate_string(display_name, 'display_name') + req['displayName'] = _auth_utils.validate_string( + display_name, 'display_name') if enabled is not None: req['enabled'] = _auth_utils.validate_boolean(enabled, 'enabled') @@ -214,12 +216,14 @@ def create_oidc_provider_config( response_type['code'] = _auth_utils.validate_boolean( code_response_type, 'code_response_type') if code_response_type: - req['clientSecret'] = _validate_non_empty_string(client_secret, 'client_secret') + req['clientSecret'] = _validate_non_empty_string( + client_secret, 'client_secret') if response_type: req['responseType'] = response_type params = 'oauthIdpConfigId={0}'.format(provider_id) - body = self._make_request('post', '/oauthIdpConfigs', json=req, params=params) + body = self._make_request( + 'post', '/oauthIdpConfigs', json=req, params=params) return OIDCProviderConfig(body) def update_oidc_provider_config( @@ -233,11 +237,13 @@ def update_oidc_provider_config( if display_name == _user_mgt.DELETE_ATTRIBUTE: req['displayName'] = None else: - req['displayName'] = _auth_utils.validate_string(display_name, 'display_name') + req['displayName'] = _auth_utils.validate_string( + display_name, 'display_name') if enabled is not None: req['enabled'] = _auth_utils.validate_boolean(enabled, 'enabled') if client_id: - req['clientId'] = _validate_non_empty_string(client_id, 'client_id') + req['clientId'] = _validate_non_empty_string( + client_id, 'client_id') if issuer: req['issuer'] = _validate_url(issuer, 'issuer') @@ -251,12 +257,14 @@ def update_oidc_provider_config( response_type['code'] = _auth_utils.validate_boolean( code_response_type, 'code_response_type') if code_response_type: - req['clientSecret'] = _validate_non_empty_string(client_secret, 'client_secret') + req['clientSecret'] = _validate_non_empty_string( + client_secret, 'client_secret') if response_type: req['responseType'] = response_type if not req: - raise ValueError('At least one parameter must be specified for update.') + raise ValueError( + 'At least one parameter must be specified for update.') update_mask = _auth_utils.build_update_mask(req) params = 'updateMask={0}'.format(','.join(update_mask)) @@ -266,7 +274,8 @@ def update_oidc_provider_config( def delete_oidc_provider_config(self, provider_id): _validate_oidc_provider_id(provider_id) - self._make_request('delete', '/oauthIdpConfigs/{0}'.format(provider_id)) + self._make_request( + 'delete', '/oauthIdpConfigs/{0}'.format(provider_id)) def list_oidc_provider_configs(self, page_token=None, max_results=MAX_LIST_CONFIGS_RESULTS): return _ListOIDCProviderConfigsPage( @@ -277,7 +286,8 @@ def _fetch_oidc_provider_configs(self, page_token=None, max_results=MAX_LIST_CON def get_saml_provider_config(self, provider_id): _validate_saml_provider_id(provider_id) - body = self._make_request('get', '/inboundSamlConfigs/{0}'.format(provider_id)) + body = self._make_request( + 'get', '/inboundSamlConfigs/{0}'.format(provider_id)) return SAMLProviderConfig(body) def create_saml_provider_config( @@ -297,12 +307,14 @@ def create_saml_provider_config( }, } if display_name is not None: - req['displayName'] = _auth_utils.validate_string(display_name, 'display_name') + req['displayName'] = _auth_utils.validate_string( + display_name, 'display_name') if enabled is not None: req['enabled'] = _auth_utils.validate_boolean(enabled, 'enabled') params = 'inboundSamlConfigId={0}'.format(provider_id) - body = self._make_request('post', '/inboundSamlConfigs', json=req, params=params) + body = self._make_request( + 'post', '/inboundSamlConfigs', json=req, params=params) return SAMLProviderConfig(body) def update_saml_provider_config( @@ -312,24 +324,29 @@ def update_saml_provider_config( _validate_saml_provider_id(provider_id) idp_config = {} if idp_entity_id is not None: - idp_config['idpEntityId'] = _validate_non_empty_string(idp_entity_id, 'idp_entity_id') + idp_config['idpEntityId'] = _validate_non_empty_string( + idp_entity_id, 'idp_entity_id') if sso_url is not None: idp_config['ssoUrl'] = _validate_url(sso_url, 'sso_url') if x509_certificates is not None: - idp_config['idpCertificates'] = _validate_x509_certificates(x509_certificates) + idp_config['idpCertificates'] = _validate_x509_certificates( + x509_certificates) sp_config = {} if rp_entity_id is not None: - sp_config['spEntityId'] = _validate_non_empty_string(rp_entity_id, 'rp_entity_id') + sp_config['spEntityId'] = _validate_non_empty_string( + rp_entity_id, 'rp_entity_id') if callback_url is not None: - sp_config['callbackUri'] = _validate_url(callback_url, 'callback_url') + sp_config['callbackUri'] = _validate_url( + callback_url, 'callback_url') req = {} if display_name is not None: if display_name == _user_mgt.DELETE_ATTRIBUTE: req['displayName'] = None else: - req['displayName'] = _auth_utils.validate_string(display_name, 'display_name') + req['displayName'] = _auth_utils.validate_string( + display_name, 'display_name') if enabled is not None: req['enabled'] = _auth_utils.validate_boolean(enabled, 'enabled') if idp_config: @@ -338,7 +355,8 @@ def update_saml_provider_config( req['spConfig'] = sp_config if not req: - raise ValueError('At least one parameter must be specified for update.') + raise ValueError( + 'At least one parameter must be specified for update.') update_mask = _auth_utils.build_update_mask(req) params = 'updateMask={0}'.format(','.join(update_mask)) @@ -348,7 +366,8 @@ def update_saml_provider_config( def delete_saml_provider_config(self, provider_id): _validate_saml_provider_id(provider_id) - self._make_request('delete', '/inboundSamlConfigs/{0}'.format(provider_id)) + self._make_request( + 'delete', '/inboundSamlConfigs/{0}'.format(provider_id)) def list_saml_provider_configs(self, page_token=None, max_results=MAX_LIST_CONFIGS_RESULTS): return _ListSAMLProviderConfigsPage( @@ -430,5 +449,6 @@ def _validate_x509_certificates(x509_certificates): if not isinstance(x509_certificates, list) or not x509_certificates: raise ValueError('x509_certificates must be a non-empty list.') if not all([isinstance(cert, str) and cert for cert in x509_certificates]): - raise ValueError('x509_certificates must only contain non-empty strings.') + raise ValueError( + 'x509_certificates must only contain non-empty strings.') return [{'x509Certificate': cert} for cert in x509_certificates] diff --git a/firebase_admin/tenant_mgt.py b/firebase_admin/tenant_mgt.py index 396a819fb..1d48faea7 100644 --- a/firebase_admin/tenant_mgt.py +++ b/firebase_admin/tenant_mgt.py @@ -183,6 +183,7 @@ def list_tenants(page_token=None, max_results=_MAX_LIST_TENANTS_RESULTS, app=Non FirebaseError: If an error occurs while retrieving the user accounts. """ tenant_mgt_service = _get_tenant_mgt_service(app) + def download(page_token, max_results): return tenant_mgt_service.list_tenants(page_token, max_results) return ListTenantsPage(download, page_token, max_results) @@ -205,7 +206,8 @@ class Tenant: def __init__(self, data): if not isinstance(data, dict): - raise ValueError('Invalid data argument in Tenant constructor: {0}'.format(data)) + raise ValueError( + 'Invalid data argument in Tenant constructor: {0}'.format(data)) if not 'name' in data: raise ValueError('Tenant response missing required keys.') @@ -232,12 +234,13 @@ def enable_email_link_sign_in(self): class _TenantManagementService: """Firebase tenant management service.""" - TENANT_MGT_URL = 'https://identitytoolkit.googleapis.com/v2beta1' + TENANT_MGT_URL = 'https://identitytoolkit.googleapis.com/v2' def __init__(self, app): credential = app.credential.get_credential() version_header = 'Python/Admin/{0}'.format(firebase_admin.__version__) - base_url = '{0}/projects/{1}'.format(self.TENANT_MGT_URL, app.project_id) + base_url = '{0}/projects/{1}'.format( + self.TENANT_MGT_URL, app.project_id) self.app = app self.client = _http_client.JsonHttpClient( credential=credential, base_url=base_url, headers={'X-Client-Version': version_header}) @@ -256,7 +259,7 @@ def auth_for_tenant(self, tenant_id): client = auth.Client(self.app, tenant_id=tenant_id) self.tenant_clients[tenant_id] = client - return client + return client def get_tenant(self, tenant_id): """Gets the tenant corresponding to the given ``tenant_id``.""" @@ -308,7 +311,8 @@ def update_tenant( enable_email_link_sign_in, 'enableEmailLinkSignin') if not payload: - raise ValueError('At least one parameter must be specified for update.') + raise ValueError( + 'At least one parameter must be specified for update.') url = '/tenants/{0}'.format(tenant_id) update_mask = ','.join(_auth_utils.build_update_mask(payload)) diff --git a/tests/test_auth_providers.py b/tests/test_auth_providers.py index b67a8eb96..553cb5a12 100644 --- a/tests/test_auth_providers.py +++ b/tests/test_auth_providers.py @@ -23,10 +23,10 @@ from firebase_admin import exceptions from tests import testutils -ID_TOOLKIT_URL = 'https://identitytoolkit.googleapis.com/v2beta1' +ID_TOOLKIT_URL = 'https://identitytoolkit.googleapis.com/v2' EMULATOR_HOST_ENV_VAR = 'FIREBASE_AUTH_EMULATOR_HOST' AUTH_EMULATOR_HOST = 'localhost:9099' -EMULATED_ID_TOOLKIT_URL = 'http://{}/identitytoolkit.googleapis.com/v2beta1'.format( +EMULATED_ID_TOOLKIT_URL = 'http://{}/identitytoolkit.googleapis.com/v2'.format( AUTH_EMULATOR_HOST) URL_PROJECT_SUFFIX = '/projects/mock-project-id' USER_MGT_URLS = { @@ -35,8 +35,10 @@ } OIDC_PROVIDER_CONFIG_RESPONSE = testutils.resource('oidc_provider_config.json') SAML_PROVIDER_CONFIG_RESPONSE = testutils.resource('saml_provider_config.json') -LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils.resource('list_oidc_provider_configs.json') -LIST_SAML_PROVIDER_CONFIGS_RESPONSE = testutils.resource('list_saml_provider_configs.json') +LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils.resource( + 'list_oidc_provider_configs.json') +LIST_SAML_PROVIDER_CONFIGS_RESPONSE = testutils.resource( + 'list_saml_provider_configs.json') CONFIG_NOT_FOUND_RESPONSE = """{ "error": { @@ -52,8 +54,10 @@ def user_mgt_app(request): monkeypatch = testutils.new_monkeypatch() if request.param['emulated']: monkeypatch.setenv(EMULATOR_HOST_ENV_VAR, AUTH_EMULATOR_HOST) - monkeypatch.setitem(USER_MGT_URLS, 'ID_TOOLKIT', EMULATED_ID_TOOLKIT_URL) - monkeypatch.setitem(USER_MGT_URLS, 'PREFIX', EMULATED_ID_TOOLKIT_URL + URL_PROJECT_SUFFIX) + monkeypatch.setitem(USER_MGT_URLS, 'ID_TOOLKIT', + EMULATED_ID_TOOLKIT_URL) + monkeypatch.setitem(USER_MGT_URLS, 'PREFIX', + EMULATED_ID_TOOLKIT_URL + URL_PROJECT_SUFFIX) app = firebase_admin.initialize_app(testutils.MockCredential(), name='providerConfig', options={'projectId': 'mock-project-id'}) yield app @@ -104,18 +108,22 @@ def test_get_invalid_provider_id(self, user_mgt_app, provider_id): assert str(excinfo.value).startswith('Invalid OIDC provider ID') def test_get(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) - provider_config = auth.get_oidc_provider_config('oidc.provider', app=user_mgt_app) + provider_config = auth.get_oidc_provider_config( + 'oidc.provider', app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}{1}'.format(USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs/oidc.provider') + assert req.url == '{0}{1}'.format( + USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs/oidc.provider') @pytest.mark.parametrize('invalid_opts', [ - {'provider_id': None}, {'provider_id': ''}, {'provider_id': 'saml.provider'}, + {'provider_id': None}, {'provider_id': ''}, { + 'provider_id': 'saml.provider'}, {'client_id': None}, {'client_id': ''}, {'issuer': None}, {'issuer': ''}, {'issuer': 'not a url'}, {'display_name': True}, @@ -133,7 +141,8 @@ def test_create_invalid_args(self, user_mgt_app, invalid_opts): auth.create_oidc_provider_config(**options, app=user_mgt_app) def test_create(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = auth.create_oidc_provider_config( **self.VALID_CREATE_OPTIONS, app=user_mgt_app) @@ -148,7 +157,8 @@ def test_create(self, user_mgt_app): assert got == self.OIDC_CONFIG_REQUEST def test_create_minimal(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) options = dict(self.VALID_CREATE_OPTIONS) del options['display_name'] del options['enabled'] @@ -161,7 +171,8 @@ def test_create_minimal(self, user_mgt_app): del want['clientSecret'] del want['responseType'] - provider_config = auth.create_oidc_provider_config(**options, app=user_mgt_app) + provider_config = auth.create_oidc_provider_config( + **options, app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -173,7 +184,8 @@ def test_create_minimal(self, user_mgt_app): assert got == want def test_create_empty_values(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) options = dict(self.VALID_CREATE_OPTIONS) options['display_name'] = '' options['enabled'] = False @@ -187,7 +199,8 @@ def test_create_empty_values(self, user_mgt_app): } del want['clientSecret'] - provider_config = auth.create_oidc_provider_config(**options, app=user_mgt_app) + provider_config = auth.create_oidc_provider_config( + **options, app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -200,7 +213,8 @@ def test_create_empty_values(self, user_mgt_app): @pytest.mark.parametrize('invalid_opts', [ {}, - {'provider_id': None}, {'provider_id': ''}, {'provider_id': 'saml.provider'}, + {'provider_id': None}, {'provider_id': ''}, { + 'provider_id': 'saml.provider'}, {'client_id': ''}, {'issuer': ''}, {'issuer': 'not a url'}, {'display_name': True}, @@ -218,7 +232,8 @@ def test_update_invalid_args(self, user_mgt_app, invalid_opts): auth.update_oidc_provider_config(**options, app=user_mgt_app) def test_update(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_oidc_provider_config( **self.VALID_CREATE_OPTIONS, app=user_mgt_app) @@ -235,7 +250,8 @@ def test_update(self, user_mgt_app): assert got == self.OIDC_CONFIG_REQUEST def test_update_minimal(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_oidc_provider_config( 'oidc.provider', display_name='oidcProviderName', app=user_mgt_app) @@ -250,7 +266,8 @@ def test_update_minimal(self, user_mgt_app): assert got == {'displayName': 'oidcProviderName'} def test_update_empty_values(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_oidc_provider_config( 'oidc.provider', display_name=auth.DELETE_ATTRIBUTE, enabled=False, @@ -264,7 +281,8 @@ def test_update_empty_values(self, user_mgt_app): assert req.url == '{0}/oauthIdpConfigs/oidc.provider?updateMask={1}'.format( USER_MGT_URLS['PREFIX'], ','.join(mask)) got = json.loads(req.body.decode()) - assert got == {'displayName': None, 'enabled': False, 'responseType': {'idToken': False}} + assert got == {'displayName': None, 'enabled': False, + 'responseType': {'idToken': False}} @pytest.mark.parametrize('provider_id', INVALID_PROVIDER_IDS + ['saml.provider']) def test_delete_invalid_provider_id(self, user_mgt_app, provider_id): @@ -281,7 +299,8 @@ def test_delete(self, user_mgt_app): assert len(recorder) == 1 req = recorder[0] assert req.method == 'DELETE' - assert req.url == '{0}{1}'.format(USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs/oidc.provider') + assert req.url == '{0}{1}'.format( + USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs/oidc.provider') @pytest.mark.parametrize('arg', [None, 'foo', list(), dict(), 0, -1, 101, False]) def test_invalid_max_results(self, user_mgt_app, arg): @@ -294,7 +313,8 @@ def test_invalid_page_token(self, user_mgt_app, arg): auth.list_oidc_provider_configs(page_token=arg, app=user_mgt_app) def test_list_single_page(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, LIST_OIDC_PROVIDER_CONFIGS_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, LIST_OIDC_PROVIDER_CONFIGS_RESPONSE) page = auth.list_oidc_provider_configs(app=user_mgt_app) self._assert_page(page) @@ -304,7 +324,8 @@ def test_list_single_page(self, user_mgt_app): assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}{1}'.format(USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs?pageSize=100') + assert req.url == '{0}{1}'.format( + USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs?pageSize=100') def test_list_multiple_pages(self, user_mgt_app): sample_response = json.loads(OIDC_PROVIDER_CONFIG_RESPONSE) @@ -315,18 +336,22 @@ def test_list_multiple_pages(self, user_mgt_app): 'oauthIdpConfigs': configs[:2], 'nextPageToken': 'token' } - recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) - page = auth.list_oidc_provider_configs(max_results=10, app=user_mgt_app) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, json.dumps(response)) + page = auth.list_oidc_provider_configs( + max_results=10, app=user_mgt_app) self._assert_page(page, next_page_token='token') assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}/oauthIdpConfigs?pageSize=10'.format(USER_MGT_URLS['PREFIX']) + assert req.url == '{0}/oauthIdpConfigs?pageSize=10'.format( + USER_MGT_URLS['PREFIX']) # Page 2 (also the last page) response = {'oauthIdpConfigs': configs[2:]} - recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, json.dumps(response)) page = page.get_next_page() self._assert_page(page, count=1, start=2) @@ -345,21 +370,25 @@ def test_paged_iteration(self, user_mgt_app): 'oauthIdpConfigs': configs[:2], 'nextPageToken': 'token' } - recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, json.dumps(response)) page = auth.list_oidc_provider_configs(app=user_mgt_app) iterator = page.iterate_all() for index in range(2): provider_config = next(iterator) - assert provider_config.provider_id == 'oidc.provider{0}'.format(index) + assert provider_config.provider_id == 'oidc.provider{0}'.format( + index) assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}/oauthIdpConfigs?pageSize=100'.format(USER_MGT_URLS['PREFIX']) + assert req.url == '{0}/oauthIdpConfigs?pageSize=100'.format( + USER_MGT_URLS['PREFIX']) # Page 2 (also the last page) response = {'oauthIdpConfigs': configs[2:]} - recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, json.dumps(response)) provider_config = next(iterator) assert provider_config.provider_id == 'oidc.provider2' @@ -384,7 +413,8 @@ def test_list_error(self, user_mgt_app): _instrument_provider_mgt(user_mgt_app, 500, '{"error":"test"}') with pytest.raises(exceptions.InternalError) as excinfo: auth.list_oidc_provider_configs(app=user_mgt_app) - assert str(excinfo.value) == 'Unexpected error response: {"error":"test"}' + assert str( + excinfo.value) == 'Unexpected error response: {"error":"test"}' def test_config_not_found(self, user_mgt_app): _instrument_provider_mgt(user_mgt_app, 500, CONFIG_NOT_FOUND_RESPONSE) @@ -411,7 +441,8 @@ def _assert_page(self, page, count=2, start=0, next_page_token=''): index = start assert len(page.provider_configs) == count for provider_config in page.provider_configs: - self._assert_provider_config(provider_config, want_id='oidc.provider{0}'.format(index)) + self._assert_provider_config( + provider_config, want_id='oidc.provider{0}'.format(index)) index += 1 if next_page_token: @@ -458,9 +489,11 @@ def test_get_invalid_provider_id(self, user_mgt_app, provider_id): assert str(excinfo.value).startswith('Invalid SAML provider ID') def test_get(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) - provider_config = auth.get_saml_provider_config('saml.provider', app=user_mgt_app) + provider_config = auth.get_saml_provider_config( + 'saml.provider', app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -470,13 +503,16 @@ def test_get(self, user_mgt_app): '/inboundSamlConfigs/saml.provider') @pytest.mark.parametrize('invalid_opts', [ - {'provider_id': None}, {'provider_id': ''}, {'provider_id': 'oidc.provider'}, + {'provider_id': None}, {'provider_id': ''}, { + 'provider_id': 'oidc.provider'}, {'idp_entity_id': None}, {'idp_entity_id': ''}, {'sso_url': None}, {'sso_url': ''}, {'sso_url': 'not a url'}, - {'x509_certificates': None}, {'x509_certificates': []}, {'x509_certificates': 'cert'}, + {'x509_certificates': None}, {'x509_certificates': []}, { + 'x509_certificates': 'cert'}, {'x509_certificates': [None]}, {'x509_certificates': ['foo', {}]}, {'rp_entity_id': None}, {'rp_entity_id': ''}, - {'callback_url': None}, {'callback_url': ''}, {'callback_url': 'not a url'}, + {'callback_url': None}, {'callback_url': ''}, { + 'callback_url': 'not a url'}, {'display_name': True}, {'enabled': 'true'}, ]) @@ -487,7 +523,8 @@ def test_create_invalid_args(self, user_mgt_app, invalid_opts): auth.create_saml_provider_config(**options, app=user_mgt_app) def test_create(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = auth.create_saml_provider_config( **self.VALID_CREATE_OPTIONS, app=user_mgt_app) @@ -502,7 +539,8 @@ def test_create(self, user_mgt_app): assert got == self.SAML_CONFIG_REQUEST def test_create_minimal(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) options = dict(self.VALID_CREATE_OPTIONS) del options['display_name'] del options['enabled'] @@ -510,7 +548,8 @@ def test_create_minimal(self, user_mgt_app): del want['displayName'] del want['enabled'] - provider_config = auth.create_saml_provider_config(**options, app=user_mgt_app) + provider_config = auth.create_saml_provider_config( + **options, app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -522,7 +561,8 @@ def test_create_minimal(self, user_mgt_app): assert got == want def test_create_empty_values(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) options = dict(self.VALID_CREATE_OPTIONS) options['display_name'] = '' options['enabled'] = False @@ -530,7 +570,8 @@ def test_create_empty_values(self, user_mgt_app): want['displayName'] = '' want['enabled'] = False - provider_config = auth.create_saml_provider_config(**options, app=user_mgt_app) + provider_config = auth.create_saml_provider_config( + **options, app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -543,7 +584,8 @@ def test_create_empty_values(self, user_mgt_app): @pytest.mark.parametrize('invalid_opts', [ {}, - {'provider_id': None}, {'provider_id': ''}, {'provider_id': 'oidc.provider'}, + {'provider_id': None}, {'provider_id': ''}, { + 'provider_id': 'oidc.provider'}, {'idp_entity_id': ''}, {'sso_url': ''}, {'sso_url': 'not a url'}, {'x509_certificates': []}, {'x509_certificates': 'cert'}, @@ -560,7 +602,8 @@ def test_update_invalid_args(self, user_mgt_app, invalid_opts): auth.update_saml_provider_config(**options, app=user_mgt_app) def test_update(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_saml_provider_config( **self.VALID_CREATE_OPTIONS, app=user_mgt_app) @@ -579,7 +622,8 @@ def test_update(self, user_mgt_app): assert got == self.SAML_CONFIG_REQUEST def test_update_minimal(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_saml_provider_config( 'saml.provider', display_name='samlProviderName', app=user_mgt_app) @@ -594,7 +638,8 @@ def test_update_minimal(self, user_mgt_app): assert got == {'displayName': 'samlProviderName'} def test_update_empty_values(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_saml_provider_config( 'saml.provider', display_name=auth.DELETE_ATTRIBUTE, enabled=False, app=user_mgt_app) @@ -650,7 +695,8 @@ def test_invalid_page_token(self, user_mgt_app, arg): auth.list_saml_provider_configs(page_token=arg, app=user_mgt_app) def test_list_single_page(self, user_mgt_app): - recorder = _instrument_provider_mgt(user_mgt_app, 200, LIST_SAML_PROVIDER_CONFIGS_RESPONSE) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, LIST_SAML_PROVIDER_CONFIGS_RESPONSE) page = auth.list_saml_provider_configs(app=user_mgt_app) self._assert_page(page) @@ -672,18 +718,22 @@ def test_list_multiple_pages(self, user_mgt_app): 'inboundSamlConfigs': configs[:2], 'nextPageToken': 'token' } - recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) - page = auth.list_saml_provider_configs(max_results=10, app=user_mgt_app) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, json.dumps(response)) + page = auth.list_saml_provider_configs( + max_results=10, app=user_mgt_app) self._assert_page(page, next_page_token='token') assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}/inboundSamlConfigs?pageSize=10'.format(USER_MGT_URLS['PREFIX']) + assert req.url == '{0}/inboundSamlConfigs?pageSize=10'.format( + USER_MGT_URLS['PREFIX']) # Page 2 (also the last page) response = {'inboundSamlConfigs': configs[2:]} - recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, json.dumps(response)) page = page.get_next_page() self._assert_page(page, count=1, start=2) @@ -702,21 +752,25 @@ def test_paged_iteration(self, user_mgt_app): 'inboundSamlConfigs': configs[:2], 'nextPageToken': 'token' } - recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, json.dumps(response)) page = auth.list_saml_provider_configs(app=user_mgt_app) iterator = page.iterate_all() for index in range(2): provider_config = next(iterator) - assert provider_config.provider_id == 'saml.provider{0}'.format(index) + assert provider_config.provider_id == 'saml.provider{0}'.format( + index) assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}/inboundSamlConfigs?pageSize=100'.format(USER_MGT_URLS['PREFIX']) + assert req.url == '{0}/inboundSamlConfigs?pageSize=100'.format( + USER_MGT_URLS['PREFIX']) # Page 2 (also the last page) response = {'inboundSamlConfigs': configs[2:]} - recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt( + user_mgt_app, 200, json.dumps(response)) provider_config = next(iterator) assert provider_config.provider_id == 'saml.provider2' @@ -741,7 +795,8 @@ def test_list_error(self, user_mgt_app): _instrument_provider_mgt(user_mgt_app, 500, '{"error":"test"}') with pytest.raises(exceptions.InternalError) as excinfo: auth.list_saml_provider_configs(app=user_mgt_app) - assert str(excinfo.value) == 'Unexpected error response: {"error":"test"}' + assert str( + excinfo.value) == 'Unexpected error response: {"error":"test"}' def _assert_provider_config(self, provider_config, want_id='saml.provider'): assert isinstance(provider_config, auth.SAMLProviderConfig) @@ -759,7 +814,8 @@ def _assert_page(self, page, count=2, start=0, next_page_token=''): index = start assert len(page.provider_configs) == count for provider_config in page.provider_configs: - self._assert_provider_config(provider_config, want_id='saml.provider{0}'.format(index)) + self._assert_provider_config( + provider_config, want_id='saml.provider{0}'.format(index)) index += 1 if next_page_token: diff --git a/tests/test_tenant_mgt.py b/tests/test_tenant_mgt.py index f92dd2a83..2e1819662 100644 --- a/tests/test_tenant_mgt.py +++ b/tests/test_tenant_mgt.py @@ -101,15 +101,17 @@ } } -LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils.resource('list_oidc_provider_configs.json') -LIST_SAML_PROVIDER_CONFIGS_RESPONSE = testutils.resource('list_saml_provider_configs.json') +LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils.resource( + 'list_oidc_provider_configs.json') +LIST_SAML_PROVIDER_CONFIGS_RESPONSE = testutils.resource( + 'list_saml_provider_configs.json') INVALID_TENANT_IDS = [None, '', 0, 1, True, False, list(), tuple(), dict()] INVALID_BOOLEANS = ['', 1, 0, list(), tuple(), dict()] USER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v1/projects/mock-project-id' -PROVIDER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2beta1/projects/mock-project-id' -TENANT_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2beta1/projects/mock-project-id' +PROVIDER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2/projects/mock-project-id' +TENANT_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2/projects/mock-project-id' @pytest.fixture(scope='module') @@ -187,7 +189,8 @@ def test_invalid_tenant_id(self, tenant_id, tenant_mgt_app): assert str(excinfo.value).startswith('Invalid tenant ID') def test_get_tenant(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.get_tenant('tenant-id', app=tenant_mgt_app) _assert_tenant(tenant) @@ -213,13 +216,15 @@ class TestCreateTenant: @pytest.mark.parametrize('display_name', [True, False, 1, 0, list(), tuple(), dict()]) def test_invalid_display_name_type(self, display_name, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.create_tenant(display_name=display_name, app=tenant_mgt_app) + tenant_mgt.create_tenant( + display_name=display_name, app=tenant_mgt_app) assert str(excinfo.value).startswith('Invalid type for displayName') @pytest.mark.parametrize('display_name', ['', 'foo', '1test', 'foo bar', 'a'*21]) def test_invalid_display_name_value(self, display_name, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.create_tenant(display_name=display_name, app=tenant_mgt_app) + tenant_mgt.create_tenant( + display_name=display_name, app=tenant_mgt_app) assert str(excinfo.value).startswith('displayName must start') @pytest.mark.parametrize('allow', INVALID_BOOLEANS) @@ -227,17 +232,20 @@ def test_invalid_allow_password_sign_up(self, allow, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: tenant_mgt.create_tenant( display_name='test', allow_password_sign_up=allow, app=tenant_mgt_app) - assert str(excinfo.value).startswith('Invalid type for allowPasswordSignup') + assert str(excinfo.value).startswith( + 'Invalid type for allowPasswordSignup') @pytest.mark.parametrize('enable', INVALID_BOOLEANS) def test_invalid_enable_email_link_sign_in(self, enable, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: tenant_mgt.create_tenant( display_name='test', enable_email_link_sign_in=enable, app=tenant_mgt_app) - assert str(excinfo.value).startswith('Invalid type for enableEmailLinkSignin') + assert str(excinfo.value).startswith( + 'Invalid type for enableEmailLinkSignin') def test_create_tenant(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.create_tenant( display_name='My-Tenant', allow_password_sign_up=True, enable_email_link_sign_in=True, app=tenant_mgt_app) @@ -250,7 +258,8 @@ def test_create_tenant(self, tenant_mgt_app): }) def test_create_tenant_false_values(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.create_tenant( display_name='test', allow_password_sign_up=False, enable_email_link_sign_in=False, app=tenant_mgt_app) @@ -263,8 +272,10 @@ def test_create_tenant_false_values(self, tenant_mgt_app): }) def test_create_tenant_minimal(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) - tenant = tenant_mgt.create_tenant(display_name='test', app=tenant_mgt_app) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, GET_TENANT_RESPONSE) + tenant = tenant_mgt.create_tenant( + display_name='test', app=tenant_mgt_app) _assert_tenant(tenant) self._assert_request(recorder, {'displayName': 'test'}) @@ -294,41 +305,50 @@ class TestUpdateTenant: @pytest.mark.parametrize('tenant_id', INVALID_TENANT_IDS) def test_invalid_tenant_id(self, tenant_id, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.update_tenant(tenant_id, display_name='My Tenant', app=tenant_mgt_app) - assert str(excinfo.value).startswith('Tenant ID must be a non-empty string') + tenant_mgt.update_tenant( + tenant_id, display_name='My Tenant', app=tenant_mgt_app) + assert str(excinfo.value).startswith( + 'Tenant ID must be a non-empty string') @pytest.mark.parametrize('display_name', [True, False, 1, 0, list(), tuple(), dict()]) def test_invalid_display_name_type(self, display_name, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.update_tenant('tenant-id', display_name=display_name, app=tenant_mgt_app) + tenant_mgt.update_tenant( + 'tenant-id', display_name=display_name, app=tenant_mgt_app) assert str(excinfo.value).startswith('Invalid type for displayName') @pytest.mark.parametrize('display_name', ['', 'foo', '1test', 'foo bar', 'a'*21]) def test_invalid_display_name_value(self, display_name, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.update_tenant('tenant-id', display_name=display_name, app=tenant_mgt_app) + tenant_mgt.update_tenant( + 'tenant-id', display_name=display_name, app=tenant_mgt_app) assert str(excinfo.value).startswith('displayName must start') @pytest.mark.parametrize('allow', INVALID_BOOLEANS) def test_invalid_allow_password_sign_up(self, allow, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.update_tenant('tenant-id', allow_password_sign_up=allow, app=tenant_mgt_app) - assert str(excinfo.value).startswith('Invalid type for allowPasswordSignup') + tenant_mgt.update_tenant( + 'tenant-id', allow_password_sign_up=allow, app=tenant_mgt_app) + assert str(excinfo.value).startswith( + 'Invalid type for allowPasswordSignup') @pytest.mark.parametrize('enable', INVALID_BOOLEANS) def test_invalid_enable_email_link_sign_in(self, enable, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: tenant_mgt.update_tenant( 'tenant-id', enable_email_link_sign_in=enable, app=tenant_mgt_app) - assert str(excinfo.value).startswith('Invalid type for enableEmailLinkSignin') + assert str(excinfo.value).startswith( + 'Invalid type for enableEmailLinkSignin') def test_update_tenant_no_args(self, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: tenant_mgt.update_tenant('tenant-id', app=tenant_mgt_app) - assert str(excinfo.value).startswith('At least one parameter must be specified for update') + assert str(excinfo.value).startswith( + 'At least one parameter must be specified for update') def test_update_tenant(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.update_tenant( 'tenant-id', display_name='My-Tenant', allow_password_sign_up=True, enable_email_link_sign_in=True, app=tenant_mgt_app) @@ -343,7 +363,8 @@ def test_update_tenant(self, tenant_mgt_app): self._assert_request(recorder, body, mask) def test_update_tenant_false_values(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.update_tenant( 'tenant-id', allow_password_sign_up=False, enable_email_link_sign_in=False, app=tenant_mgt_app) @@ -357,7 +378,8 @@ def test_update_tenant_false_values(self, tenant_mgt_app): self._assert_request(recorder, body, mask) def test_update_tenant_minimal(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.update_tenant( 'tenant-id', display_name='My-Tenant', app=tenant_mgt_app) @@ -369,7 +391,8 @@ def test_update_tenant_minimal(self, tenant_mgt_app): def test_tenant_not_found_error(self, tenant_mgt_app): _instrument_tenant_mgt(tenant_mgt_app, 500, TENANT_NOT_FOUND_RESPONSE) with pytest.raises(tenant_mgt.TenantNotFoundError) as excinfo: - tenant_mgt.update_tenant('tenant', display_name='My-Tenant', app=tenant_mgt_app) + tenant_mgt.update_tenant( + 'tenant', display_name='My-Tenant', app=tenant_mgt_app) error_msg = 'No tenant found for the given identifier (TENANT_NOT_FOUND).' assert excinfo.value.code == exceptions.NOT_FOUND @@ -429,7 +452,8 @@ def test_invalid_page_token(self, tenant_mgt_app, arg): tenant_mgt.list_tenants(page_token=arg, app=tenant_mgt_app) def test_list_single_page(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) page = tenant_mgt.list_tenants(app=tenant_mgt_app) self._assert_tenants_page(page) assert page.next_page_token == '' @@ -441,7 +465,8 @@ def test_list_single_page(self, tenant_mgt_app): def test_list_multiple_pages(self, tenant_mgt_app): # Page 1 - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE_WITH_TOKEN) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, LIST_TENANTS_RESPONSE_WITH_TOKEN) page = tenant_mgt.list_tenants(app=tenant_mgt_app) assert len(page.tenants) == 3 assert page.next_page_token == 'token' @@ -449,18 +474,22 @@ def test_list_multiple_pages(self, tenant_mgt_app): self._assert_request(recorder) # Page 2 (also the last page) - response = {'tenants': [{'name': 'projects/mock-project-id/tenants/tenant3'}]} - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, json.dumps(response)) + response = {'tenants': [ + {'name': 'projects/mock-project-id/tenants/tenant3'}]} + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, json.dumps(response)) page = page.get_next_page() assert len(page.tenants) == 1 assert page.next_page_token == '' assert page.has_next_page is False assert page.get_next_page() is None - self._assert_request(recorder, {'pageSize': '100', 'pageToken': 'token'}) + self._assert_request( + recorder, {'pageSize': '100', 'pageToken': 'token'}) def test_list_tenants_paged_iteration(self, tenant_mgt_app): # Page 1 - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE_WITH_TOKEN) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, LIST_TENANTS_RESPONSE_WITH_TOKEN) page = tenant_mgt.list_tenants(app=tenant_mgt_app) iterator = page.iterate_all() for index in range(3): @@ -469,17 +498,21 @@ def test_list_tenants_paged_iteration(self, tenant_mgt_app): self._assert_request(recorder) # Page 2 (also the last page) - response = {'tenants': [{'name': 'projects/mock-project-id/tenants/tenant3'}]} - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, json.dumps(response)) + response = {'tenants': [ + {'name': 'projects/mock-project-id/tenants/tenant3'}]} + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, json.dumps(response)) tenant = next(iterator) assert tenant.tenant_id == 'tenant3' with pytest.raises(StopIteration): next(iterator) - self._assert_request(recorder, {'pageSize': '100', 'pageToken': 'token'}) + self._assert_request( + recorder, {'pageSize': '100', 'pageToken': 'token'}) def test_list_tenants_iterator_state(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) page = tenant_mgt.list_tenants(app=tenant_mgt_app) # Advance iterator. @@ -496,7 +529,8 @@ def test_list_tenants_iterator_state(self, tenant_mgt_app): self._assert_request(recorder) def test_list_tenants_stop_iteration(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) page = tenant_mgt.list_tenants(app=tenant_mgt_app) iterator = page.iterate_all() tenants = [tenant for tenant in iterator] @@ -515,22 +549,26 @@ def test_list_tenants_no_tenants_response(self, tenant_mgt_app): assert len(tenants) == 0 def test_list_tenants_with_max_results(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) page = tenant_mgt.list_tenants(max_results=50, app=tenant_mgt_app) self._assert_tenants_page(page) - self._assert_request(recorder, {'pageSize' : '50'}) + self._assert_request(recorder, {'pageSize': '50'}) def test_list_tenants_with_all_args(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) - page = tenant_mgt.list_tenants(page_token='foo', max_results=50, app=tenant_mgt_app) + _, recorder = _instrument_tenant_mgt( + tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + page = tenant_mgt.list_tenants( + page_token='foo', max_results=50, app=tenant_mgt_app) self._assert_tenants_page(page) - self._assert_request(recorder, {'pageToken' : 'foo', 'pageSize' : '50'}) + self._assert_request(recorder, {'pageToken': 'foo', 'pageSize': '50'}) def test_list_tenants_error(self, tenant_mgt_app): _instrument_tenant_mgt(tenant_mgt_app, 500, '{"error":"test"}') with pytest.raises(exceptions.InternalError) as excinfo: tenant_mgt.list_tenants(app=tenant_mgt_app) - assert str(excinfo.value) == 'Unexpected error response: {"error":"test"}' + assert str( + excinfo.value) == 'Unexpected error response: {"error":"test"}' def _assert_tenants_page(self, page): assert isinstance(page, tenant_mgt.ListTenantsPage) @@ -540,7 +578,7 @@ def _assert_tenants_page(self, page): def _assert_request(self, recorder, expected=None): if expected is None: - expected = {'pageSize' : '100'} + expected = {'pageSize': '100'} assert len(recorder) == 1 req = recorder[0] @@ -579,7 +617,8 @@ def test_get_user(self, tenant_mgt_app): assert isinstance(user, auth.UserRecord) assert user.uid == 'testuser' assert user.email == 'testuser@example.com' - self._assert_request(recorder, '/accounts:lookup', {'localId': ['testuser']}) + self._assert_request(recorder, '/accounts:lookup', + {'localId': ['testuser']}) def test_get_user_by_email(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) @@ -590,7 +629,8 @@ def test_get_user_by_email(self, tenant_mgt_app): assert isinstance(user, auth.UserRecord) assert user.uid == 'testuser' assert user.email == 'testuser@example.com' - self._assert_request(recorder, '/accounts:lookup', {'email': ['testuser@example.com']}) + self._assert_request(recorder, '/accounts:lookup', + {'email': ['testuser@example.com']}) def test_get_user_by_phone_number(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) @@ -601,7 +641,8 @@ def test_get_user_by_phone_number(self, tenant_mgt_app): assert isinstance(user, auth.UserRecord) assert user.uid == 'testuser' assert user.email == 'testuser@example.com' - self._assert_request(recorder, '/accounts:lookup', {'phoneNumber': ['+1234567890']}) + self._assert_request(recorder, '/accounts:lookup', + {'phoneNumber': ['+1234567890']}) def test_create_user(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) @@ -616,7 +657,8 @@ def test_update_user(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) recorder = _instrument_user_mgt(client, 200, '{"localId":"testuser"}') - uid = client._user_manager.update_user('testuser', email='testuser@example.com') + uid = client._user_manager.update_user( + 'testuser', email='testuser@example.com') assert uid == 'testuser' self._assert_request(recorder, '/accounts:update', { @@ -626,11 +668,13 @@ def test_update_user(self, tenant_mgt_app): def test_delete_user(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_user_mgt(client, 200, '{"kind":"deleteresponse"}') + recorder = _instrument_user_mgt( + client, 200, '{"kind":"deleteresponse"}') client.delete_user('testuser') - self._assert_request(recorder, '/accounts:delete', {'localId': 'testuser'}) + self._assert_request(recorder, '/accounts:delete', + {'localId': 'testuser'}) def test_set_custom_user_claims(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) @@ -698,7 +742,8 @@ def test_import_users(self, tenant_mgt_app): def test_generate_password_reset_link(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_user_mgt(client, 200, '{"oobLink":"https://testlink"}') + recorder = _instrument_user_mgt( + client, 200, '{"oobLink":"https://testlink"}') link = client.generate_password_reset_link('test@test.com') @@ -711,7 +756,8 @@ def test_generate_password_reset_link(self, tenant_mgt_app): def test_generate_email_verification_link(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_user_mgt(client, 200, '{"oobLink":"https://testlink"}') + recorder = _instrument_user_mgt( + client, 200, '{"oobLink":"https://testlink"}') link = client.generate_email_verification_link('test@test.com') @@ -724,10 +770,12 @@ def test_generate_email_verification_link(self, tenant_mgt_app): def test_generate_sign_in_with_email_link(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_user_mgt(client, 200, '{"oobLink":"https://testlink"}') + recorder = _instrument_user_mgt( + client, 200, '{"oobLink":"https://testlink"}') settings = auth.ActionCodeSettings(url='http://localhost') - link = client.generate_sign_in_with_email_link('test@test.com', settings) + link = client.generate_sign_in_with_email_link( + 'test@test.com', settings) assert link == 'https://testlink' self._assert_request(recorder, '/accounts:sendOobCode', { @@ -739,7 +787,8 @@ def test_generate_sign_in_with_email_link(self, tenant_mgt_app): def test_get_oidc_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt(client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = client.get_oidc_provider_config('oidc.provider') @@ -752,7 +801,8 @@ def test_get_oidc_provider_config(self, tenant_mgt_app): def test_create_oidc_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt(client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = client.create_oidc_provider_config( 'oidc.provider', client_id='CLIENT_ID', issuer='https://oidc.com/issuer', @@ -765,7 +815,8 @@ def test_create_oidc_provider_config(self, tenant_mgt_app): def test_update_oidc_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt(client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = client.update_oidc_provider_config( 'oidc.provider', client_id='CLIENT_ID', issuer='https://oidc.com/issuer', @@ -773,7 +824,8 @@ def test_update_oidc_provider_config(self, tenant_mgt_app): self._assert_oidc_provider_config(provider_config) mask = ['clientId', 'displayName', 'enabled', 'issuer'] - url = '/oauthIdpConfigs/oidc.provider?updateMask={0}'.format(','.join(mask)) + url = '/oauthIdpConfigs/oidc.provider?updateMask={0}'.format( + ','.join(mask)) self._assert_request( recorder, url, OIDC_PROVIDER_CONFIG_REQUEST, method='PATCH', prefix=PROVIDER_MGT_URL_PREFIX) @@ -792,7 +844,8 @@ def test_delete_oidc_provider_config(self, tenant_mgt_app): def test_list_oidc_provider_configs(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt(client, 200, LIST_OIDC_PROVIDER_CONFIGS_RESPONSE) + recorder = _instrument_provider_mgt( + client, 200, LIST_OIDC_PROVIDER_CONFIGS_RESPONSE) page = client.list_oidc_provider_configs() @@ -818,7 +871,8 @@ def test_list_oidc_provider_configs(self, tenant_mgt_app): def test_get_saml_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt(client, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + client, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = client.get_saml_provider_config('saml.provider') @@ -831,7 +885,8 @@ def test_get_saml_provider_config(self, tenant_mgt_app): def test_create_saml_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt(client, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + client, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = client.create_saml_provider_config( 'saml.provider', idp_entity_id='IDP_ENTITY_ID', sso_url='https://example.com/login', @@ -846,7 +901,8 @@ def test_create_saml_provider_config(self, tenant_mgt_app): def test_update_saml_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt(client, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt( + client, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = client.update_saml_provider_config( 'saml.provider', idp_entity_id='IDP_ENTITY_ID', sso_url='https://example.com/login', @@ -859,7 +915,8 @@ def test_update_saml_provider_config(self, tenant_mgt_app): 'displayName', 'enabled', 'idpConfig.idpCertificates', 'idpConfig.idpEntityId', 'idpConfig.ssoUrl', 'spConfig.callbackUri', 'spConfig.spEntityId', ] - url = '/inboundSamlConfigs/saml.provider?updateMask={0}'.format(','.join(mask)) + url = '/inboundSamlConfigs/saml.provider?updateMask={0}'.format( + ','.join(mask)) self._assert_request( recorder, url, SAML_PROVIDER_CONFIG_REQUEST, method='PATCH', prefix=PROVIDER_MGT_URL_PREFIX) @@ -878,7 +935,8 @@ def test_delete_saml_provider_config(self, tenant_mgt_app): def test_list_saml_provider_configs(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt(client, 200, LIST_SAML_PROVIDER_CONFIGS_RESPONSE) + recorder = _instrument_provider_mgt( + client, 200, LIST_SAML_PROVIDER_CONFIGS_RESPONSE) page = client.list_saml_provider_configs() @@ -949,7 +1007,8 @@ def test_valid_token(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('test-tenant', app=tenant_mgt_app) client._token_verifier.request = test_token_gen.MOCK_REQUEST - claims = client.verify_id_token(test_token_gen.TEST_ID_TOKEN_WITH_TENANT) + claims = client.verify_id_token( + test_token_gen.TEST_ID_TOKEN_WITH_TENANT) assert claims['admin'] is True assert claims['uid'] == claims['sub'] @@ -970,7 +1029,8 @@ def test_invalid_tenant_id(self, tenant_mgt_app): @pytest.fixture(scope='module') def tenant_aware_custom_token_app(): - cred = credentials.Certificate(testutils.resource_filename('service_account.json')) + cred = credentials.Certificate( + testutils.resource_filename('service_account.json')) app = firebase_admin.initialize_app(cred, name='tenantAwareCustomToken') yield app firebase_admin.delete_app(app) @@ -979,7 +1039,8 @@ def tenant_aware_custom_token_app(): class TestCreateCustomToken: def test_custom_token(self, tenant_aware_custom_token_app): - client = tenant_mgt.auth_for_tenant('test-tenant', app=tenant_aware_custom_token_app) + client = tenant_mgt.auth_for_tenant( + 'test-tenant', app=tenant_aware_custom_token_app) custom_token = client.create_custom_token('user1') @@ -987,7 +1048,8 @@ def test_custom_token(self, tenant_aware_custom_token_app): custom_token, expected_claims=None, tenant_id='test-tenant') def test_custom_token_with_claims(self, tenant_aware_custom_token_app): - client = tenant_mgt.auth_for_tenant('test-tenant', app=tenant_aware_custom_token_app) + client = tenant_mgt.auth_for_tenant( + 'test-tenant', app=tenant_aware_custom_token_app) claims = {'admin': True} custom_token = client.create_custom_token('user1', claims) From 22bd3c2742378d07940f12a1a1519764c596feb8 Mon Sep 17 00:00:00 2001 From: pragatimodi <110490169+pragatimodi@users.noreply.github.com> Date: Thu, 30 Mar 2023 17:59:48 +0000 Subject: [PATCH 2/3] Reverting auto formatting changes --- firebase_admin/_auth_client.py | 4 ++-- firebase_admin/_auth_providers.py | 2 +- firebase_admin/tenant_mgt.py | 2 +- tests/test_auth_providers.py | 4 ++-- tests/test_tenant_mgt.py | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/firebase_admin/_auth_client.py b/firebase_admin/_auth_client.py index eaf491f32..0fc9d2bee 100644 --- a/firebase_admin/_auth_client.py +++ b/firebase_admin/_auth_client.py @@ -50,7 +50,7 @@ def __init__(self, app, tenant_id=None): if emulator_host: base_url = 'http://{0}/identitytoolkit.googleapis.com'.format(emulator_host) endpoint_urls['v1'] = base_url + '/v1' - endpoint_urls['v2beta1'] = base_url + '/v2beta1' + endpoint_urls['v2'] = base_url + '/v2' credential = _utils.EmulatorAdminCredentials() self.emulated = True else: @@ -67,7 +67,7 @@ def __init__(self, app, tenant_id=None): self._user_manager = _user_mgt.UserManager( http_client, app.project_id, tenant_id, url_override=endpoint_urls.get('v1')) self._provider_manager = _auth_providers.ProviderConfigClient( - http_client, app.project_id, tenant_id, url_override=endpoint_urls.get('v2beta1')) + http_client, app.project_id, tenant_id, url_override=endpoint_urls.get('v2')) @property def tenant_id(self): diff --git a/firebase_admin/_auth_providers.py b/firebase_admin/_auth_providers.py index 31511f3c5..31894a4dc 100644 --- a/firebase_admin/_auth_providers.py +++ b/firebase_admin/_auth_providers.py @@ -176,7 +176,7 @@ def items(self): class ProviderConfigClient: """Client for managing Auth provider configurations.""" - PROVIDER_CONFIG_URL = 'https://identitytoolkit.googleapis.com/v2beta1' + PROVIDER_CONFIG_URL = 'https://identitytoolkit.googleapis.com/v2' def __init__(self, http_client, project_id, tenant_id=None, url_override=None): self.http_client = http_client diff --git a/firebase_admin/tenant_mgt.py b/firebase_admin/tenant_mgt.py index 396a819fb..8c53e30a1 100644 --- a/firebase_admin/tenant_mgt.py +++ b/firebase_admin/tenant_mgt.py @@ -232,7 +232,7 @@ def enable_email_link_sign_in(self): class _TenantManagementService: """Firebase tenant management service.""" - TENANT_MGT_URL = 'https://identitytoolkit.googleapis.com/v2beta1' + TENANT_MGT_URL = 'https://identitytoolkit.googleapis.com/v2' def __init__(self, app): credential = app.credential.get_credential() diff --git a/tests/test_auth_providers.py b/tests/test_auth_providers.py index b67a8eb96..a5716266c 100644 --- a/tests/test_auth_providers.py +++ b/tests/test_auth_providers.py @@ -23,10 +23,10 @@ from firebase_admin import exceptions from tests import testutils -ID_TOOLKIT_URL = 'https://identitytoolkit.googleapis.com/v2beta1' +ID_TOOLKIT_URL = 'https://identitytoolkit.googleapis.com/v2' EMULATOR_HOST_ENV_VAR = 'FIREBASE_AUTH_EMULATOR_HOST' AUTH_EMULATOR_HOST = 'localhost:9099' -EMULATED_ID_TOOLKIT_URL = 'http://{}/identitytoolkit.googleapis.com/v2beta1'.format( +EMULATED_ID_TOOLKIT_URL = 'http://{}/identitytoolkit.googleapis.com/v2'.format( AUTH_EMULATOR_HOST) URL_PROJECT_SUFFIX = '/projects/mock-project-id' USER_MGT_URLS = { diff --git a/tests/test_tenant_mgt.py b/tests/test_tenant_mgt.py index f92dd2a83..53b766239 100644 --- a/tests/test_tenant_mgt.py +++ b/tests/test_tenant_mgt.py @@ -108,8 +108,8 @@ INVALID_BOOLEANS = ['', 1, 0, list(), tuple(), dict()] USER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v1/projects/mock-project-id' -PROVIDER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2beta1/projects/mock-project-id' -TENANT_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2beta1/projects/mock-project-id' +PROVIDER_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2/projects/mock-project-id' +TENANT_MGT_URL_PREFIX = 'https://identitytoolkit.googleapis.com/v2/projects/mock-project-id' @pytest.fixture(scope='module') From a46516ca7162211a787ece20b500ae9db0efb5b9 Mon Sep 17 00:00:00 2001 From: pragatimodi <110490169+pragatimodi@users.noreply.github.com> Date: Thu, 30 Mar 2023 18:01:54 +0000 Subject: [PATCH 3/3] undo auto formatting --- firebase_admin/_auth_client.py | 10 +- firebase_admin/_auth_providers.py | 60 ++++------ firebase_admin/tenant_mgt.py | 12 +- tests/test_auth_providers.py | 168 +++++++++----------------- tests/test_tenant_mgt.py | 192 ++++++++++-------------------- 5 files changed, 149 insertions(+), 293 deletions(-) diff --git a/firebase_admin/_auth_client.py b/firebase_admin/_auth_client.py index c4b458b94..0fc9d2bee 100644 --- a/firebase_admin/_auth_client.py +++ b/firebase_admin/_auth_client.py @@ -39,8 +39,7 @@ def __init__(self, app, tenant_id=None): credential = None version_header = 'Python/Admin/{0}'.format(firebase_admin.__version__) - timeout = app.options.get( - 'httpTimeout', _http_client.DEFAULT_TIMEOUT_SECONDS) + timeout = app.options.get('httpTimeout', _http_client.DEFAULT_TIMEOUT_SECONDS) # Non-default endpoint URLs for emulator support are set in this dict later. endpoint_urls = {} self.emulated = False @@ -49,8 +48,7 @@ def __init__(self, app, tenant_id=None): # endpoint URLs to use the emulator. Additionally, use a fake credential. emulator_host = _auth_utils.get_emulator_host() if emulator_host: - base_url = 'http://{0}/identitytoolkit.googleapis.com'.format( - emulator_host) + base_url = 'http://{0}/identitytoolkit.googleapis.com'.format(emulator_host) endpoint_urls['v1'] = base_url + '/v1' endpoint_urls['v2'] = base_url + '/v2' credential = _utils.EmulatorAdminCredentials() @@ -286,7 +284,7 @@ def download(page_token, max_results): return self._user_manager.list_users(page_token, max_results) return _user_mgt.ListUsersPage(download, page_token, max_results) - def create_user(self, **kwargs): # pylint: disable=differing-param-doc + def create_user(self, **kwargs): # pylint: disable=differing-param-doc """Creates a new user account with the specified properties. Args: @@ -313,7 +311,7 @@ def create_user(self, **kwargs): # pylint: disable=differing-param-doc uid = self._user_manager.create_user(**kwargs) return self.get_user(uid=uid) - def update_user(self, uid, **kwargs): # pylint: disable=differing-param-doc + def update_user(self, uid, **kwargs): # pylint: disable=differing-param-doc """Updates an existing user account with the specified properties. Args: diff --git a/firebase_admin/_auth_providers.py b/firebase_admin/_auth_providers.py index 948d0ccc6..31894a4dc 100644 --- a/firebase_admin/_auth_providers.py +++ b/firebase_admin/_auth_providers.py @@ -187,8 +187,7 @@ def __init__(self, http_client, project_id, tenant_id=None, url_override=None): def get_oidc_provider_config(self, provider_id): _validate_oidc_provider_id(provider_id) - body = self._make_request( - 'get', '/oauthIdpConfigs/{0}'.format(provider_id)) + body = self._make_request('get', '/oauthIdpConfigs/{0}'.format(provider_id)) return OIDCProviderConfig(body) def create_oidc_provider_config( @@ -201,8 +200,7 @@ def create_oidc_provider_config( 'issuer': _validate_url(issuer, 'issuer'), } if display_name is not None: - req['displayName'] = _auth_utils.validate_string( - display_name, 'display_name') + req['displayName'] = _auth_utils.validate_string(display_name, 'display_name') if enabled is not None: req['enabled'] = _auth_utils.validate_boolean(enabled, 'enabled') @@ -216,14 +214,12 @@ def create_oidc_provider_config( response_type['code'] = _auth_utils.validate_boolean( code_response_type, 'code_response_type') if code_response_type: - req['clientSecret'] = _validate_non_empty_string( - client_secret, 'client_secret') + req['clientSecret'] = _validate_non_empty_string(client_secret, 'client_secret') if response_type: req['responseType'] = response_type params = 'oauthIdpConfigId={0}'.format(provider_id) - body = self._make_request( - 'post', '/oauthIdpConfigs', json=req, params=params) + body = self._make_request('post', '/oauthIdpConfigs', json=req, params=params) return OIDCProviderConfig(body) def update_oidc_provider_config( @@ -237,13 +233,11 @@ def update_oidc_provider_config( if display_name == _user_mgt.DELETE_ATTRIBUTE: req['displayName'] = None else: - req['displayName'] = _auth_utils.validate_string( - display_name, 'display_name') + req['displayName'] = _auth_utils.validate_string(display_name, 'display_name') if enabled is not None: req['enabled'] = _auth_utils.validate_boolean(enabled, 'enabled') if client_id: - req['clientId'] = _validate_non_empty_string( - client_id, 'client_id') + req['clientId'] = _validate_non_empty_string(client_id, 'client_id') if issuer: req['issuer'] = _validate_url(issuer, 'issuer') @@ -257,14 +251,12 @@ def update_oidc_provider_config( response_type['code'] = _auth_utils.validate_boolean( code_response_type, 'code_response_type') if code_response_type: - req['clientSecret'] = _validate_non_empty_string( - client_secret, 'client_secret') + req['clientSecret'] = _validate_non_empty_string(client_secret, 'client_secret') if response_type: req['responseType'] = response_type if not req: - raise ValueError( - 'At least one parameter must be specified for update.') + raise ValueError('At least one parameter must be specified for update.') update_mask = _auth_utils.build_update_mask(req) params = 'updateMask={0}'.format(','.join(update_mask)) @@ -274,8 +266,7 @@ def update_oidc_provider_config( def delete_oidc_provider_config(self, provider_id): _validate_oidc_provider_id(provider_id) - self._make_request( - 'delete', '/oauthIdpConfigs/{0}'.format(provider_id)) + self._make_request('delete', '/oauthIdpConfigs/{0}'.format(provider_id)) def list_oidc_provider_configs(self, page_token=None, max_results=MAX_LIST_CONFIGS_RESULTS): return _ListOIDCProviderConfigsPage( @@ -286,8 +277,7 @@ def _fetch_oidc_provider_configs(self, page_token=None, max_results=MAX_LIST_CON def get_saml_provider_config(self, provider_id): _validate_saml_provider_id(provider_id) - body = self._make_request( - 'get', '/inboundSamlConfigs/{0}'.format(provider_id)) + body = self._make_request('get', '/inboundSamlConfigs/{0}'.format(provider_id)) return SAMLProviderConfig(body) def create_saml_provider_config( @@ -307,14 +297,12 @@ def create_saml_provider_config( }, } if display_name is not None: - req['displayName'] = _auth_utils.validate_string( - display_name, 'display_name') + req['displayName'] = _auth_utils.validate_string(display_name, 'display_name') if enabled is not None: req['enabled'] = _auth_utils.validate_boolean(enabled, 'enabled') params = 'inboundSamlConfigId={0}'.format(provider_id) - body = self._make_request( - 'post', '/inboundSamlConfigs', json=req, params=params) + body = self._make_request('post', '/inboundSamlConfigs', json=req, params=params) return SAMLProviderConfig(body) def update_saml_provider_config( @@ -324,29 +312,24 @@ def update_saml_provider_config( _validate_saml_provider_id(provider_id) idp_config = {} if idp_entity_id is not None: - idp_config['idpEntityId'] = _validate_non_empty_string( - idp_entity_id, 'idp_entity_id') + idp_config['idpEntityId'] = _validate_non_empty_string(idp_entity_id, 'idp_entity_id') if sso_url is not None: idp_config['ssoUrl'] = _validate_url(sso_url, 'sso_url') if x509_certificates is not None: - idp_config['idpCertificates'] = _validate_x509_certificates( - x509_certificates) + idp_config['idpCertificates'] = _validate_x509_certificates(x509_certificates) sp_config = {} if rp_entity_id is not None: - sp_config['spEntityId'] = _validate_non_empty_string( - rp_entity_id, 'rp_entity_id') + sp_config['spEntityId'] = _validate_non_empty_string(rp_entity_id, 'rp_entity_id') if callback_url is not None: - sp_config['callbackUri'] = _validate_url( - callback_url, 'callback_url') + sp_config['callbackUri'] = _validate_url(callback_url, 'callback_url') req = {} if display_name is not None: if display_name == _user_mgt.DELETE_ATTRIBUTE: req['displayName'] = None else: - req['displayName'] = _auth_utils.validate_string( - display_name, 'display_name') + req['displayName'] = _auth_utils.validate_string(display_name, 'display_name') if enabled is not None: req['enabled'] = _auth_utils.validate_boolean(enabled, 'enabled') if idp_config: @@ -355,8 +338,7 @@ def update_saml_provider_config( req['spConfig'] = sp_config if not req: - raise ValueError( - 'At least one parameter must be specified for update.') + raise ValueError('At least one parameter must be specified for update.') update_mask = _auth_utils.build_update_mask(req) params = 'updateMask={0}'.format(','.join(update_mask)) @@ -366,8 +348,7 @@ def update_saml_provider_config( def delete_saml_provider_config(self, provider_id): _validate_saml_provider_id(provider_id) - self._make_request( - 'delete', '/inboundSamlConfigs/{0}'.format(provider_id)) + self._make_request('delete', '/inboundSamlConfigs/{0}'.format(provider_id)) def list_saml_provider_configs(self, page_token=None, max_results=MAX_LIST_CONFIGS_RESULTS): return _ListSAMLProviderConfigsPage( @@ -449,6 +430,5 @@ def _validate_x509_certificates(x509_certificates): if not isinstance(x509_certificates, list) or not x509_certificates: raise ValueError('x509_certificates must be a non-empty list.') if not all([isinstance(cert, str) and cert for cert in x509_certificates]): - raise ValueError( - 'x509_certificates must only contain non-empty strings.') + raise ValueError('x509_certificates must only contain non-empty strings.') return [{'x509Certificate': cert} for cert in x509_certificates] diff --git a/firebase_admin/tenant_mgt.py b/firebase_admin/tenant_mgt.py index 1d48faea7..8c53e30a1 100644 --- a/firebase_admin/tenant_mgt.py +++ b/firebase_admin/tenant_mgt.py @@ -183,7 +183,6 @@ def list_tenants(page_token=None, max_results=_MAX_LIST_TENANTS_RESULTS, app=Non FirebaseError: If an error occurs while retrieving the user accounts. """ tenant_mgt_service = _get_tenant_mgt_service(app) - def download(page_token, max_results): return tenant_mgt_service.list_tenants(page_token, max_results) return ListTenantsPage(download, page_token, max_results) @@ -206,8 +205,7 @@ class Tenant: def __init__(self, data): if not isinstance(data, dict): - raise ValueError( - 'Invalid data argument in Tenant constructor: {0}'.format(data)) + raise ValueError('Invalid data argument in Tenant constructor: {0}'.format(data)) if not 'name' in data: raise ValueError('Tenant response missing required keys.') @@ -239,8 +237,7 @@ class _TenantManagementService: def __init__(self, app): credential = app.credential.get_credential() version_header = 'Python/Admin/{0}'.format(firebase_admin.__version__) - base_url = '{0}/projects/{1}'.format( - self.TENANT_MGT_URL, app.project_id) + base_url = '{0}/projects/{1}'.format(self.TENANT_MGT_URL, app.project_id) self.app = app self.client = _http_client.JsonHttpClient( credential=credential, base_url=base_url, headers={'X-Client-Version': version_header}) @@ -259,7 +256,7 @@ def auth_for_tenant(self, tenant_id): client = auth.Client(self.app, tenant_id=tenant_id) self.tenant_clients[tenant_id] = client - return client + return client def get_tenant(self, tenant_id): """Gets the tenant corresponding to the given ``tenant_id``.""" @@ -311,8 +308,7 @@ def update_tenant( enable_email_link_sign_in, 'enableEmailLinkSignin') if not payload: - raise ValueError( - 'At least one parameter must be specified for update.') + raise ValueError('At least one parameter must be specified for update.') url = '/tenants/{0}'.format(tenant_id) update_mask = ','.join(_auth_utils.build_update_mask(payload)) diff --git a/tests/test_auth_providers.py b/tests/test_auth_providers.py index 553cb5a12..a5716266c 100644 --- a/tests/test_auth_providers.py +++ b/tests/test_auth_providers.py @@ -35,10 +35,8 @@ } OIDC_PROVIDER_CONFIG_RESPONSE = testutils.resource('oidc_provider_config.json') SAML_PROVIDER_CONFIG_RESPONSE = testutils.resource('saml_provider_config.json') -LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils.resource( - 'list_oidc_provider_configs.json') -LIST_SAML_PROVIDER_CONFIGS_RESPONSE = testutils.resource( - 'list_saml_provider_configs.json') +LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils.resource('list_oidc_provider_configs.json') +LIST_SAML_PROVIDER_CONFIGS_RESPONSE = testutils.resource('list_saml_provider_configs.json') CONFIG_NOT_FOUND_RESPONSE = """{ "error": { @@ -54,10 +52,8 @@ def user_mgt_app(request): monkeypatch = testutils.new_monkeypatch() if request.param['emulated']: monkeypatch.setenv(EMULATOR_HOST_ENV_VAR, AUTH_EMULATOR_HOST) - monkeypatch.setitem(USER_MGT_URLS, 'ID_TOOLKIT', - EMULATED_ID_TOOLKIT_URL) - monkeypatch.setitem(USER_MGT_URLS, 'PREFIX', - EMULATED_ID_TOOLKIT_URL + URL_PROJECT_SUFFIX) + monkeypatch.setitem(USER_MGT_URLS, 'ID_TOOLKIT', EMULATED_ID_TOOLKIT_URL) + monkeypatch.setitem(USER_MGT_URLS, 'PREFIX', EMULATED_ID_TOOLKIT_URL + URL_PROJECT_SUFFIX) app = firebase_admin.initialize_app(testutils.MockCredential(), name='providerConfig', options={'projectId': 'mock-project-id'}) yield app @@ -108,22 +104,18 @@ def test_get_invalid_provider_id(self, user_mgt_app, provider_id): assert str(excinfo.value).startswith('Invalid OIDC provider ID') def test_get(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) - provider_config = auth.get_oidc_provider_config( - 'oidc.provider', app=user_mgt_app) + provider_config = auth.get_oidc_provider_config('oidc.provider', app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}{1}'.format( - USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs/oidc.provider') + assert req.url == '{0}{1}'.format(USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs/oidc.provider') @pytest.mark.parametrize('invalid_opts', [ - {'provider_id': None}, {'provider_id': ''}, { - 'provider_id': 'saml.provider'}, + {'provider_id': None}, {'provider_id': ''}, {'provider_id': 'saml.provider'}, {'client_id': None}, {'client_id': ''}, {'issuer': None}, {'issuer': ''}, {'issuer': 'not a url'}, {'display_name': True}, @@ -141,8 +133,7 @@ def test_create_invalid_args(self, user_mgt_app, invalid_opts): auth.create_oidc_provider_config(**options, app=user_mgt_app) def test_create(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = auth.create_oidc_provider_config( **self.VALID_CREATE_OPTIONS, app=user_mgt_app) @@ -157,8 +148,7 @@ def test_create(self, user_mgt_app): assert got == self.OIDC_CONFIG_REQUEST def test_create_minimal(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) options = dict(self.VALID_CREATE_OPTIONS) del options['display_name'] del options['enabled'] @@ -171,8 +161,7 @@ def test_create_minimal(self, user_mgt_app): del want['clientSecret'] del want['responseType'] - provider_config = auth.create_oidc_provider_config( - **options, app=user_mgt_app) + provider_config = auth.create_oidc_provider_config(**options, app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -184,8 +173,7 @@ def test_create_minimal(self, user_mgt_app): assert got == want def test_create_empty_values(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) options = dict(self.VALID_CREATE_OPTIONS) options['display_name'] = '' options['enabled'] = False @@ -199,8 +187,7 @@ def test_create_empty_values(self, user_mgt_app): } del want['clientSecret'] - provider_config = auth.create_oidc_provider_config( - **options, app=user_mgt_app) + provider_config = auth.create_oidc_provider_config(**options, app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -213,8 +200,7 @@ def test_create_empty_values(self, user_mgt_app): @pytest.mark.parametrize('invalid_opts', [ {}, - {'provider_id': None}, {'provider_id': ''}, { - 'provider_id': 'saml.provider'}, + {'provider_id': None}, {'provider_id': ''}, {'provider_id': 'saml.provider'}, {'client_id': ''}, {'issuer': ''}, {'issuer': 'not a url'}, {'display_name': True}, @@ -232,8 +218,7 @@ def test_update_invalid_args(self, user_mgt_app, invalid_opts): auth.update_oidc_provider_config(**options, app=user_mgt_app) def test_update(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_oidc_provider_config( **self.VALID_CREATE_OPTIONS, app=user_mgt_app) @@ -250,8 +235,7 @@ def test_update(self, user_mgt_app): assert got == self.OIDC_CONFIG_REQUEST def test_update_minimal(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_oidc_provider_config( 'oidc.provider', display_name='oidcProviderName', app=user_mgt_app) @@ -266,8 +250,7 @@ def test_update_minimal(self, user_mgt_app): assert got == {'displayName': 'oidcProviderName'} def test_update_empty_values(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_oidc_provider_config( 'oidc.provider', display_name=auth.DELETE_ATTRIBUTE, enabled=False, @@ -281,8 +264,7 @@ def test_update_empty_values(self, user_mgt_app): assert req.url == '{0}/oauthIdpConfigs/oidc.provider?updateMask={1}'.format( USER_MGT_URLS['PREFIX'], ','.join(mask)) got = json.loads(req.body.decode()) - assert got == {'displayName': None, 'enabled': False, - 'responseType': {'idToken': False}} + assert got == {'displayName': None, 'enabled': False, 'responseType': {'idToken': False}} @pytest.mark.parametrize('provider_id', INVALID_PROVIDER_IDS + ['saml.provider']) def test_delete_invalid_provider_id(self, user_mgt_app, provider_id): @@ -299,8 +281,7 @@ def test_delete(self, user_mgt_app): assert len(recorder) == 1 req = recorder[0] assert req.method == 'DELETE' - assert req.url == '{0}{1}'.format( - USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs/oidc.provider') + assert req.url == '{0}{1}'.format(USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs/oidc.provider') @pytest.mark.parametrize('arg', [None, 'foo', list(), dict(), 0, -1, 101, False]) def test_invalid_max_results(self, user_mgt_app, arg): @@ -313,8 +294,7 @@ def test_invalid_page_token(self, user_mgt_app, arg): auth.list_oidc_provider_configs(page_token=arg, app=user_mgt_app) def test_list_single_page(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, LIST_OIDC_PROVIDER_CONFIGS_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, LIST_OIDC_PROVIDER_CONFIGS_RESPONSE) page = auth.list_oidc_provider_configs(app=user_mgt_app) self._assert_page(page) @@ -324,8 +304,7 @@ def test_list_single_page(self, user_mgt_app): assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}{1}'.format( - USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs?pageSize=100') + assert req.url == '{0}{1}'.format(USER_MGT_URLS['PREFIX'], '/oauthIdpConfigs?pageSize=100') def test_list_multiple_pages(self, user_mgt_app): sample_response = json.loads(OIDC_PROVIDER_CONFIG_RESPONSE) @@ -336,22 +315,18 @@ def test_list_multiple_pages(self, user_mgt_app): 'oauthIdpConfigs': configs[:2], 'nextPageToken': 'token' } - recorder = _instrument_provider_mgt( - user_mgt_app, 200, json.dumps(response)) - page = auth.list_oidc_provider_configs( - max_results=10, app=user_mgt_app) + recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) + page = auth.list_oidc_provider_configs(max_results=10, app=user_mgt_app) self._assert_page(page, next_page_token='token') assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}/oauthIdpConfigs?pageSize=10'.format( - USER_MGT_URLS['PREFIX']) + assert req.url == '{0}/oauthIdpConfigs?pageSize=10'.format(USER_MGT_URLS['PREFIX']) # Page 2 (also the last page) response = {'oauthIdpConfigs': configs[2:]} - recorder = _instrument_provider_mgt( - user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) page = page.get_next_page() self._assert_page(page, count=1, start=2) @@ -370,25 +345,21 @@ def test_paged_iteration(self, user_mgt_app): 'oauthIdpConfigs': configs[:2], 'nextPageToken': 'token' } - recorder = _instrument_provider_mgt( - user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) page = auth.list_oidc_provider_configs(app=user_mgt_app) iterator = page.iterate_all() for index in range(2): provider_config = next(iterator) - assert provider_config.provider_id == 'oidc.provider{0}'.format( - index) + assert provider_config.provider_id == 'oidc.provider{0}'.format(index) assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}/oauthIdpConfigs?pageSize=100'.format( - USER_MGT_URLS['PREFIX']) + assert req.url == '{0}/oauthIdpConfigs?pageSize=100'.format(USER_MGT_URLS['PREFIX']) # Page 2 (also the last page) response = {'oauthIdpConfigs': configs[2:]} - recorder = _instrument_provider_mgt( - user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) provider_config = next(iterator) assert provider_config.provider_id == 'oidc.provider2' @@ -413,8 +384,7 @@ def test_list_error(self, user_mgt_app): _instrument_provider_mgt(user_mgt_app, 500, '{"error":"test"}') with pytest.raises(exceptions.InternalError) as excinfo: auth.list_oidc_provider_configs(app=user_mgt_app) - assert str( - excinfo.value) == 'Unexpected error response: {"error":"test"}' + assert str(excinfo.value) == 'Unexpected error response: {"error":"test"}' def test_config_not_found(self, user_mgt_app): _instrument_provider_mgt(user_mgt_app, 500, CONFIG_NOT_FOUND_RESPONSE) @@ -441,8 +411,7 @@ def _assert_page(self, page, count=2, start=0, next_page_token=''): index = start assert len(page.provider_configs) == count for provider_config in page.provider_configs: - self._assert_provider_config( - provider_config, want_id='oidc.provider{0}'.format(index)) + self._assert_provider_config(provider_config, want_id='oidc.provider{0}'.format(index)) index += 1 if next_page_token: @@ -489,11 +458,9 @@ def test_get_invalid_provider_id(self, user_mgt_app, provider_id): assert str(excinfo.value).startswith('Invalid SAML provider ID') def test_get(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) - provider_config = auth.get_saml_provider_config( - 'saml.provider', app=user_mgt_app) + provider_config = auth.get_saml_provider_config('saml.provider', app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -503,16 +470,13 @@ def test_get(self, user_mgt_app): '/inboundSamlConfigs/saml.provider') @pytest.mark.parametrize('invalid_opts', [ - {'provider_id': None}, {'provider_id': ''}, { - 'provider_id': 'oidc.provider'}, + {'provider_id': None}, {'provider_id': ''}, {'provider_id': 'oidc.provider'}, {'idp_entity_id': None}, {'idp_entity_id': ''}, {'sso_url': None}, {'sso_url': ''}, {'sso_url': 'not a url'}, - {'x509_certificates': None}, {'x509_certificates': []}, { - 'x509_certificates': 'cert'}, + {'x509_certificates': None}, {'x509_certificates': []}, {'x509_certificates': 'cert'}, {'x509_certificates': [None]}, {'x509_certificates': ['foo', {}]}, {'rp_entity_id': None}, {'rp_entity_id': ''}, - {'callback_url': None}, {'callback_url': ''}, { - 'callback_url': 'not a url'}, + {'callback_url': None}, {'callback_url': ''}, {'callback_url': 'not a url'}, {'display_name': True}, {'enabled': 'true'}, ]) @@ -523,8 +487,7 @@ def test_create_invalid_args(self, user_mgt_app, invalid_opts): auth.create_saml_provider_config(**options, app=user_mgt_app) def test_create(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = auth.create_saml_provider_config( **self.VALID_CREATE_OPTIONS, app=user_mgt_app) @@ -539,8 +502,7 @@ def test_create(self, user_mgt_app): assert got == self.SAML_CONFIG_REQUEST def test_create_minimal(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) options = dict(self.VALID_CREATE_OPTIONS) del options['display_name'] del options['enabled'] @@ -548,8 +510,7 @@ def test_create_minimal(self, user_mgt_app): del want['displayName'] del want['enabled'] - provider_config = auth.create_saml_provider_config( - **options, app=user_mgt_app) + provider_config = auth.create_saml_provider_config(**options, app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -561,8 +522,7 @@ def test_create_minimal(self, user_mgt_app): assert got == want def test_create_empty_values(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) options = dict(self.VALID_CREATE_OPTIONS) options['display_name'] = '' options['enabled'] = False @@ -570,8 +530,7 @@ def test_create_empty_values(self, user_mgt_app): want['displayName'] = '' want['enabled'] = False - provider_config = auth.create_saml_provider_config( - **options, app=user_mgt_app) + provider_config = auth.create_saml_provider_config(**options, app=user_mgt_app) self._assert_provider_config(provider_config) assert len(recorder) == 1 @@ -584,8 +543,7 @@ def test_create_empty_values(self, user_mgt_app): @pytest.mark.parametrize('invalid_opts', [ {}, - {'provider_id': None}, {'provider_id': ''}, { - 'provider_id': 'oidc.provider'}, + {'provider_id': None}, {'provider_id': ''}, {'provider_id': 'oidc.provider'}, {'idp_entity_id': ''}, {'sso_url': ''}, {'sso_url': 'not a url'}, {'x509_certificates': []}, {'x509_certificates': 'cert'}, @@ -602,8 +560,7 @@ def test_update_invalid_args(self, user_mgt_app, invalid_opts): auth.update_saml_provider_config(**options, app=user_mgt_app) def test_update(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_saml_provider_config( **self.VALID_CREATE_OPTIONS, app=user_mgt_app) @@ -622,8 +579,7 @@ def test_update(self, user_mgt_app): assert got == self.SAML_CONFIG_REQUEST def test_update_minimal(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_saml_provider_config( 'saml.provider', display_name='samlProviderName', app=user_mgt_app) @@ -638,8 +594,7 @@ def test_update_minimal(self, user_mgt_app): assert got == {'displayName': 'samlProviderName'} def test_update_empty_values(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = auth.update_saml_provider_config( 'saml.provider', display_name=auth.DELETE_ATTRIBUTE, enabled=False, app=user_mgt_app) @@ -695,8 +650,7 @@ def test_invalid_page_token(self, user_mgt_app, arg): auth.list_saml_provider_configs(page_token=arg, app=user_mgt_app) def test_list_single_page(self, user_mgt_app): - recorder = _instrument_provider_mgt( - user_mgt_app, 200, LIST_SAML_PROVIDER_CONFIGS_RESPONSE) + recorder = _instrument_provider_mgt(user_mgt_app, 200, LIST_SAML_PROVIDER_CONFIGS_RESPONSE) page = auth.list_saml_provider_configs(app=user_mgt_app) self._assert_page(page) @@ -718,22 +672,18 @@ def test_list_multiple_pages(self, user_mgt_app): 'inboundSamlConfigs': configs[:2], 'nextPageToken': 'token' } - recorder = _instrument_provider_mgt( - user_mgt_app, 200, json.dumps(response)) - page = auth.list_saml_provider_configs( - max_results=10, app=user_mgt_app) + recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) + page = auth.list_saml_provider_configs(max_results=10, app=user_mgt_app) self._assert_page(page, next_page_token='token') assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}/inboundSamlConfigs?pageSize=10'.format( - USER_MGT_URLS['PREFIX']) + assert req.url == '{0}/inboundSamlConfigs?pageSize=10'.format(USER_MGT_URLS['PREFIX']) # Page 2 (also the last page) response = {'inboundSamlConfigs': configs[2:]} - recorder = _instrument_provider_mgt( - user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) page = page.get_next_page() self._assert_page(page, count=1, start=2) @@ -752,25 +702,21 @@ def test_paged_iteration(self, user_mgt_app): 'inboundSamlConfigs': configs[:2], 'nextPageToken': 'token' } - recorder = _instrument_provider_mgt( - user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) page = auth.list_saml_provider_configs(app=user_mgt_app) iterator = page.iterate_all() for index in range(2): provider_config = next(iterator) - assert provider_config.provider_id == 'saml.provider{0}'.format( - index) + assert provider_config.provider_id == 'saml.provider{0}'.format(index) assert len(recorder) == 1 req = recorder[0] assert req.method == 'GET' - assert req.url == '{0}/inboundSamlConfigs?pageSize=100'.format( - USER_MGT_URLS['PREFIX']) + assert req.url == '{0}/inboundSamlConfigs?pageSize=100'.format(USER_MGT_URLS['PREFIX']) # Page 2 (also the last page) response = {'inboundSamlConfigs': configs[2:]} - recorder = _instrument_provider_mgt( - user_mgt_app, 200, json.dumps(response)) + recorder = _instrument_provider_mgt(user_mgt_app, 200, json.dumps(response)) provider_config = next(iterator) assert provider_config.provider_id == 'saml.provider2' @@ -795,8 +741,7 @@ def test_list_error(self, user_mgt_app): _instrument_provider_mgt(user_mgt_app, 500, '{"error":"test"}') with pytest.raises(exceptions.InternalError) as excinfo: auth.list_saml_provider_configs(app=user_mgt_app) - assert str( - excinfo.value) == 'Unexpected error response: {"error":"test"}' + assert str(excinfo.value) == 'Unexpected error response: {"error":"test"}' def _assert_provider_config(self, provider_config, want_id='saml.provider'): assert isinstance(provider_config, auth.SAMLProviderConfig) @@ -814,8 +759,7 @@ def _assert_page(self, page, count=2, start=0, next_page_token=''): index = start assert len(page.provider_configs) == count for provider_config in page.provider_configs: - self._assert_provider_config( - provider_config, want_id='saml.provider{0}'.format(index)) + self._assert_provider_config(provider_config, want_id='saml.provider{0}'.format(index)) index += 1 if next_page_token: diff --git a/tests/test_tenant_mgt.py b/tests/test_tenant_mgt.py index 2e1819662..53b766239 100644 --- a/tests/test_tenant_mgt.py +++ b/tests/test_tenant_mgt.py @@ -101,10 +101,8 @@ } } -LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils.resource( - 'list_oidc_provider_configs.json') -LIST_SAML_PROVIDER_CONFIGS_RESPONSE = testutils.resource( - 'list_saml_provider_configs.json') +LIST_OIDC_PROVIDER_CONFIGS_RESPONSE = testutils.resource('list_oidc_provider_configs.json') +LIST_SAML_PROVIDER_CONFIGS_RESPONSE = testutils.resource('list_saml_provider_configs.json') INVALID_TENANT_IDS = [None, '', 0, 1, True, False, list(), tuple(), dict()] INVALID_BOOLEANS = ['', 1, 0, list(), tuple(), dict()] @@ -189,8 +187,7 @@ def test_invalid_tenant_id(self, tenant_id, tenant_mgt_app): assert str(excinfo.value).startswith('Invalid tenant ID') def test_get_tenant(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.get_tenant('tenant-id', app=tenant_mgt_app) _assert_tenant(tenant) @@ -216,15 +213,13 @@ class TestCreateTenant: @pytest.mark.parametrize('display_name', [True, False, 1, 0, list(), tuple(), dict()]) def test_invalid_display_name_type(self, display_name, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.create_tenant( - display_name=display_name, app=tenant_mgt_app) + tenant_mgt.create_tenant(display_name=display_name, app=tenant_mgt_app) assert str(excinfo.value).startswith('Invalid type for displayName') @pytest.mark.parametrize('display_name', ['', 'foo', '1test', 'foo bar', 'a'*21]) def test_invalid_display_name_value(self, display_name, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.create_tenant( - display_name=display_name, app=tenant_mgt_app) + tenant_mgt.create_tenant(display_name=display_name, app=tenant_mgt_app) assert str(excinfo.value).startswith('displayName must start') @pytest.mark.parametrize('allow', INVALID_BOOLEANS) @@ -232,20 +227,17 @@ def test_invalid_allow_password_sign_up(self, allow, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: tenant_mgt.create_tenant( display_name='test', allow_password_sign_up=allow, app=tenant_mgt_app) - assert str(excinfo.value).startswith( - 'Invalid type for allowPasswordSignup') + assert str(excinfo.value).startswith('Invalid type for allowPasswordSignup') @pytest.mark.parametrize('enable', INVALID_BOOLEANS) def test_invalid_enable_email_link_sign_in(self, enable, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: tenant_mgt.create_tenant( display_name='test', enable_email_link_sign_in=enable, app=tenant_mgt_app) - assert str(excinfo.value).startswith( - 'Invalid type for enableEmailLinkSignin') + assert str(excinfo.value).startswith('Invalid type for enableEmailLinkSignin') def test_create_tenant(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.create_tenant( display_name='My-Tenant', allow_password_sign_up=True, enable_email_link_sign_in=True, app=tenant_mgt_app) @@ -258,8 +250,7 @@ def test_create_tenant(self, tenant_mgt_app): }) def test_create_tenant_false_values(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.create_tenant( display_name='test', allow_password_sign_up=False, enable_email_link_sign_in=False, app=tenant_mgt_app) @@ -272,10 +263,8 @@ def test_create_tenant_false_values(self, tenant_mgt_app): }) def test_create_tenant_minimal(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, GET_TENANT_RESPONSE) - tenant = tenant_mgt.create_tenant( - display_name='test', app=tenant_mgt_app) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) + tenant = tenant_mgt.create_tenant(display_name='test', app=tenant_mgt_app) _assert_tenant(tenant) self._assert_request(recorder, {'displayName': 'test'}) @@ -305,50 +294,41 @@ class TestUpdateTenant: @pytest.mark.parametrize('tenant_id', INVALID_TENANT_IDS) def test_invalid_tenant_id(self, tenant_id, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.update_tenant( - tenant_id, display_name='My Tenant', app=tenant_mgt_app) - assert str(excinfo.value).startswith( - 'Tenant ID must be a non-empty string') + tenant_mgt.update_tenant(tenant_id, display_name='My Tenant', app=tenant_mgt_app) + assert str(excinfo.value).startswith('Tenant ID must be a non-empty string') @pytest.mark.parametrize('display_name', [True, False, 1, 0, list(), tuple(), dict()]) def test_invalid_display_name_type(self, display_name, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.update_tenant( - 'tenant-id', display_name=display_name, app=tenant_mgt_app) + tenant_mgt.update_tenant('tenant-id', display_name=display_name, app=tenant_mgt_app) assert str(excinfo.value).startswith('Invalid type for displayName') @pytest.mark.parametrize('display_name', ['', 'foo', '1test', 'foo bar', 'a'*21]) def test_invalid_display_name_value(self, display_name, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.update_tenant( - 'tenant-id', display_name=display_name, app=tenant_mgt_app) + tenant_mgt.update_tenant('tenant-id', display_name=display_name, app=tenant_mgt_app) assert str(excinfo.value).startswith('displayName must start') @pytest.mark.parametrize('allow', INVALID_BOOLEANS) def test_invalid_allow_password_sign_up(self, allow, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: - tenant_mgt.update_tenant( - 'tenant-id', allow_password_sign_up=allow, app=tenant_mgt_app) - assert str(excinfo.value).startswith( - 'Invalid type for allowPasswordSignup') + tenant_mgt.update_tenant('tenant-id', allow_password_sign_up=allow, app=tenant_mgt_app) + assert str(excinfo.value).startswith('Invalid type for allowPasswordSignup') @pytest.mark.parametrize('enable', INVALID_BOOLEANS) def test_invalid_enable_email_link_sign_in(self, enable, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: tenant_mgt.update_tenant( 'tenant-id', enable_email_link_sign_in=enable, app=tenant_mgt_app) - assert str(excinfo.value).startswith( - 'Invalid type for enableEmailLinkSignin') + assert str(excinfo.value).startswith('Invalid type for enableEmailLinkSignin') def test_update_tenant_no_args(self, tenant_mgt_app): with pytest.raises(ValueError) as excinfo: tenant_mgt.update_tenant('tenant-id', app=tenant_mgt_app) - assert str(excinfo.value).startswith( - 'At least one parameter must be specified for update') + assert str(excinfo.value).startswith('At least one parameter must be specified for update') def test_update_tenant(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.update_tenant( 'tenant-id', display_name='My-Tenant', allow_password_sign_up=True, enable_email_link_sign_in=True, app=tenant_mgt_app) @@ -363,8 +343,7 @@ def test_update_tenant(self, tenant_mgt_app): self._assert_request(recorder, body, mask) def test_update_tenant_false_values(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.update_tenant( 'tenant-id', allow_password_sign_up=False, enable_email_link_sign_in=False, app=tenant_mgt_app) @@ -378,8 +357,7 @@ def test_update_tenant_false_values(self, tenant_mgt_app): self._assert_request(recorder, body, mask) def test_update_tenant_minimal(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, GET_TENANT_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, GET_TENANT_RESPONSE) tenant = tenant_mgt.update_tenant( 'tenant-id', display_name='My-Tenant', app=tenant_mgt_app) @@ -391,8 +369,7 @@ def test_update_tenant_minimal(self, tenant_mgt_app): def test_tenant_not_found_error(self, tenant_mgt_app): _instrument_tenant_mgt(tenant_mgt_app, 500, TENANT_NOT_FOUND_RESPONSE) with pytest.raises(tenant_mgt.TenantNotFoundError) as excinfo: - tenant_mgt.update_tenant( - 'tenant', display_name='My-Tenant', app=tenant_mgt_app) + tenant_mgt.update_tenant('tenant', display_name='My-Tenant', app=tenant_mgt_app) error_msg = 'No tenant found for the given identifier (TENANT_NOT_FOUND).' assert excinfo.value.code == exceptions.NOT_FOUND @@ -452,8 +429,7 @@ def test_invalid_page_token(self, tenant_mgt_app, arg): tenant_mgt.list_tenants(page_token=arg, app=tenant_mgt_app) def test_list_single_page(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) page = tenant_mgt.list_tenants(app=tenant_mgt_app) self._assert_tenants_page(page) assert page.next_page_token == '' @@ -465,8 +441,7 @@ def test_list_single_page(self, tenant_mgt_app): def test_list_multiple_pages(self, tenant_mgt_app): # Page 1 - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, LIST_TENANTS_RESPONSE_WITH_TOKEN) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE_WITH_TOKEN) page = tenant_mgt.list_tenants(app=tenant_mgt_app) assert len(page.tenants) == 3 assert page.next_page_token == 'token' @@ -474,22 +449,18 @@ def test_list_multiple_pages(self, tenant_mgt_app): self._assert_request(recorder) # Page 2 (also the last page) - response = {'tenants': [ - {'name': 'projects/mock-project-id/tenants/tenant3'}]} - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, json.dumps(response)) + response = {'tenants': [{'name': 'projects/mock-project-id/tenants/tenant3'}]} + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, json.dumps(response)) page = page.get_next_page() assert len(page.tenants) == 1 assert page.next_page_token == '' assert page.has_next_page is False assert page.get_next_page() is None - self._assert_request( - recorder, {'pageSize': '100', 'pageToken': 'token'}) + self._assert_request(recorder, {'pageSize': '100', 'pageToken': 'token'}) def test_list_tenants_paged_iteration(self, tenant_mgt_app): # Page 1 - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, LIST_TENANTS_RESPONSE_WITH_TOKEN) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE_WITH_TOKEN) page = tenant_mgt.list_tenants(app=tenant_mgt_app) iterator = page.iterate_all() for index in range(3): @@ -498,21 +469,17 @@ def test_list_tenants_paged_iteration(self, tenant_mgt_app): self._assert_request(recorder) # Page 2 (also the last page) - response = {'tenants': [ - {'name': 'projects/mock-project-id/tenants/tenant3'}]} - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, json.dumps(response)) + response = {'tenants': [{'name': 'projects/mock-project-id/tenants/tenant3'}]} + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, json.dumps(response)) tenant = next(iterator) assert tenant.tenant_id == 'tenant3' with pytest.raises(StopIteration): next(iterator) - self._assert_request( - recorder, {'pageSize': '100', 'pageToken': 'token'}) + self._assert_request(recorder, {'pageSize': '100', 'pageToken': 'token'}) def test_list_tenants_iterator_state(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) page = tenant_mgt.list_tenants(app=tenant_mgt_app) # Advance iterator. @@ -529,8 +496,7 @@ def test_list_tenants_iterator_state(self, tenant_mgt_app): self._assert_request(recorder) def test_list_tenants_stop_iteration(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) page = tenant_mgt.list_tenants(app=tenant_mgt_app) iterator = page.iterate_all() tenants = [tenant for tenant in iterator] @@ -549,26 +515,22 @@ def test_list_tenants_no_tenants_response(self, tenant_mgt_app): assert len(tenants) == 0 def test_list_tenants_with_max_results(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) page = tenant_mgt.list_tenants(max_results=50, app=tenant_mgt_app) self._assert_tenants_page(page) - self._assert_request(recorder, {'pageSize': '50'}) + self._assert_request(recorder, {'pageSize' : '50'}) def test_list_tenants_with_all_args(self, tenant_mgt_app): - _, recorder = _instrument_tenant_mgt( - tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) - page = tenant_mgt.list_tenants( - page_token='foo', max_results=50, app=tenant_mgt_app) + _, recorder = _instrument_tenant_mgt(tenant_mgt_app, 200, LIST_TENANTS_RESPONSE) + page = tenant_mgt.list_tenants(page_token='foo', max_results=50, app=tenant_mgt_app) self._assert_tenants_page(page) - self._assert_request(recorder, {'pageToken': 'foo', 'pageSize': '50'}) + self._assert_request(recorder, {'pageToken' : 'foo', 'pageSize' : '50'}) def test_list_tenants_error(self, tenant_mgt_app): _instrument_tenant_mgt(tenant_mgt_app, 500, '{"error":"test"}') with pytest.raises(exceptions.InternalError) as excinfo: tenant_mgt.list_tenants(app=tenant_mgt_app) - assert str( - excinfo.value) == 'Unexpected error response: {"error":"test"}' + assert str(excinfo.value) == 'Unexpected error response: {"error":"test"}' def _assert_tenants_page(self, page): assert isinstance(page, tenant_mgt.ListTenantsPage) @@ -578,7 +540,7 @@ def _assert_tenants_page(self, page): def _assert_request(self, recorder, expected=None): if expected is None: - expected = {'pageSize': '100'} + expected = {'pageSize' : '100'} assert len(recorder) == 1 req = recorder[0] @@ -617,8 +579,7 @@ def test_get_user(self, tenant_mgt_app): assert isinstance(user, auth.UserRecord) assert user.uid == 'testuser' assert user.email == 'testuser@example.com' - self._assert_request(recorder, '/accounts:lookup', - {'localId': ['testuser']}) + self._assert_request(recorder, '/accounts:lookup', {'localId': ['testuser']}) def test_get_user_by_email(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) @@ -629,8 +590,7 @@ def test_get_user_by_email(self, tenant_mgt_app): assert isinstance(user, auth.UserRecord) assert user.uid == 'testuser' assert user.email == 'testuser@example.com' - self._assert_request(recorder, '/accounts:lookup', - {'email': ['testuser@example.com']}) + self._assert_request(recorder, '/accounts:lookup', {'email': ['testuser@example.com']}) def test_get_user_by_phone_number(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) @@ -641,8 +601,7 @@ def test_get_user_by_phone_number(self, tenant_mgt_app): assert isinstance(user, auth.UserRecord) assert user.uid == 'testuser' assert user.email == 'testuser@example.com' - self._assert_request(recorder, '/accounts:lookup', - {'phoneNumber': ['+1234567890']}) + self._assert_request(recorder, '/accounts:lookup', {'phoneNumber': ['+1234567890']}) def test_create_user(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) @@ -657,8 +616,7 @@ def test_update_user(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) recorder = _instrument_user_mgt(client, 200, '{"localId":"testuser"}') - uid = client._user_manager.update_user( - 'testuser', email='testuser@example.com') + uid = client._user_manager.update_user('testuser', email='testuser@example.com') assert uid == 'testuser' self._assert_request(recorder, '/accounts:update', { @@ -668,13 +626,11 @@ def test_update_user(self, tenant_mgt_app): def test_delete_user(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_user_mgt( - client, 200, '{"kind":"deleteresponse"}') + recorder = _instrument_user_mgt(client, 200, '{"kind":"deleteresponse"}') client.delete_user('testuser') - self._assert_request(recorder, '/accounts:delete', - {'localId': 'testuser'}) + self._assert_request(recorder, '/accounts:delete', {'localId': 'testuser'}) def test_set_custom_user_claims(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) @@ -742,8 +698,7 @@ def test_import_users(self, tenant_mgt_app): def test_generate_password_reset_link(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_user_mgt( - client, 200, '{"oobLink":"https://testlink"}') + recorder = _instrument_user_mgt(client, 200, '{"oobLink":"https://testlink"}') link = client.generate_password_reset_link('test@test.com') @@ -756,8 +711,7 @@ def test_generate_password_reset_link(self, tenant_mgt_app): def test_generate_email_verification_link(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_user_mgt( - client, 200, '{"oobLink":"https://testlink"}') + recorder = _instrument_user_mgt(client, 200, '{"oobLink":"https://testlink"}') link = client.generate_email_verification_link('test@test.com') @@ -770,12 +724,10 @@ def test_generate_email_verification_link(self, tenant_mgt_app): def test_generate_sign_in_with_email_link(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_user_mgt( - client, 200, '{"oobLink":"https://testlink"}') + recorder = _instrument_user_mgt(client, 200, '{"oobLink":"https://testlink"}') settings = auth.ActionCodeSettings(url='http://localhost') - link = client.generate_sign_in_with_email_link( - 'test@test.com', settings) + link = client.generate_sign_in_with_email_link('test@test.com', settings) assert link == 'https://testlink' self._assert_request(recorder, '/accounts:sendOobCode', { @@ -787,8 +739,7 @@ def test_generate_sign_in_with_email_link(self, tenant_mgt_app): def test_get_oidc_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt( - client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = client.get_oidc_provider_config('oidc.provider') @@ -801,8 +752,7 @@ def test_get_oidc_provider_config(self, tenant_mgt_app): def test_create_oidc_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt( - client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = client.create_oidc_provider_config( 'oidc.provider', client_id='CLIENT_ID', issuer='https://oidc.com/issuer', @@ -815,8 +765,7 @@ def test_create_oidc_provider_config(self, tenant_mgt_app): def test_update_oidc_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt( - client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(client, 200, OIDC_PROVIDER_CONFIG_RESPONSE) provider_config = client.update_oidc_provider_config( 'oidc.provider', client_id='CLIENT_ID', issuer='https://oidc.com/issuer', @@ -824,8 +773,7 @@ def test_update_oidc_provider_config(self, tenant_mgt_app): self._assert_oidc_provider_config(provider_config) mask = ['clientId', 'displayName', 'enabled', 'issuer'] - url = '/oauthIdpConfigs/oidc.provider?updateMask={0}'.format( - ','.join(mask)) + url = '/oauthIdpConfigs/oidc.provider?updateMask={0}'.format(','.join(mask)) self._assert_request( recorder, url, OIDC_PROVIDER_CONFIG_REQUEST, method='PATCH', prefix=PROVIDER_MGT_URL_PREFIX) @@ -844,8 +792,7 @@ def test_delete_oidc_provider_config(self, tenant_mgt_app): def test_list_oidc_provider_configs(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt( - client, 200, LIST_OIDC_PROVIDER_CONFIGS_RESPONSE) + recorder = _instrument_provider_mgt(client, 200, LIST_OIDC_PROVIDER_CONFIGS_RESPONSE) page = client.list_oidc_provider_configs() @@ -871,8 +818,7 @@ def test_list_oidc_provider_configs(self, tenant_mgt_app): def test_get_saml_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt( - client, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(client, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = client.get_saml_provider_config('saml.provider') @@ -885,8 +831,7 @@ def test_get_saml_provider_config(self, tenant_mgt_app): def test_create_saml_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt( - client, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(client, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = client.create_saml_provider_config( 'saml.provider', idp_entity_id='IDP_ENTITY_ID', sso_url='https://example.com/login', @@ -901,8 +846,7 @@ def test_create_saml_provider_config(self, tenant_mgt_app): def test_update_saml_provider_config(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt( - client, 200, SAML_PROVIDER_CONFIG_RESPONSE) + recorder = _instrument_provider_mgt(client, 200, SAML_PROVIDER_CONFIG_RESPONSE) provider_config = client.update_saml_provider_config( 'saml.provider', idp_entity_id='IDP_ENTITY_ID', sso_url='https://example.com/login', @@ -915,8 +859,7 @@ def test_update_saml_provider_config(self, tenant_mgt_app): 'displayName', 'enabled', 'idpConfig.idpCertificates', 'idpConfig.idpEntityId', 'idpConfig.ssoUrl', 'spConfig.callbackUri', 'spConfig.spEntityId', ] - url = '/inboundSamlConfigs/saml.provider?updateMask={0}'.format( - ','.join(mask)) + url = '/inboundSamlConfigs/saml.provider?updateMask={0}'.format(','.join(mask)) self._assert_request( recorder, url, SAML_PROVIDER_CONFIG_REQUEST, method='PATCH', prefix=PROVIDER_MGT_URL_PREFIX) @@ -935,8 +878,7 @@ def test_delete_saml_provider_config(self, tenant_mgt_app): def test_list_saml_provider_configs(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) - recorder = _instrument_provider_mgt( - client, 200, LIST_SAML_PROVIDER_CONFIGS_RESPONSE) + recorder = _instrument_provider_mgt(client, 200, LIST_SAML_PROVIDER_CONFIGS_RESPONSE) page = client.list_saml_provider_configs() @@ -1007,8 +949,7 @@ def test_valid_token(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('test-tenant', app=tenant_mgt_app) client._token_verifier.request = test_token_gen.MOCK_REQUEST - claims = client.verify_id_token( - test_token_gen.TEST_ID_TOKEN_WITH_TENANT) + claims = client.verify_id_token(test_token_gen.TEST_ID_TOKEN_WITH_TENANT) assert claims['admin'] is True assert claims['uid'] == claims['sub'] @@ -1029,8 +970,7 @@ def test_invalid_tenant_id(self, tenant_mgt_app): @pytest.fixture(scope='module') def tenant_aware_custom_token_app(): - cred = credentials.Certificate( - testutils.resource_filename('service_account.json')) + cred = credentials.Certificate(testutils.resource_filename('service_account.json')) app = firebase_admin.initialize_app(cred, name='tenantAwareCustomToken') yield app firebase_admin.delete_app(app) @@ -1039,8 +979,7 @@ def tenant_aware_custom_token_app(): class TestCreateCustomToken: def test_custom_token(self, tenant_aware_custom_token_app): - client = tenant_mgt.auth_for_tenant( - 'test-tenant', app=tenant_aware_custom_token_app) + client = tenant_mgt.auth_for_tenant('test-tenant', app=tenant_aware_custom_token_app) custom_token = client.create_custom_token('user1') @@ -1048,8 +987,7 @@ def test_custom_token(self, tenant_aware_custom_token_app): custom_token, expected_claims=None, tenant_id='test-tenant') def test_custom_token_with_claims(self, tenant_aware_custom_token_app): - client = tenant_mgt.auth_for_tenant( - 'test-tenant', app=tenant_aware_custom_token_app) + client = tenant_mgt.auth_for_tenant('test-tenant', app=tenant_aware_custom_token_app) claims = {'admin': True} custom_token = client.create_custom_token('user1', claims)