Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions scim2_server/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@ def merge_resources(target: Resource, updates: BaseModel):
if isinstance(getattr(updates, set_attribute), Extension):
# This is a model extension, handle it as its own resource
# and don't simply overwrite it
merge_resources(
getattr(target, set_attribute), getattr(updates, set_attribute)
)
target_extension = getattr(target, set_attribute)
if target_extension is None:
setattr(target, set_attribute, getattr(updates, set_attribute))
else:
merge_resources(target_extension, getattr(updates, set_attribute))
continue
new_value = getattr(updates, set_attribute)
if mutability == Mutability.immutable and getattr(
Expand Down
17 changes: 17 additions & 0 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,3 +368,20 @@ def test_get_or_create_mutability(self):
u = User()
with pytest.raises(SCIMException, match="immutable"):
get_or_create(u, "groups", True)

def test_merge_resources_none_extension(self):
"""Test adding an extension parameter with merge_resources."""
target = User[EnterpriseUser](user_name="test")
assert target[EnterpriseUser] is None

payload = {
"userName": "test",
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
"employeeNumber": "12345"
},
}
update = User[EnterpriseUser].model_validate(payload)

merge_resources(target, update)

assert target[EnterpriseUser].employee_number == "12345"
Loading