Skip to content

Commit bfcd06d

Browse files
committed
test: refactor tests for portal service
1 parent 97e0b3f commit bfcd06d

File tree

4 files changed

+65
-37
lines changed

4 files changed

+65
-37
lines changed

src/uipath/_cli/_auth/_auth_service.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ def __init__(
2020
environment: str,
2121
*,
2222
force: bool,
23-
client_id: Optional[str],
24-
client_secret: Optional[str],
25-
base_url: Optional[str],
26-
scope: Optional[str],
23+
client_id: Optional[str] = None,
24+
client_secret: Optional[str] = None,
25+
base_url: Optional[str] = None,
26+
scope: Optional[str] = None,
2727
):
2828
self._force = force
2929
self._console = ConsoleLogger()

src/uipath/_cli/_auth/_portal_service.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ class PortalService:
2626
domain: str
2727
selected_tenant: Optional[str] = None
2828

29-
_client: Optional[httpx.Client] = None
30-
31-
_tenants_and_organizations: Optional[TenantsAndOrganizationInfoResponse] = None
32-
3329
def __init__(
3430
self,
3531
domain: str,
@@ -41,6 +37,7 @@ def __init__(
4137
self.prt_id = prt_id
4238
self._client = httpx.Client(**get_httpx_client_kwargs())
4339
self._console = ConsoleLogger()
40+
self._tenants_and_organizations = None
4441

4542
def close(self):
4643
"""Explicitly close the HTTP client."""

src/uipath/_cli/_auth/_url_utils.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,7 @@
1010
def _extract_domain(url: str) -> Optional[str]:
1111
"""Return scheme://netloc from a URL, or None if invalid."""
1212
parsed = urlparse(url)
13-
if parsed.scheme and parsed.netloc:
14-
return f"{parsed.scheme}://{parsed.netloc}"
15-
return None
16-
13+
return f"{parsed.scheme}://{parsed.netloc}"
1714

1815
def resolve_domain(
1916
base_url: Optional[str], environment: Optional[str], force: bool = False
@@ -31,14 +28,16 @@ def resolve_domain(
3128
if not force:
3229
# If UIPATH_URL is set, prefer its domain
3330
uipath_url = os.getenv("UIPATH_URL")
34-
domain = _extract_domain(uipath_url) if uipath_url else None
35-
if domain:
36-
return domain
37-
elif uipath_url:
38-
console.error(
39-
f"Malformed UIPATH_URL: '{uipath_url}'. "
40-
"Please ensure it includes scheme and netloc (e.g., 'https://cloud.uipath.com')."
41-
)
31+
if uipath_url and environment == "cloud":
32+
parsed = urlparse(uipath_url)
33+
if parsed.scheme and parsed.netloc:
34+
domain = f"{parsed.scheme}://{parsed.netloc}"
35+
return domain
36+
else:
37+
console.error(
38+
f"Malformed UIPATH_URL: '{uipath_url}'. "
39+
"Please ensure it includes scheme and netloc (e.g., 'https://cloud.uipath.com')."
40+
)
4241

4342
# If base_url is a real URL, prefer it
4443
if base_url and base_url.startswith("http"):
@@ -60,6 +59,7 @@ def build_service_url(domain: str, path: str) -> str:
6059
Returns:
6160
The complete service URL
6261
"""
62+
print(f"Domain is: {domain}")
6363
return f"{domain}{path}"
6464

6565

tests/cli/test_portal_service_refresh_token.py

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import httpx
2828
import pytest
2929

30+
from uipath._cli._auth._auth_service import AuthService
3031
from uipath._cli._auth._portal_service import PortalService
3132

3233

@@ -58,7 +59,7 @@ class TestPortalServiceRefreshToken:
5859
"""Test class for PortalService refresh token functionality."""
5960

6061
@pytest.mark.parametrize(
61-
"domain, expected_token_url",
62+
"environment, expected_token_url",
6263
[
6364
# Standard UiPath domains
6465
("https://cloud.uipath.com", "https://cloud.uipath.com/identity_/connect/token"),
@@ -85,7 +86,7 @@ class TestPortalServiceRefreshToken:
8586
],
8687
)
8788
def test_post_refresh_token_request_different_domains(
88-
self, domain, expected_token_url, mock_auth_config, sample_token_data
89+
self, environment, expected_token_url, mock_auth_config, sample_token_data
8990
):
9091
"""Test refresh token request with different domain configurations."""
9192

@@ -100,8 +101,11 @@ def test_post_refresh_token_request_different_domains(
100101
mock_response.json.return_value = sample_token_data
101102
mock_client.post.return_value = mock_response
102103

104+
# Create AuthService instance
105+
auth_service = AuthService(environment=environment, force=False)
106+
103107
# Create PortalService instance
104-
portal_service = PortalService(domain)
108+
portal_service = PortalService(auth_service._domain)
105109
portal_service._client = mock_client
106110

107111
# Test refresh token request
@@ -123,7 +127,7 @@ def test_post_refresh_token_request_different_domains(
123127
assert result == sample_token_data
124128

125129
@pytest.mark.parametrize(
126-
"env_var_url, domain, expected_token_url",
130+
"env_var_url, environment, expected_token_url",
127131
[
128132
# UIPATH_URL should be used when domain is "cloud" (default)
129133
(
@@ -152,7 +156,7 @@ def test_post_refresh_token_request_different_domains(
152156
def test_post_refresh_token_request_with_uipath_url_env(
153157
self,
154158
env_var_url,
155-
domain,
159+
environment,
156160
expected_token_url,
157161
mock_auth_config,
158162
sample_token_data,
@@ -175,8 +179,11 @@ def test_post_refresh_token_request_with_uipath_url_env(
175179
mock_response.json.return_value = sample_token_data
176180
mock_client.post.return_value = mock_response
177181

182+
# Create AuthService instance
183+
auth_service = AuthService(environment=environment, force=False)
184+
178185
# Create PortalService instance
179-
portal_service = PortalService(domain)
186+
portal_service = PortalService(auth_service._domain)
180187
portal_service._client = mock_client
181188

182189
# Test refresh token request
@@ -211,15 +218,21 @@ def test_post_refresh_token_request_unauthorized(self, mock_auth_config):
211218
"uipath._cli._auth._oidc_utils.OidcUtils.get_auth_config",
212219
return_value=mock_auth_config,
213220
):
214-
with patch("uipath._cli._auth._portal_service.console") as mock_console:
221+
with patch("uipath._cli._auth._portal_service.ConsoleLogger") as mock_logger_cls:
222+
mock_console = Mock()
223+
mock_logger_cls.return_value = mock_console
224+
215225
# Create a mock HTTP client
216226
mock_client = Mock(spec=httpx.Client)
217227
mock_response = Mock()
218228
mock_response.status_code = 401
219229
mock_client.post.return_value = mock_response
220230

231+
# Create AuthService instance
232+
auth_service = AuthService(environment="cloud", force=False)
233+
221234
# Create PortalService instance
222-
portal_service = PortalService("cloud")
235+
portal_service = PortalService(auth_service._domain)
223236
portal_service._client = mock_client
224237

225238
# Test refresh token request - should raise exception due to console.error
@@ -236,15 +249,21 @@ def test_post_refresh_token_request_server_error(self, mock_auth_config):
236249
"uipath._cli._auth._oidc_utils.OidcUtils.get_auth_config",
237250
return_value=mock_auth_config,
238251
):
239-
with patch("uipath._cli._auth._portal_service.console") as mock_console:
252+
with patch("uipath._cli._auth._portal_service.ConsoleLogger") as mock_logger_cls:
253+
mock_console = Mock()
254+
mock_logger_cls.return_value = mock_console
255+
240256
# Create a mock HTTP client
241257
mock_client = Mock(spec=httpx.Client)
242258
mock_response = Mock()
243259
mock_response.status_code = 500
244260
mock_client.post.return_value = mock_response
245261

262+
# Create AuthService instance
263+
auth_service = AuthService(environment="cloud", force=False)
264+
246265
# Create PortalService instance
247-
portal_service = PortalService("cloud")
266+
portal_service = PortalService(auth_service._domain)
248267
portal_service._client = mock_client
249268

250269
# Test refresh token request - should raise exception due to console.error
@@ -259,8 +278,11 @@ def test_post_refresh_token_request_server_error(self, mock_auth_config):
259278
def test_post_refresh_token_request_client_not_initialized(self):
260279
"""Test refresh token request when HTTP client is not initialized."""
261280

281+
# Create AuthService instance
282+
auth_service = AuthService(environment="cloud", force=False)
283+
262284
# Create PortalService instance without initializing client
263-
portal_service = PortalService("cloud")
285+
portal_service = PortalService(auth_service._domain)
264286
portal_service._client = None
265287

266288
# Test should raise RuntimeError
@@ -283,8 +305,11 @@ def test_post_refresh_token_request_success_response_format(
283305
mock_response.json.return_value = sample_token_data
284306
mock_client.post.return_value = mock_response
285307

308+
# Create AuthService instance
309+
auth_service = AuthService(environment="cloud", force=False)
310+
286311
# Create PortalService instance
287-
portal_service = PortalService("cloud")
312+
portal_service = PortalService(auth_service._domain)
288313
portal_service._client = mock_client
289314

290315
# Test refresh token request
@@ -319,7 +344,7 @@ def test_post_refresh_token_request_malformed_domain_handling(
319344
),
320345
]
321346

322-
for domain, expected_url in test_cases:
347+
for environment, expected_url in test_cases:
323348
with patch(
324349
"uipath._cli._auth._oidc_utils.OidcUtils.get_auth_config",
325350
return_value=mock_auth_config,
@@ -331,8 +356,11 @@ def test_post_refresh_token_request_malformed_domain_handling(
331356
mock_response.json.return_value = sample_token_data
332357
mock_client.post.return_value = mock_response
333358

359+
# Create AuthService instance
360+
auth_service = AuthService(environment=environment, force=False)
361+
334362
# Create PortalService instance
335-
portal_service = PortalService(domain)
363+
portal_service = PortalService(auth_service._domain)
336364
portal_service._client = mock_client
337365

338366
# Test refresh token request
@@ -353,7 +381,7 @@ def test_post_refresh_token_request_malformed_domain_handling(
353381
mock_client.reset_mock()
354382

355383
@pytest.mark.parametrize(
356-
"scenario_name, env_vars, domain, expected_token_url",
384+
"scenario_name, env_vars, environment, expected_token_url",
357385
[
358386
# These scenarios mirror the test_auth.py test cases but focus on the refresh token endpoint
359387
(
@@ -398,7 +426,7 @@ def test_post_refresh_token_request_auth_scenarios_integration(
398426
self,
399427
scenario_name,
400428
env_vars,
401-
domain,
429+
environment,
402430
expected_token_url,
403431
mock_auth_config,
404432
sample_token_data,
@@ -426,9 +454,12 @@ def test_post_refresh_token_request_auth_scenarios_integration(
426454
mock_response.json.return_value = sample_token_data
427455
mock_client.post.return_value = mock_response
428456

457+
# Create AuthService instance
458+
auth_service = AuthService(environment=environment, force=False)
459+
429460
# Create PortalService instance with the domain that would be determined
430461
# by the auth command logic
431-
portal_service = PortalService(domain)
462+
portal_service = PortalService(auth_service._domain)
432463
portal_service._client = mock_client
433464

434465
# Test refresh token request

0 commit comments

Comments
 (0)