@@ -22,7 +22,8 @@ def test_transform_role_payload_filters_upstream(monkeypatch):
2222 out = mr .transform_role_payload (source )
2323 perms = out ["roleDefinition" ]["permissions" ]
2424 assert "policies.read" in perms and all (
25- p not in perms for p in [
25+ p not in perms
26+ for p in [
2627 "accounts.read:upstream" ,
2728 "workspaces.read:upstream" ,
2829 "vaults.read:upstream" ,
@@ -59,7 +60,9 @@ def test_main_system_role_path(mock_get, monkeypatch):
5960@patch ("migrate_roles.requests.post" )
6061@patch ("migrate_roles.requests.get" )
6162@patch ("migrate_roles.migrate_policies" )
62- def test_main_custom_role_create_and_assign (mock_migrate_policies , mock_get , mock_post , monkeypatch ):
63+ def test_main_custom_role_create_and_assign (
64+ mock_migrate_policies , mock_get , mock_post , monkeypatch
65+ ):
6366 monkeypatch .setattr (mr , "TARGET_VAULT_ID" , "tv" )
6467 monkeypatch .setattr (mr , "SOURCE_ENV_URL" , "https://s" )
6568 monkeypatch .setattr (mr , "TARGET_ENV_URL" , "https://t" )
@@ -74,9 +77,7 @@ def test_main_custom_role_create_and_assign(mock_migrate_policies, mock_get, moc
7477
7578 policies_resp = MagicMock ()
7679 policies_resp .raise_for_status .return_value = None
77- policies_resp .json .return_value = {
78- "policies" : [{"ID" : "p1" }, {"ID" : "p2" }]
79- }
80+ policies_resp .json .return_value = {"policies" : [{"ID" : "p1" }, {"ID" : "p2" }]}
8081
8182 # get_role -> role_resp, get_role_policies -> policies_resp
8283 mock_get .side_effect = [role_resp , policies_resp ]
@@ -96,6 +97,7 @@ def test_main_custom_role_create_and_assign(mock_migrate_policies, mock_get, moc
9697 out = mr .main ()
9798 assert out and any (r .get ("ID" ) == "new-role" for r in out )
9899
100+
99101@patch ("migrate_roles.requests.post" )
100102@patch ("migrate_roles.requests.get" )
101103def test_migrate_all_roles_branch (mock_get , mock_post , monkeypatch ):
@@ -105,12 +107,22 @@ def test_migrate_all_roles_branch(mock_get, mock_post, monkeypatch):
105107 monkeypatch .setattr (mr , "SOURCE_ENV_URL" , "https://s" )
106108 monkeypatch .setattr (mr , "TARGET_ENV_URL" , "https://t" )
107109
108- list_resp = MagicMock (); list_resp .raise_for_status .return_value = None ; list_resp .json .return_value = {"roles" : [{"ID" : "r1" }]}
109- role_resp = MagicMock (); role_resp .raise_for_status .return_value = None ; role_resp .json .return_value = {"role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}}
110- no_policies = MagicMock (); no_policies .raise_for_status .return_value = None ; no_policies .json .return_value = {"policies" : []}
110+ list_resp = MagicMock ()
111+ list_resp .raise_for_status .return_value = None
112+ list_resp .json .return_value = {"roles" : [{"ID" : "r1" }]}
113+ role_resp = MagicMock ()
114+ role_resp .raise_for_status .return_value = None
115+ role_resp .json .return_value = {
116+ "role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}
117+ }
118+ no_policies = MagicMock ()
119+ no_policies .raise_for_status .return_value = None
120+ no_policies .json .return_value = {"policies" : []}
111121 mock_get .side_effect = [list_resp , role_resp , no_policies ]
112122
113- create_post = MagicMock (); create_post .raise_for_status .return_value = None ; create_post .json .return_value = {"ID" : "new-role" }
123+ create_post = MagicMock ()
124+ create_post .raise_for_status .return_value = None
125+ create_post .json .return_value = {"ID" : "new-role" }
114126 mock_post .return_value = create_post
115127
116128 out = mr .main ()
@@ -127,8 +139,14 @@ def test_skip_role_creation_if_exists(mock_get, mock_post, monkeypatch):
127139 monkeypatch .setattr (mr , "SOURCE_ENV_URL" , "https://s" )
128140 monkeypatch .setattr (mr , "TARGET_ENV_URL" , "https://t" )
129141
130- role_resp = MagicMock (); role_resp .raise_for_status .return_value = None ; role_resp .json .return_value = {"role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}}
131- exists_resp = MagicMock (); exists_resp .raise_for_status .return_value = None ; exists_resp .json .return_value = {"roles" : [{"ID" : "existing" }]}
142+ role_resp = MagicMock ()
143+ role_resp .raise_for_status .return_value = None
144+ role_resp .json .return_value = {
145+ "role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}
146+ }
147+ exists_resp = MagicMock ()
148+ exists_resp .raise_for_status .return_value = None
149+ exists_resp .json .return_value = {"roles" : [{"ID" : "existing" }]}
132150 mock_get .side_effect = [role_resp , exists_resp ]
133151
134152 mr .main ()
@@ -144,7 +162,10 @@ class Resp:
144162 err = requests .exceptions .HTTPError (response = Resp ())
145163
146164 # First call returns a SYSTEM role so role_name is set
147- role_resp = MagicMock (); role_resp .raise_for_status .return_value = None ; role_resp .json .return_value = {"role" : {"definition" : {"name" : mr .SYSTEM_ROLES [0 ]}}}
165+ role_resp = MagicMock ()
166+ role_resp .raise_for_status .return_value = None
167+ role_resp .json .return_value = {"role" : {"definition" : {"name" : mr .SYSTEM_ROLES [0 ]}}}
168+
148169 # get_system_role raises HTTPError
149170 def raise_err (* args , ** kwargs ):
150171 raise err
@@ -179,12 +200,22 @@ def test_custom_role_check_does_not_exist(mock_get, mock_post, monkeypatch):
179200 monkeypatch .setattr (mr , "SOURCE_ENV_URL" , "https://s" )
180201 monkeypatch .setattr (mr , "TARGET_ENV_URL" , "https://t" )
181202
182- role_resp = MagicMock (); role_resp .raise_for_status .return_value = None ; role_resp .json .return_value = {"role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}}
183- no_exist = MagicMock (); no_exist .raise_for_status .return_value = None ; no_exist .json .return_value = {"roles" : []}
184- policies_empty = MagicMock (); policies_empty .raise_for_status .return_value = None ; policies_empty .json .return_value = {"policies" : []}
203+ role_resp = MagicMock ()
204+ role_resp .raise_for_status .return_value = None
205+ role_resp .json .return_value = {
206+ "role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}
207+ }
208+ no_exist = MagicMock ()
209+ no_exist .raise_for_status .return_value = None
210+ no_exist .json .return_value = {"roles" : []}
211+ policies_empty = MagicMock ()
212+ policies_empty .raise_for_status .return_value = None
213+ policies_empty .json .return_value = {"policies" : []}
185214 mock_get .side_effect = [role_resp , no_exist , policies_empty ]
186215
187- create_post = MagicMock (); create_post .raise_for_status .return_value = None ; create_post .json .return_value = {"ID" : "new-role" }
216+ create_post = MagicMock ()
217+ create_post .raise_for_status .return_value = None
218+ create_post .json .return_value = {"ID" : "new-role" }
188219 mock_post .return_value = create_post
189220
190221 out = mr .main ()
@@ -197,19 +228,27 @@ def test_http_error_after_role_name(mock_get, mock_post, monkeypatch):
197228 # Raise HTTPError during create_role to hit lines 165-166
198229 class Resp :
199230 content = b"boom"
231+
200232 err = requests .exceptions .HTTPError (response = Resp ())
201233
202234 monkeypatch .setattr (mr , "ROLE_IDS" , "['rid']" , raising = False )
203235 monkeypatch .setattr (mr , "TARGET_VAULT_ID" , "tv" )
204236 monkeypatch .setattr (mr , "SOURCE_ENV_URL" , "https://s" )
205237 monkeypatch .setattr (mr , "TARGET_ENV_URL" , "https://t" )
206238
207- role_resp = MagicMock (); role_resp .raise_for_status .return_value = None ; role_resp .json .return_value = {"role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}}
208- policies_resp = MagicMock (); policies_resp .raise_for_status .return_value = None ; policies_resp .json .return_value = {"policies" : []}
239+ role_resp = MagicMock ()
240+ role_resp .raise_for_status .return_value = None
241+ role_resp .json .return_value = {
242+ "role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}
243+ }
244+ policies_resp = MagicMock ()
245+ policies_resp .raise_for_status .return_value = None
246+ policies_resp .json .return_value = {"policies" : []}
209247 mock_get .side_effect = [role_resp , policies_resp ]
210248
211249 def raise_err (* args , ** kwargs ):
212250 raise err
251+
213252 mock_post .side_effect = raise_err
214253
215254 with pytest .raises (requests .exceptions .HTTPError ):
@@ -225,20 +264,29 @@ def test_generic_exception_after_role_name(mock_get, mock_post, monkeypatch):
225264 monkeypatch .setattr (mr , "SOURCE_ENV_URL" , "https://s" )
226265 monkeypatch .setattr (mr , "TARGET_ENV_URL" , "https://t" )
227266
228- role_resp = MagicMock (); role_resp .raise_for_status .return_value = None ; role_resp .json .return_value = {"role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}}
267+ role_resp = MagicMock ()
268+ role_resp .raise_for_status .return_value = None
269+ role_resp .json .return_value = {
270+ "role" : {"definition" : {"name" : "Custom" , "permissions" : ["policies.read" ]}}
271+ }
229272 mock_get .side_effect = [role_resp ]
230273
231- create_post = MagicMock (); create_post .raise_for_status .return_value = None ; create_post .json .return_value = {"ID" : "new-role" }
274+ create_post = MagicMock ()
275+ create_post .raise_for_status .return_value = None
276+ create_post .json .return_value = {"ID" : "new-role" }
232277 mock_post .return_value = create_post
233278
234- monkeypatch .setattr (mr , "get_role_policies" , lambda _id : (_ for _ in ()).throw (Exception ("oops" )))
279+ monkeypatch .setattr (
280+ mr , "get_role_policies" , lambda _id : (_ for _ in ()).throw (Exception ("oops" ))
281+ )
235282 with pytest .raises (Exception ):
236283 mr .main ()
237284
238285
239286def test_run_as_script (monkeypatch ):
240287 # Cover line 172
241288 import runpy , requests as _requests
289+
242290 monkeypatch .setenv ("ROLE_IDS" , "[]" )
243291 monkeypatch .setenv ("TARGET_VAULT_ID" , "tv" )
244292 monkeypatch .setenv ("SOURCE_ENV_URL" , "https://s" )
0 commit comments