Skip to content

Commit ba67df4

Browse files
committed
fix: Normalize query params in dataset create_items_public_url
1 parent af6d0f7 commit ba67df4

2 files changed

Lines changed: 39 additions & 2 deletions

File tree

src/apify_client/_resource_clients/dataset.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,8 @@ def create_items_public_url(
607607
request_params['signature'] = signature
608608

609609
items_public_url = urlparse(self._build_url('items', public=True))
610-
filtered_params = {k: v for k, v in request_params.items() if v is not None}
610+
# Normalize params (bool→true/false, list→comma-joined) the same way the HTTP request path does.
611+
filtered_params = self._http_client._parse_params(request_params) # noqa: SLF001
611612
if filtered_params:
612613
items_public_url = items_public_url._replace(query=urlencode(filtered_params))
613614

@@ -1173,7 +1174,8 @@ async def create_items_public_url(
11731174
request_params['signature'] = signature
11741175

11751176
items_public_url = urlparse(self._build_url('items', public=True))
1176-
filtered_params = {k: v for k, v in request_params.items() if v is not None}
1177+
# Normalize params (bool→true/false, list→comma-joined) the same way the HTTP request path does.
1178+
filtered_params = self._http_client._parse_params(request_params) # noqa: SLF001
11771179
if filtered_params:
11781180
items_public_url = items_public_url._replace(query=urlencode(filtered_params))
11791181

tests/unit/test_url_generation.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import json
44
from unittest import mock
55
from unittest.mock import Mock
6+
from urllib.parse import parse_qs, urlparse
67

78
import pytest
89

@@ -128,6 +129,40 @@ async def test_dataset_public_url_async(api_url: str, api_public_url: str | None
128129
)
129130

130131

132+
def test_dataset_public_url_normalizes_params_sync() -> None:
133+
"""Bool and list query params must be API-normalized (bool→true/false, list→comma-joined), not Python reprs."""
134+
client = ApifyClient(token='dummy-token', api_url='https://api.apify.com')
135+
dataset = client.dataset('someID')
136+
137+
mock_response = Mock()
138+
mock_response.json.return_value = json.loads(MOCKED_DATASET_RESPONSE)
139+
140+
with mock.patch.object(client._http_client, 'call', return_value=mock_response):
141+
public_url = dataset.create_items_public_url(clean=True, desc=False, fields=['title', 'url'])
142+
143+
query = parse_qs(urlparse(public_url).query)
144+
assert query['clean'] == ['true']
145+
assert query['desc'] == ['false']
146+
assert query['fields'] == ['title,url']
147+
148+
149+
async def test_dataset_public_url_normalizes_params_async() -> None:
150+
"""Bool and list query params must be API-normalized (bool→true/false, list→comma-joined), not Python reprs."""
151+
client = ApifyClientAsync(token='dummy-token', api_url='https://api.apify.com')
152+
dataset = client.dataset('someID')
153+
154+
mock_response = Mock()
155+
mock_response.json.return_value = json.loads(MOCKED_DATASET_RESPONSE)
156+
157+
with mock.patch.object(client._http_client, 'call', return_value=mock_response):
158+
public_url = await dataset.create_items_public_url(clean=True, desc=False, fields=['title', 'url'])
159+
160+
query = parse_qs(urlparse(public_url).query)
161+
assert query['clean'] == ['true']
162+
assert query['desc'] == ['false']
163+
assert query['fields'] == ['title,url']
164+
165+
131166
# ============================================================================
132167
# Key-value store URL generation tests
133168
# ============================================================================

0 commit comments

Comments
 (0)