diff --git a/model/src/test/java/org/cloudfoundry/identity/uaa/scim/ScimUserTests.java b/model/src/test/java/org/cloudfoundry/identity/uaa/scim/ScimUserTests.java index ae0bb3d8e8c..c590f564585 100644 --- a/model/src/test/java/org/cloudfoundry/identity/uaa/scim/ScimUserTests.java +++ b/model/src/test/java/org/cloudfoundry/identity/uaa/scim/ScimUserTests.java @@ -827,6 +827,14 @@ public void testPatchActive() { assertTrue(patchUser.isActive()); } + @Test + public void testScimUserAliasDeserialization() { + user.setAliasId("aliasId"); + user.setAliasZid("custom"); + String staticJson = "{\"id\":\"id\",\"externalId\":\"\",\"meta\":{\"version\":0},\"userName\":\"uname\",\"name\":{\"formatted\":\"gname fname\",\"familyName\":\"fname\",\"givenName\":\"gname\"},\"emails\":[{\"value\":\"test@example.org\",\"primary\":false}],\"phoneNumbers\":[{\"value\":\"0123456789\"}],\"displayName\":\"display\",\"title\":\"title\",\"locale\":\"en.UTF-8\",\"active\":true,\"verified\":true,\"origin\":\"\",\"aliasZid\":\"custom\",\"aliasId\":\"aliasId\",\"password\":\"password\",\"schemas\":[\"urn:scim:schemas:core:1.0\"]}"; + assertEquals(user, JsonUtils.readValue(staticJson, ScimUser.class)); + } + @Test public void testPatchVerified() { user.setVerified(false); diff --git a/server/src/test/java/org/cloudfoundry/identity/uaa/alias/EntityAliasHandlerValidationTest.java b/server/src/test/java/org/cloudfoundry/identity/uaa/alias/EntityAliasHandlerValidationTest.java index f4a44d3063e..6552d38f144 100644 --- a/server/src/test/java/org/cloudfoundry/identity/uaa/alias/EntityAliasHandlerValidationTest.java +++ b/server/src/test/java/org/cloudfoundry/identity/uaa/alias/EntityAliasHandlerValidationTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.cloudfoundry.identity.uaa.alias.EntityAliasHandlerValidationTest.NoExistingAliasBase.ExistingEntityArgument.ENTITY_WITH_EMPTY_ALIAS_PROPS; +import static org.junit.Assert.assertFalse; import java.util.UUID; import java.util.stream.Stream; @@ -129,6 +130,12 @@ final void shouldReturnFalse_UpdatesOfEntitiesWithExistingAliasForbidden() { requestBody = buildEntityWithAliasProps(null, null); assertThat(aliasHandler.aliasPropertiesAreValid(requestBody, existingEntity)).isFalse(); } + + @Test + final void shouldReturnFalse_DefaultSetting() { + AliasEntitiesConfig aliasEntitiesConfig = new AliasEntitiesConfig(); + assertFalse(aliasEntitiesConfig.aliasEntitiesEnabled(false)); + } } protected abstract class ExistingAlias_AliasFeatureEnabled extends Base { diff --git a/server/src/test/java/org/cloudfoundry/identity/uaa/scim/endpoints/ScimUserEndpointsAliasTests.java b/server/src/test/java/org/cloudfoundry/identity/uaa/scim/endpoints/ScimUserEndpointsAliasTests.java index 4321c879019..f77ab48f9f3 100644 --- a/server/src/test/java/org/cloudfoundry/identity/uaa/scim/endpoints/ScimUserEndpointsAliasTests.java +++ b/server/src/test/java/org/cloudfoundry/identity/uaa/scim/endpoints/ScimUserEndpointsAliasTests.java @@ -13,6 +13,7 @@ import org.cloudfoundry.identity.uaa.scim.ScimUserAliasHandler; import org.cloudfoundry.identity.uaa.scim.ScimUserProvisioning; import org.cloudfoundry.identity.uaa.scim.exception.ScimException; +import org.cloudfoundry.identity.uaa.scim.exception.ScimResourceConflictException; import org.cloudfoundry.identity.uaa.scim.validate.PasswordValidator; import org.cloudfoundry.identity.uaa.security.IsSelfCheck; import org.cloudfoundry.identity.uaa.util.AlphanumericRandomValueStringGenerator; @@ -26,6 +27,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.context.ApplicationEventPublisher; +import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.http.HttpStatus; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; @@ -123,7 +125,7 @@ void setUp() { lenient().when(transactionTemplate.execute(any())).then(invocationOnMock -> { final TransactionCallback callback = invocationOnMock.getArgument(0); - return callback.doInTransaction(mock(TransactionStatus.class)); + return callback != null ? callback.doInTransaction(mock(TransactionStatus.class)) : null; }); } @@ -177,6 +179,21 @@ void shouldThrow_WhenAliasPropertiesAreInvalid() { assertThat(exception.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST); } + @Test + void shouldThrow_WhenAliasIsNotPresent() { + final ScimUser user = buildScimUser(UAA, origin); + + when(scimUserAliasHandler.aliasPropertiesAreValid(user, null)).thenReturn(true); + when(scimUserAliasHandler.ensureConsistencyOfAliasEntity(user, null)).thenReturn(null); + + final MockHttpServletRequest req = new MockHttpServletRequest(); + final MockHttpServletResponse res = new MockHttpServletResponse(); + final IllegalStateException exception = assertThrows(IllegalStateException.class, () -> + scimUserEndpoints.createUser(user, req, res) + ); + assertThat(exception.getMessage()).isEqualTo("The persisted user is not present after handling the alias."); + } + @Test void shouldReturnOriginalUser() { final ScimUser user = buildScimUser(UAA, origin); @@ -246,6 +263,28 @@ void shouldThrow_IfAliasPropertiesAreInvalid() { assertThat(exception.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST); } + @Test + void shouldThrow_IfAliasIsLocked() { + when(scimUserAliasHandler.aliasPropertiesAreValid(originalUser, existingOriginalUser)) + .thenReturn(true); + when(transactionTemplate.execute(any())).then(invocationOnMock -> { + throw new OptimisticLockingFailureException("The alias is locked."); + }); + + final ScimResourceConflictException exception = assertThrows(ScimResourceConflictException.class, () -> + scimUserEndpoints.updateUser( + originalUser, + originalUser.getId(), + "*", + new MockHttpServletRequest(), + new MockHttpServletResponse(), + null + ) + ); + assertThat(exception.getMessage()).isEqualTo("The alias is locked."); + assertThat(exception.getStatus()).isEqualTo(HttpStatus.CONFLICT); + } + @Test void shouldAlsoUpdateAliasUserIfPresent() { when(scimUserAliasHandler.aliasPropertiesAreValid(originalUser, existingOriginalUser)) @@ -467,6 +506,20 @@ void shouldThrowException_IfUserHasExistingAlias() { .isEqualTo("Could not delete user with alias since alias entities are disabled."); assertThat(exception.getHttpStatus()).isEqualTo(HttpStatus.BAD_REQUEST.value()); } + + @Test + void shouldDeleteUserIfPresent() { + ScimUser originalUser = buildScimUser("123456789", "uaa"); + when(scimUserProvisioning.retrieve(any(), any())).thenReturn(originalUser); + final ScimUser response = scimUserEndpoints.deleteUser( + "12345678", + null, + new MockHttpServletRequest(), + new MockHttpServletResponse() + ); + + assertScimUsersAreEqual(response, originalUser); + } } }