Skip to content

Commit a59af6e

Browse files
authored
Fix parsing of query parameters (#74)
* Add unit test for query parameters * Fix parsing of query parameters * Update test requirements
1 parent 0425753 commit a59af6e

File tree

3 files changed

+22
-10
lines changed

3 files changed

+22
-10
lines changed

requirements_test.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
mypy==0.960
2-
pytest==7.1.2
1+
mypy==0.982
2+
pytest==7.1.3
33
pytest-cov==3.0.0
44
pytest-flake8==1.1.1
55
pytest-localserver==0.5.0

src/dicomweb_client/uri.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def build_query_string(params: Optional[Dict[str, Any]] = None) -> str:
5050
return ''
5151
components = []
5252
for key, value in params.items():
53-
if isinstance(value, Sequence):
53+
if isinstance(value, (list, tuple, set)):
5454
for v in value:
5555
c = '='.join([key, quote_plus(str(v))])
5656
components.append(c)
@@ -95,19 +95,19 @@ def parse_query_parameters(
9595
params: Dict[str, Union[int, str, List[str]]] = {}
9696
if limit is not None:
9797
if not isinstance(limit, int):
98-
raise TypeError('Parameter "limit" must be an integer.')
98+
raise TypeError('Argument "limit" must be an integer.')
9999
if limit < 0:
100-
raise ValueError('Parameter "limit" must not be negative.')
100+
raise ValueError('Argument "limit" must not be negative.')
101101
params['limit'] = limit
102102
if offset is not None:
103103
if not isinstance(offset, int):
104-
raise TypeError('Parameter "offset" must be an integer.')
104+
raise TypeError('Argument "offset" must be an integer.')
105105
if offset < 0:
106-
raise ValueError('Parameter "offset" must not be negative.')
106+
raise ValueError('Argument "offset" must not be negative.')
107107
params['offset'] = offset
108108
if fuzzymatching is not None:
109109
if not isinstance(fuzzymatching, bool):
110-
raise TypeError('Parameter "fuzzymatching" must be boolean.')
110+
raise TypeError('Argument "fuzzymatching" must be boolean.')
111111
if fuzzymatching:
112112
params['fuzzymatching'] = 'true'
113113
else:
@@ -116,14 +116,14 @@ def parse_query_parameters(
116116
includefields = []
117117
for field in set(fields):
118118
if not isinstance(field, str):
119-
raise TypeError('Elements of "fields" must be a string.')
119+
raise TypeError('Items of argument "fields" must be strings.')
120120
includefields.append(field)
121121
params['includefield'] = includefields
122122
if search_filters is not None:
123123
for field, criterion in search_filters.items():
124124
if not isinstance(field, str):
125125
raise TypeError(
126-
'Keys of "search_filters" must be strings.'
126+
'Keys of argument "search_filters" must be strings.'
127127
)
128128
# TODO: datetime?
129129
params[field] = criterion

tests/test_web.py

+12
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,18 @@ def test_search_for_series(httpserver, client, cache_dir):
217217
)
218218

219219

220+
def test_search_for_series_filter_modality(httpserver, client, cache_dir):
221+
cache_filename = str(cache_dir.joinpath('search_for_series.json'))
222+
with open(cache_filename, 'r') as f:
223+
content = f.read()
224+
headers = {'content-type': 'application/dicom+json'}
225+
httpserver.serve_content(content=content, code=200, headers=headers)
226+
client.search_for_series(search_filters={'Modality': 'SM'})
227+
request = httpserver.requests[0]
228+
assert request.path == '/series'
229+
assert request.query_string.decode() == 'Modality=SM'
230+
231+
220232
def test_search_for_series_of_study(httpserver, client, cache_dir):
221233
cache_filename = str(cache_dir.joinpath('search_for_series.json'))
222234
with open(cache_filename, 'r') as f:

0 commit comments

Comments
 (0)