Skip to content

Commit 3dd5fcd

Browse files
authored
Fix base_url parsing for build_url_with_query_params (#342)
1 parent 1afa8ee commit 3dd5fcd

File tree

7 files changed

+79
-57
lines changed

7 files changed

+79
-57
lines changed

tests/conftest.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from tests.utils.client_configuration import ClientConfiguration
88
from tests.utils.list_resource import list_data_to_dicts, list_response_of
99
from workos.types.list_resource import WorkOSListResource
10+
from workos.utils._base_http_client import DEFAULT_REQUEST_TIMEOUT
1011
from workos.utils.http_client import AsyncHTTPClient, HTTPClient, SyncHTTPClient
1112

1213

@@ -30,6 +31,44 @@ def async_http_client_for_test():
3031
)
3132

3233

34+
@pytest.fixture
35+
def sync_client_configuration_and_http_client_for_test():
36+
base_url = "https://api.workos.test/"
37+
client_id = "client_b27needthisforssotemxo"
38+
39+
client_configuration = ClientConfiguration(
40+
base_url=base_url, client_id=client_id, request_timeout=DEFAULT_REQUEST_TIMEOUT
41+
)
42+
43+
http_client = SyncHTTPClient(
44+
api_key="sk_test",
45+
base_url=base_url,
46+
client_id=client_id,
47+
version="test",
48+
)
49+
50+
return client_configuration, http_client
51+
52+
53+
@pytest.fixture
54+
def async_client_configuration_and_http_client_for_test():
55+
base_url = "https://api.workos.test/"
56+
client_id = "client_b27needthisforssotemxo"
57+
58+
client_configuration = ClientConfiguration(
59+
base_url=base_url, client_id=client_id, request_timeout=DEFAULT_REQUEST_TIMEOUT
60+
)
61+
62+
http_client = AsyncHTTPClient(
63+
api_key="sk_test",
64+
base_url=base_url,
65+
client_id=client_id,
66+
version="test",
67+
)
68+
69+
return client_configuration, http_client
70+
71+
3372
@pytest.fixture
3473
def mock_http_client_with_response(monkeypatch):
3574
def inner(

tests/test_sso.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import json
22
from six.moves.urllib.parse import parse_qsl, urlparse
33
import pytest
4-
from tests.utils.client_configuration import client_configuration_for_http_client
54
from tests.utils.fixtures.mock_profile import MockProfile
65
from tests.utils.list_resource import list_data_to_dicts, list_response_of
76
from tests.utils.fixtures.mock_connection import MockConnection
@@ -50,13 +49,13 @@ class TestSSOBase(SSOFixtures):
5049
provider: SsoProviderType
5150

5251
@pytest.fixture(autouse=True)
53-
def setup(self, sync_http_client_for_test):
54-
self.http_client = sync_http_client_for_test
52+
def setup(self, sync_client_configuration_and_http_client_for_test):
53+
client_configuration, http_client = (
54+
sync_client_configuration_and_http_client_for_test
55+
)
56+
self.http_client = http_client
5557
self.sso = SSO(
56-
http_client=self.http_client,
57-
client_configuration=client_configuration_for_http_client(
58-
sync_http_client_for_test
59-
),
58+
http_client=self.http_client, client_configuration=client_configuration
6059
)
6160
self.provider = "GoogleOAuth"
6261
self.customer_domain = "workos.com"
@@ -218,13 +217,13 @@ class TestSSO(SSOFixtures):
218217
provider: SsoProviderType
219218

220219
@pytest.fixture(autouse=True)
221-
def setup(self, sync_http_client_for_test):
222-
self.http_client = sync_http_client_for_test
220+
def setup(self, sync_client_configuration_and_http_client_for_test):
221+
client_configuration, http_client = (
222+
sync_client_configuration_and_http_client_for_test
223+
)
224+
self.http_client = http_client
223225
self.sso = SSO(
224-
http_client=self.http_client,
225-
client_configuration=client_configuration_for_http_client(
226-
sync_http_client_for_test
227-
),
226+
http_client=self.http_client, client_configuration=client_configuration
228227
)
229228
self.provider = "GoogleOAuth"
230229
self.customer_domain = "workos.com"
@@ -342,13 +341,13 @@ class TestAsyncSSO(SSOFixtures):
342341
provider: SsoProviderType
343342

344343
@pytest.fixture(autouse=True)
345-
def setup(self, async_http_client_for_test):
346-
self.http_client = async_http_client_for_test
344+
def setup(self, async_client_configuration_and_http_client_for_test):
345+
client_configuration, http_client = (
346+
async_client_configuration_and_http_client_for_test
347+
)
348+
self.http_client = http_client
347349
self.sso = AsyncSSO(
348-
http_client=self.http_client,
349-
client_configuration=client_configuration_for_http_client(
350-
async_http_client_for_test
351-
),
350+
http_client=self.http_client, client_configuration=client_configuration
352351
)
353352
self.provider = "GoogleOAuth"
354353
self.customer_domain = "workos.com"

tests/test_user_management.py

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111
from tests.utils.fixtures.mock_password_reset import MockPasswordReset
1212
from tests.utils.fixtures.mock_user import MockUser
1313
from tests.utils.list_resource import list_data_to_dicts, list_response_of
14-
from tests.utils.client_configuration import (
15-
client_configuration_for_http_client,
16-
)
1714
from workos.user_management import AsyncUserManagement, UserManagement
1815
from workos.utils.request_helper import RESPONSE_TYPE_CODE
1916

@@ -145,13 +142,13 @@ def mock_invitations_multiple_pages(self):
145142

146143
class TestUserManagementBase(UserManagementFixtures):
147144
@pytest.fixture(autouse=True)
148-
def setup(self, sync_http_client_for_test):
149-
self.http_client = sync_http_client_for_test
145+
def setup(self, sync_client_configuration_and_http_client_for_test):
146+
client_configuration, http_client = (
147+
sync_client_configuration_and_http_client_for_test
148+
)
149+
self.http_client = http_client
150150
self.user_management = UserManagement(
151-
http_client=self.http_client,
152-
client_configuration=client_configuration_for_http_client(
153-
sync_http_client_for_test
154-
),
151+
http_client=self.http_client, client_configuration=client_configuration
155152
)
156153

157154
def test_authorization_url_throws_value_error_with_missing_connection_organization_and_provider(
@@ -317,13 +314,13 @@ def test_get_logout_url(self):
317314

318315
class TestUserManagement(UserManagementFixtures):
319316
@pytest.fixture(autouse=True)
320-
def setup(self, sync_http_client_for_test):
321-
self.http_client = sync_http_client_for_test
317+
def setup(self, sync_client_configuration_and_http_client_for_test):
318+
client_configuration, http_client = (
319+
sync_client_configuration_and_http_client_for_test
320+
)
321+
self.http_client = http_client
322322
self.user_management = UserManagement(
323-
http_client=self.http_client,
324-
client_configuration=client_configuration_for_http_client(
325-
sync_http_client_for_test
326-
),
323+
http_client=self.http_client, client_configuration=client_configuration
327324
)
328325

329326
def test_get_user(self, mock_user, capture_and_mock_http_client_request):
@@ -957,13 +954,13 @@ def test_revoke_invitation(
957954
@pytest.mark.asyncio
958955
class TestAsyncUserManagement(UserManagementFixtures):
959956
@pytest.fixture(autouse=True)
960-
def setup(self, async_http_client_for_test):
961-
self.http_client = async_http_client_for_test
957+
def setup(self, async_client_configuration_and_http_client_for_test):
958+
client_configuration, http_client = (
959+
async_client_configuration_and_http_client_for_test
960+
)
961+
self.http_client = http_client
962962
self.user_management = AsyncUserManagement(
963-
http_client=self.http_client,
964-
client_configuration=client_configuration_for_http_client(
965-
async_http_client_for_test
966-
),
963+
http_client=self.http_client, client_configuration=client_configuration
967964
)
968965

969966
async def test_get_user(self, mock_user, capture_and_mock_http_client_request):

tests/utils/client_configuration.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from workos._client_configuration import (
22
ClientConfiguration as ClientConfigurationProtocol,
33
)
4-
from workos.utils._base_http_client import BaseHTTPClient
54

65

76
class ClientConfiguration(ClientConfigurationProtocol):
@@ -21,13 +20,3 @@ def client_id(self) -> str:
2120
@property
2221
def request_timeout(self) -> int:
2322
return self._request_timeout
24-
25-
26-
def client_configuration_for_http_client(
27-
http_client: BaseHTTPClient,
28-
) -> ClientConfiguration:
29-
return ClientConfiguration(
30-
base_url=http_client.base_url,
31-
client_id=http_client.client_id,
32-
request_timeout=http_client.timeout,
33-
)

workos/sso.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from workos.types.sso.connection import ConnectionType
44
from workos.types.sso.sso_provider_type import SsoProviderType
55
from workos.typing.sync_or_async import SyncOrAsync
6-
from workos.utils.http_client import AsyncHTTPClient, HTTPClient, SyncHTTPClient
6+
from workos.utils.http_client import AsyncHTTPClient, SyncHTTPClient
77
from workos.utils.pagination_order import PaginationOrder
88
from workos.types.sso import ConnectionWithDomains, Profile, ProfileAndToken
99
from workos.utils.request_helper import (

workos/utils/_base_http_client.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import platform
22
from typing import (
33
Any,
4-
List,
54
Mapping,
65
Sequence,
76
cast,
@@ -66,14 +65,13 @@ def __init__(
6665
timeout: Optional[int] = DEFAULT_REQUEST_TIMEOUT,
6766
) -> None:
6867
self._api_key = api_key
69-
# Template for constructing the URL for an API request
70-
self._base_url = "{}{{}}".format(base_url)
68+
self._base_url = base_url
7169
self._client_id = client_id
7270
self._version = version
7371
self._timeout = DEFAULT_REQUEST_TIMEOUT if timeout is None else timeout
7472

7573
def _generate_api_url(self, path: str) -> str:
76-
return self._base_url.format(path)
74+
return f"{self._base_url}{path}"
7775

7876
def _build_headers(
7977
self,

workos/utils/request_helper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ def build_parameterized_url(cls, url: str, **params: QueryParameterValue) -> str
2424
def build_url_with_query_params(
2525
cls, base_url: str, path: str, **params: QueryParameterValue
2626
) -> str:
27-
return base_url.format(path) + "?" + urllib.parse.urlencode(params)
27+
return base_url + path + "?" + urllib.parse.urlencode(params)

0 commit comments

Comments
 (0)