Skip to content

Commit 1e609bc

Browse files
authored
Merge pull request #90 from python-scim/88-total-results
ListResponse.total_results is required
2 parents 55bb0a4 + 8995da5 commit 1e609bc

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

doc/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Changelog
77
Fixed
88
^^^^^
99
- Fix :attr:`~SearchRequest.start_index` and :attr:`~SearchRequest.count` limits. :issue:`84`
10+
- :attr:`~ListResponse.total_resuls` is required.
1011

1112
[0.3.0] - 2024-12-11
1213
--------------------

scim2_models/rfc7644/list_response.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,13 @@ class ListResponse(Message, Generic[AnyResource], metaclass=ListResponseMetaclas
104104
def check_results_number(
105105
cls, value: Any, handler: ValidatorFunctionWrapHandler, info: ValidationInfo
106106
) -> Self:
107-
""":rfc:`RFC7644 §3.4.2 <7644#section-3.4.2.4>` indicates that 'resources' must be set if 'totalResults' is non-zero."""
107+
"""Validate result numbers.
108+
109+
:rfc:`RFC7644 §3.4.2 <7644#section-3.4.2.4>` indicates that:
110+
111+
- 'totalResults' is required
112+
- 'resources' must be set if 'totalResults' is non-zero.
113+
"""
108114
obj = handler(value)
109115

110116
if (
@@ -114,6 +120,12 @@ def check_results_number(
114120
):
115121
return obj
116122

123+
if obj.total_results is None:
124+
raise PydanticCustomError(
125+
"required_error",
126+
"Field 'total_results' is required but value is missing or null",
127+
)
128+
117129
if obj.total_results > 0 and not obj.resources:
118130
raise PydanticCustomError(
119131
"no_resource_error",

tests/test_list_response.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,3 +217,26 @@ def test_list_response_schema_ordering():
217217
],
218218
}
219219
ListResponse[Union[User[EnterpriseUser], Group]].model_validate(payload)
220+
221+
222+
def test_total_results_required():
223+
"""ListResponse.total_results is required."""
224+
payload = {
225+
"Resources": [
226+
{
227+
"schemas": [
228+
"urn:ietf:params:scim:schemas:core:2.0:User",
229+
],
230+
"userName": "[email protected]",
231+
"id": "foobar",
232+
}
233+
],
234+
}
235+
236+
with pytest.raises(
237+
ValidationError,
238+
match="Field 'total_results' is required but value is missing or null",
239+
):
240+
ListResponse[User].model_validate(
241+
payload, scim_ctx=Context.RESOURCE_QUERY_RESPONSE
242+
)

0 commit comments

Comments
 (0)