From c37e41973443309b0f5e1e40f52131d7a4de73f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89loi=20Rivard?= Date: Fri, 25 Jul 2025 21:54:33 +0200 Subject: [PATCH] fix: an error happening when PUT-ing an extension field to an instance when there was none before --- scim2_server/utils.py | 8 +++++--- tests/test_utils.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/scim2_server/utils.py b/scim2_server/utils.py index 3e57231..c45cda4 100644 --- a/scim2_server/utils.py +++ b/scim2_server/utils.py @@ -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( diff --git a/tests/test_utils.py b/tests/test_utils.py index 88e73b1..4b56fd1 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -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"