1- #-------------------------------------------------------------------------
1+ # -------------------------------------------------------------------------
22# Copyright (c) Microsoft Corporation. All rights reserved.
33# Licensed under the MIT License. See License.txt in the project root for
44# license information.
5- #--------------------------------------------------------------------------
5+ # --------------------------------------------------------------------------
66import functools
77import inspect
88import logging
99import os .path
1010import sys
1111import zlib
12+
1213try :
1314 from inspect import getfullargspec as get_arg_spec
1415except ImportError :
1819from dotenv import load_dotenv , find_dotenv
1920
2021from azure_devtools .scenario_tests import (
21- ReplayableTest , AzureTestError ,
22- GeneralNameReplacer , RequestUrlNormalizer ,
23- AuthenticationMetadataFilter , OAuthRequestResponsesFilter
22+ ReplayableTest ,
23+ AzureTestError ,
24+ GeneralNameReplacer ,
25+ RequestUrlNormalizer ,
26+ AuthenticationMetadataFilter ,
27+ OAuthRequestResponsesFilter ,
2428)
2529from azure_devtools .scenario_tests .config import TestConfig
2630from azure_devtools .scenario_tests .utilities import trim_kwargs_from_test_function
3438except SyntaxError :
3539 pass
3640
41+
3742class HttpStatusCode (object ):
3843 OK = 200
3944 Created = 201
@@ -48,9 +53,9 @@ def get_resource_name(name_prefix, identifier):
4853 # resource names, but each test will get the same name on repeat runs,
4954 # which is needed for playback.
5055 # Most resource names have a length limit, so we use a crc32
51- checksum = zlib .adler32 (identifier ) & 0xffffffff
52- name = ' {}{}' .format (name_prefix , hex (checksum )[2 :]).rstrip ('L' )
53- if name .endswith ('L' ):
56+ checksum = zlib .adler32 (identifier ) & 0xFFFFFFFF
57+ name = " {}{}" .format (name_prefix , hex (checksum )[2 :]).rstrip ("L" )
58+ if name .endswith ("L" ):
5459 name = name [:- 1 ]
5560 return name
5661
@@ -60,46 +65,56 @@ def get_qualified_method_name(obj, method_name):
6065 # test_mgmt_network.test_public_ip_addresses
6166 _ , filename = os .path .split (inspect .getsourcefile (type (obj )))
6267 module_name , _ = os .path .splitext (filename )
63- return ' {0}.{1}' .format (module_name , method_name )
68+ return " {0}.{1}" .format (module_name , method_name )
6469
6570
6671def is_live ():
67- """A module version of is_live, that could be used in pytest marker.
68- """
69- if not hasattr (is_live , '_cache' ):
72+ """A module version of is_live, that could be used in pytest marker."""
73+ if not hasattr (is_live , "_cache" ):
7074 config_file = os .path .join (os .path .dirname (__file__ ), TEST_SETTING_FILENAME )
7175 if not os .path .exists (config_file ):
7276 config_file = None
7377 is_live ._cache = TestConfig (config_file = config_file ).record_mode
7478 return is_live ._cache
7579
7680
77- def get_region_override (default = ' westus' ):
78- region = os .environ .get (' RESOURCE_REGION' , None ) or default
81+ def get_region_override (default = " westus" ):
82+ region = os .environ .get (" RESOURCE_REGION" , None ) or default
7983 if not region :
80- raise ValueError ('Region should not be None; set a non-empty-string region to either the RESOURCE_REGION environment variable or the default parameter to this function.' )
84+ raise ValueError (
85+ "Region should not be None; set a non-empty-string region to either the RESOURCE_REGION environment variable or the default parameter to this function."
86+ )
8187 return region
8288
8389
8490def _is_autorest_v3 (client_class ):
85- """ IS this client a autorestv3/track2 one?.
91+ """IS this client a autorestv3/track2 one?.
8692 Could be refined later if necessary.
8793 """
8894 args = get_arg_spec (client_class .__init__ ).args
8995 return "credential" in args
9096
9197
9298class AzureTestCase (ReplayableTest ):
93- def __init__ (self , method_name , config_file = None ,
94- recording_dir = None , recording_name = None ,
95- recording_processors = None , replay_processors = None ,
96- recording_patches = None , replay_patches = None ,
97- ** kwargs ):
99+ def __init__ (
100+ self ,
101+ method_name ,
102+ config_file = None ,
103+ recording_dir = None ,
104+ recording_name = None ,
105+ recording_processors = None ,
106+ replay_processors = None ,
107+ recording_patches = None ,
108+ replay_patches = None ,
109+ ** kwargs
110+ ):
98111 self .working_folder = os .path .dirname (__file__ )
99112 self .qualified_test_name = get_qualified_method_name (self , method_name )
100113 self ._fake_settings , self ._real_settings = self ._load_settings ()
101114 self .scrubber = GeneralNameReplacer ()
102- config_file = config_file or os .path .join (self .working_folder , TEST_SETTING_FILENAME )
115+ config_file = config_file or os .path .join (
116+ self .working_folder , TEST_SETTING_FILENAME
117+ )
103118 if not os .path .exists (config_file ):
104119 config_file = None
105120 load_dotenv (find_dotenv ())
@@ -108,7 +123,8 @@ def __init__(self, method_name, config_file=None,
108123 config_file = config_file ,
109124 recording_dir = recording_dir ,
110125 recording_name = recording_name or self .qualified_test_name ,
111- recording_processors = recording_processors or self ._get_recording_processors (),
126+ recording_processors = recording_processors
127+ or self ._get_recording_processors (),
112128 replay_processors = replay_processors or self ._get_replay_processors (),
113129 recording_patches = recording_patches ,
114130 replay_patches = replay_patches ,
@@ -121,13 +137,16 @@ def settings(self):
121137 if self ._real_settings :
122138 return self ._real_settings
123139 else :
124- raise AzureTestError ('Need a mgmt_settings_real.py file to run tests live.' )
140+ raise AzureTestError (
141+ "Need a mgmt_settings_real.py file to run tests live."
142+ )
125143 else :
126144 return self ._fake_settings
127145
128146 def _load_settings (self ):
129147 try :
130148 from . import mgmt_settings_real as real_settings
149+
131150 return fake_settings , real_settings
132151 except ImportError :
133152 return fake_settings , None
@@ -137,22 +156,28 @@ def _get_recording_processors(self):
137156 self .scrubber ,
138157 AuthenticationMetadataFilter (),
139158 OAuthRequestResponsesFilter (),
140- RequestUrlNormalizer ()
159+ RequestUrlNormalizer (),
141160 ]
142161
143162 def _get_replay_processors (self ):
144- return [
145- RequestUrlNormalizer ()
146- ]
163+ return [RequestUrlNormalizer ()]
147164
148165 def is_playback (self ):
149166 return not self .is_live
150167
151168 def get_settings_value (self , key ):
152- key_value = os .environ .get ("AZURE_" + key , None )
153-
154- if key_value and self ._real_settings and getattr (self ._real_settings , key ) != key_value :
155- raise ValueError ("You have both AZURE_{key} env variable and mgmt_settings_real.py for {key} to different values" .format (key = key ))
169+ key_value = os .environ .get ("AZURE_" + key , None )
170+
171+ if (
172+ key_value
173+ and self ._real_settings
174+ and getattr (self ._real_settings , key ) != key_value
175+ ):
176+ raise ValueError (
177+ "You have both AZURE_{key} env variable and mgmt_settings_real.py for {key} to different values" .format (
178+ key = key
179+ )
180+ )
156181
157182 if not key_value :
158183 try :
@@ -170,7 +195,6 @@ def set_value_to_scrub(self, key, default_value):
170195 else :
171196 return default_value
172197
173-
174198 def setUp (self ):
175199 # Every test uses a different resource group name calculated from its
176200 # qualified test name.
@@ -194,35 +218,43 @@ def tearDown(self):
194218
195219 def get_credential (self , client_class , ** kwargs ):
196220
197- tenant_id = os .environ .get ("AZURE_TENANT_ID" , getattr (self ._real_settings , "TENANT_ID" , None ))
198- client_id = os .environ .get ("AZURE_CLIENT_ID" , getattr (self ._real_settings , "CLIENT_ID" , None ))
199- secret = os .environ .get ("AZURE_CLIENT_SECRET" , getattr (self ._real_settings , "CLIENT_SECRET" , None ))
221+ tenant_id = os .environ .get (
222+ "AZURE_TENANT_ID" , getattr (self ._real_settings , "TENANT_ID" , None )
223+ )
224+ client_id = os .environ .get (
225+ "AZURE_CLIENT_ID" , getattr (self ._real_settings , "CLIENT_ID" , None )
226+ )
227+ secret = os .environ .get (
228+ "AZURE_CLIENT_SECRET" , getattr (self ._real_settings , "CLIENT_SECRET" , None )
229+ )
200230 is_async = kwargs .pop ("is_async" , False )
201231
202232 if tenant_id and client_id and secret and self .is_live :
203233 if _is_autorest_v3 (client_class ):
204234 # Create azure-identity class
205235 from azure .identity import ClientSecretCredential
236+
206237 if is_async :
207238 from azure .identity .aio import ClientSecretCredential
208239 return ClientSecretCredential (
209- tenant_id = tenant_id ,
210- client_id = client_id ,
211- client_secret = secret
240+ tenant_id = tenant_id , client_id = client_id , client_secret = secret
212241 )
213242 else :
214243 # Create msrestazure class
215- from msrestazure .azure_active_directory import ServicePrincipalCredentials
244+ from msrestazure .azure_active_directory import (
245+ ServicePrincipalCredentials ,
246+ )
247+
216248 return ServicePrincipalCredentials (
217- tenant = tenant_id ,
218- client_id = client_id ,
219- secret = secret
249+ tenant = tenant_id , client_id = client_id , secret = secret
220250 )
221251 else :
222252 if _is_autorest_v3 (client_class ):
223253 if is_async :
224254 if self .is_live :
225- raise ValueError ("Async live doesn't support mgmt_setting_real, please set AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET" )
255+ raise ValueError (
256+ "Async live doesn't support mgmt_setting_real, please set AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET"
257+ )
226258 return AsyncFakeCredential ()
227259 else :
228260 return self .settings .get_azure_core_credentials ()
@@ -237,19 +269,15 @@ def create_client_from_credential(self, client_class, credential, **kwargs):
237269 # kwargs.setdefault("polling_interval", 0)
238270 if _is_autorest_v3 (client_class ):
239271 kwargs .setdefault ("logging_enable" , True )
240- client = client_class (
241- credential = credential ,
242- ** kwargs
243- )
272+ client = client_class (credential = credential , ** kwargs )
244273 else :
245- client = client_class (
246- credentials = credential ,
247- ** kwargs
248- )
274+ client = client_class (credentials = credential , ** kwargs )
249275
250276 if self .is_playback ():
251277 try :
252- client ._config .polling_interval = 0 # FIXME in azure-mgmt-core, make this a kwargs
278+ client ._config .polling_interval = (
279+ 0 # FIXME in azure-mgmt-core, make this a kwargs
280+ )
253281 except AttributeError :
254282 pass
255283
@@ -281,18 +309,17 @@ def get_replayable_random_resource_name(self, name):
281309 """In a replay scenario, (is not live) gives the static moniker. In the random scenario, gives generated name."""
282310 if self .is_live :
283311 created_name = self .create_random_name (name )
284- self .scrubber .register_name_pair (
285- created_name ,
286- name
287- )
312+ self .scrubber .register_name_pair (created_name , name )
288313 return name
289314
290315 def get_preparer_resource_name (self , prefix ):
291316 """Random name generation for use by preparers.
292317
293318 If prefix is a blank string, use the fully qualified test name instead.
294319 This is what legacy tests do for resource groups."""
295- return self .get_resource_name (prefix or self .qualified_test_name .replace ('.' , '_' ))
320+ return self .get_resource_name (
321+ prefix or self .qualified_test_name .replace ("." , "_" )
322+ )
296323
297324 @staticmethod
298325 def await_prepared_test (test_fn ):
@@ -308,6 +335,7 @@ def await_prepared_test(test_fn):
308335 raise ImportError ("Async wrapper is not needed for Python 2.7 code." )
309336
310337 import asyncio
338+
311339 @functools .wraps (test_fn )
312340 def run (test_class_instance , * args , ** kwargs ):
313341 trim_kwargs_from_test_function (test_fn , kwargs )
0 commit comments