/******************************************************************************* * Cloud Foundry * Copyright (c) [2009-2016] Pivotal Software, Inc. All Rights Reserved. * * This product is licensed to you under the Apache License, Version 2.0 (the "License"). * You may not use this product except in compliance with the License. * * This product includes a number of subcomponents with * separate copyright notices and license terms. Your use of these * subcomponents is subject to the terms and conditions of the * subcomponent's license, as noted in the LICENSE file. *******************************************************************************/ package org.cloudfoundry.identity.uaa.scim; import org.cloudfoundry.identity.uaa.approval.Approval; import org.cloudfoundry.identity.uaa.scim.ScimUser.Group; import org.cloudfoundry.identity.uaa.util.JsonUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * @author Luke Taylor */ public class ScimUserTests { private static final String SCHEMAS = "\"schemas\": [\"urn:scim:schemas:core:1.0\"],"; private ScimUser user; private ScimUser patch; @Before public void createUserToBePatched() { user = new ScimUser("id", "uname", "gname", "fname"); user.setPassword("password"); user.addEmail("test@example.org"); user.addPhoneNumber("0123456789"); user.getName().setHonorificSuffix("suffix"); user.getName().setHonorificPrefix("prefix"); user.getName().setMiddleName("middle"); user.setDisplayName("display"); user.setNickName("nick"); user.setTimezone("America/Denver"); user.setTitle("title"); user.setProfileUrl("profile_url"); user.setLocale("en.UTF-8"); user.setPreferredLanguage("en"); patch = new ScimUser(); } @Test public void testSerializeNullPhoneNumber() { ScimUser user = new ScimUser("id","username","giveName","familyName"); String json = JsonUtils.writeValueAsString(user); ScimUser user1 = JsonUtils.readValue(json, ScimUser.class); user.setPhoneNumbers(null); json = JsonUtils.writeValueAsString(user); user1 = JsonUtils.readValue(json, ScimUser.class); json = json.replace("\"id\":\"id\"", "\"id\":\"id\", \"phoneNumbers\":[]"); user1 = JsonUtils.readValue(json, ScimUser.class); assertNotNull(user1.getPhoneNumbers()); json = json.replace("\"phoneNumbers\":[]", "\"phoneNumbers\":null"); user1 = JsonUtils.readValue(json, ScimUser.class); assertNotNull(user1.getPhoneNumbers()); } @Test public void test_logon_timestamps_are_null() { String oldJson = "{\"id\":\"78df8903-58e9-4a1e-8e22-b0421f7d6d70\",\"meta\":{\"version\":0,\"created\":\"2015-08-21T15:09:26.830Z\",\"lastModified\":\"2015-08-21T15:09:26.830Z\"},\"userName\":\"jo!!!@foo.com\",\"name\":{\"familyName\":\"User\",\"givenName\":\"Jo\"},\"emails\":[{\"value\":\"jo!!!@foo.com\",\"primary\":false}],\"active\":true,\"verified\":false,\"origin\":\"uaa\",\"zoneId\":\"uaa\",\"passwordLastModified\":null,\"schemas\":[\"urn:scim:schemas:core:1.0\"]}"; for (String json : Arrays.asList(oldJson, JsonUtils.writeValueAsString(new ScimUser()))) { ScimUser user = JsonUtils.readValue(json, ScimUser.class); assertNull(json, user.getPreviousLogonTime()); assertNull(json, user.getLastLogonTime()); } } @Test public void testDeserializeNullPasswordLastModified() { String json = "{\"id\":\"78df8903-58e9-4a1e-8e22-b0421f7d6d70\",\"meta\":{\"version\":0,\"created\":\"2015-08-21T15:09:26.830Z\",\"lastModified\":\"2015-08-21T15:09:26.830Z\"},\"userName\":\"jo!!!@foo.com\",\"name\":{\"familyName\":\"User\",\"givenName\":\"Jo\"},\"emails\":[{\"value\":\"jo!!!@foo.com\",\"primary\":false}],\"active\":true,\"verified\":false,\"origin\":\"uaa\",\"zoneId\":\"uaa\",\"passwordLastModified\":null,\"schemas\":[\"urn:scim:schemas:core:1.0\"]}"; JsonUtils.readValue(json, ScimUser.class); } @Test public void minimalJsonMapsToUser() throws Exception { String minimal = "{" + SCHEMAS + " \"userName\": \"bjensen@example.com\"\n" + "}"; ScimUser user = JsonUtils.readValue(minimal, ScimUser.class); assertEquals("bjensen@example.com", user.getUserName()); assertEquals(null, user.getPassword()); } @Test public void passwordJsonMapsToUser() throws Exception { String minimal = "{" + SCHEMAS + " \"userName\": \"bjensen@example.com\",\n" + " \"password\": \"foo\"\n" + "}"; ScimUser user = JsonUtils.readValue(minimal, ScimUser.class); assertEquals("foo", user.getPassword()); } @Test public void minimalUserMapsToJson() throws Exception { ScimUser user = new ScimUser(); user.setId("123"); user.setUserName("joe"); user.getMeta().setCreated(new SimpleDateFormat("yyyy-MM-dd").parse("2011-11-30")); String json = JsonUtils.writeValueAsString(user); // System.err.println(json); assertTrue(json.contains("\"userName\":\"joe\"")); assertTrue(json.contains("\"id\":\"123\"")); assertTrue(json.contains("\"meta\":")); assertTrue(json.contains("\"created\":\"2011-11-30")); assertTrue(json.matches(".*\\\"created\\\":\\\"([0-9-]*-?)T([0-9:.]*)Z\\\".*")); assertFalse(json.contains("\"lastModified\":")); } @Test public void anotherUserMapsToJson() throws Exception { ScimUser user = new ScimUser(); user.setId("123"); user.setUserName("joe"); user.getMeta().setCreated(new SimpleDateFormat("yyyy-MM-dd").parse("2011-11-30")); user.addEmail("joe@test.org"); user.addPhoneNumber("+1-222-1234567"); String json = JsonUtils.writeValueAsString(user); // System.err.println(json); assertTrue(json.contains("\"emails\":")); assertTrue(json.contains("\"phoneNumbers\":")); } @Test public void userWithGroupsMapsToJson() throws Exception { ScimUser user = new ScimUser(); user.setId("123"); user.setUserName("joe"); user.setGroups(Collections.singleton(new Group(null, "foo"))); String json = JsonUtils.writeValueAsString(user); // System.err.println(json); assertTrue(json.contains("\"groups\":")); } @Test public void emailsAreMappedCorrectly() throws Exception { String json = "{ \"userName\":\"bjensen\"," + "\"emails\": [\n" + "{\"value\": \"bj@jensen.org\",\"type\": \"other\"}," + "{\"value\": \"bjensen@example.com\", \"type\": \"work\",\"primary\": true}," + "{\"value\": \"babs@jensen.org\",\"type\": \"home\"}" + "],\n" + "\"schemas\":[\"urn:scim:schemas:core:1.0\"]}"; ScimUser user = JsonUtils.readValue(json, ScimUser.class); assertEquals(3, user.getEmails().size()); assertEquals("bjensen@example.com", user.getEmails().get(1).getValue()); assertEquals("babs@jensen.org", user.getEmails().get(2).getValue()); assertEquals("bjensen@example.com", user.getPrimaryEmail()); assertFalse(user.getEmails().get(0).isPrimary()); // System.out.println(mapper.writeValueAsString(user)); } @Test public void groupsAreMappedCorrectly() throws Exception { String json = "{ \"userName\":\"bjensen\"," + "\"groups\": [\n" + "{\"value\": \"12345\",\"display\": \"uaa.admin\"}," + "{\"value\": \"123456\",\"display\": \"dash.admin\"}" + "],\n" + "\"schemas\":[\"urn:scim:schemas:core:1.0\"]}"; ScimUser user = JsonUtils.readValue(json, ScimUser.class); assertEquals(2, user.getGroups().size()); // System.out.println(mapper.writeValueAsString(user)); } @Test public void datesAreMappedCorrectly() throws Exception { String json = "{ \"userName\":\"bjensen\"," + "\"meta\":{\"version\":10,\"created\":\"2011-11-30T10:46:16.475Z\"}}"; ScimUser user = JsonUtils.readValue(json, ScimUser.class); assertEquals(10, user.getVersion()); assertEquals("2011-11-30", new SimpleDateFormat("yyyy-MM-dd").format(user.getMeta().getCreated())); // System.out.println(mapper.writeValueAsString(user)); } @Test public void basicNamesAreMappedCorrectly() { ScimUser roz = new ScimUser("1234", "roz", "Roslyn", "MacRae"); assertEquals("1234", roz.getId()); assertEquals("roz", roz.getUserName()); assertEquals("Roslyn", roz.getGivenName()); assertEquals("MacRae", roz.getFamilyName()); roz.setId("12345"); assertEquals("12345", roz.getId()); assertEquals("roz", roz.getUserName()); assertEquals("Roslyn", roz.getGivenName()); assertEquals("MacRae", roz.getFamilyName()); roz.setUserName("roz1"); assertEquals("12345", roz.getId()); assertEquals("roz1", roz.getUserName()); assertEquals("Roslyn", roz.getGivenName()); assertEquals("MacRae", roz.getFamilyName()); ScimUser.Name name = new ScimUser.Name("Roslyn","MacRae"); roz.setName(name); assertSame(name, roz.getName()); assertNull(roz.getApprovals()); Set<Approval> approvals = new HashSet<>(); roz.setApprovals(approvals); assertSame(approvals, roz.getApprovals()); List<ScimUser.PhoneNumber> phoneNumbers = new LinkedList<>(); ScimUser.PhoneNumber p1 = new ScimUser.PhoneNumber(); phoneNumbers.add(p1); roz.setPhoneNumbers(phoneNumbers); assertNotNull(roz.getPhoneNumbers()); assertTrue(roz.getPhoneNumbers().isEmpty()); p1.setValue("value"); p1.setType("type"); roz.setPhoneNumbers(phoneNumbers); assertNotNull(roz.getPhoneNumbers()); assertEquals(1, roz.getPhoneNumbers().size()); assertNull(roz.getDisplayName()); roz.setDisplayName("DisplayName"); assertEquals("DisplayName", roz.getDisplayName()); assertNull(roz.getProfileUrl()); roz.setProfileUrl("ProfileUrl"); assertEquals("ProfileUrl", roz.getProfileUrl()); assertNull(roz.getTitle()); roz.setTitle("Title"); assertEquals("Title", roz.getTitle()); assertNull(roz.getUserType()); roz.setUserType("UserType"); assertEquals("UserType", roz.getUserType()); assertNull(roz.getPreferredLanguage()); roz.setPreferredLanguage("PreferredLanguage"); assertEquals("PreferredLanguage", roz.getPreferredLanguage()); assertNull(roz.getLocale()); roz.setLocale("Locale"); assertEquals("Locale", roz.getLocale()); assertTrue(roz.isActive()); roz.setActive(false); assertFalse(roz.isActive()); assertNull(roz.getTimezone()); roz.setTimezone("Timezone"); assertEquals("Timezone", roz.getTimezone()); assertEquals("",roz.getOrigin()); roz.setOrigin("Origin"); assertEquals("Origin", roz.getOrigin()); assertEquals("",roz.getExternalId()); roz.setExternalId("ExternalId"); assertEquals("ExternalId", roz.getExternalId()); assertNull(roz.getNickName()); roz.setNickName("NickName"); assertEquals("NickName", roz.getNickName()); assertTrue(roz.isVerified()); roz.setVerified(false); assertFalse(roz.isVerified()); } @Test public void testSpelFilter() throws Exception { ScimUser user = new ScimUser(); user.setId("123"); user.setUserName("joe"); ScimUser.Email email = new ScimUser.Email(); email.setValue("foo@bar.com"); user.setEmails(Arrays.asList(email)); StandardEvaluationContext context = new StandardEvaluationContext(user); assertTrue(new SpelExpressionParser().parseExpression( "userName == 'joe' and !(emails.?[value=='foo@bar.com']).empty").getValue(context, Boolean.class)); } @Test public void testSetPrimaryEmail() throws Exception { ScimUser user = new ScimUser(); assertNull(user.getPrimaryEmail()); user.setPrimaryEmail("email0@bar.com"); assertEquals("email0@bar.com", user.getPrimaryEmail()); ScimUser.Email email1 = new ScimUser.Email(); email1.setValue("email1@bar.com"); user.setEmails(new LinkedList<>(Arrays.asList(email1))); assertEquals("email1@bar.com", user.getPrimaryEmail()); email1.setPrimary(true); ScimUser.Email email2 = new ScimUser.Email(); email2.setValue("email2@bar.com"); ScimUser.Email email3 = new ScimUser.Email(); email3.setValue("email3@bar.com"); user.setEmails(Arrays.asList(email1, email2, email3)); ScimUser.Email newEmail = new ScimUser.Email(); newEmail.setValue("new@example.com"); newEmail.setPrimary(true); user.setPrimaryEmail(newEmail.getValue()); Assert.assertEquals("new@example.com", user.getPrimaryEmail()); Assert.assertEquals(Arrays.asList(newEmail, email2, email3), user.getEmails()); try { user.addEmail("email3@bar.com"); fail(); } catch (IllegalArgumentException x) { assertEquals("Already contains email email3@bar.com", x.getMessage()); } user.setUserName("userName"); user.setNickName("nickName"); user.setName(new ScimUser.Name("givenName", "familyName")); assertNotNull(user.wordList()); assertFalse(user.wordList().isEmpty()); assertEquals(7, user.wordList().size()); } @Test public void testGroupSettersGetters() throws Exception { Group group = new Group("id", "display", Group.Type.DIRECT); group.setType(Group.Type.DIRECT); assertEquals(Group.Type.DIRECT, group.getType()); group.setType(Group.Type.INDIRECT); assertEquals(Group.Type.INDIRECT, group.getType()); group.setType(null); assertNull(group.getType()); Group group1 = new Group("id", "display", Group.Type.DIRECT); Group group2 = new Group("id", "display", Group.Type.DIRECT); assertTrue(group1.equals(group2)); assertTrue(group2.equals(group1)); assertTrue(group1.equals(group1)); assertTrue(group2.equals(group2)); assertFalse(group1.equals(null)); assertFalse(group1.equals(new Object())); group1.setValue(null); assertFalse(group1.equals(group2)); assertFalse(group2.equals(group1)); group2.setValue(null); assertTrue(group1.equals(group2)); group1.setDisplay(null); assertFalse(group1.equals(group2)); assertFalse(group2.equals(group1)); group2.setDisplay(null); assertTrue(group1.equals(group2)); assertNotNull(group2.toString()); } @Test public void testName() throws Exception { ScimUser.Name name1 = new ScimUser.Name(); assertNull(name1.getFamilyName()); assertNull(name1.getFormatted()); assertNull(name1.getGivenName()); assertNull(name1.getHonorificPrefix()); assertNull(name1.getHonorificSuffix()); assertNull(name1.getMiddleName()); name1.setFamilyName("familyName"); assertEquals("familyName", name1.getFamilyName()); name1.setGivenName("givenName"); assertEquals("givenName", name1.getGivenName()); assertNull(name1.getFormatted()); name1.setHonorificPrefix("honorificPrefix"); assertEquals("honorificPrefix", name1.getHonorificPrefix()); name1.setHonorificSuffix("honorificSuffix"); assertEquals("honorificSuffix", name1.getHonorificSuffix()); name1.setFormatted("formatted"); assertEquals("formatted", name1.getFormatted()); name1.setMiddleName("middle"); assertEquals("middle", name1.getMiddleName()); ScimUser.Name name2 = new ScimUser.Name("givenName", "familyName"); assertEquals("givenName familyName", name2.getFormatted()); } @Test public void testEmail() throws Exception { ScimUser.Email email1 = new ScimUser.Email(); ScimUser.Email email2 = new ScimUser.Email(); assertTrue(email1.equals(email2)); assertTrue(email2.equals(email1)); assertEquals(email1.hashCode(), email2.hashCode()); email1.setPrimary(true); assertFalse(email1.equals(email2)); assertFalse(email2.equals(email1)); email2.setPrimary(true); assertTrue(email1.equals(email2)); assertTrue(email2.equals(email1)); assertEquals(email1.hashCode(), email2.hashCode()); email1.setType("work"); assertFalse(email1.equals(email2)); assertFalse(email2.equals(email1)); email2.setType("home"); assertFalse(email1.equals(email2)); assertFalse(email2.equals(email1)); email2.setType("work"); assertTrue(email1.equals(email2)); assertTrue(email2.equals(email1)); assertEquals(email1.hashCode(), email2.hashCode()); email1.setValue("value@value.org"); assertFalse(email1.equals(email2)); assertFalse(email2.equals(email1)); email2.setValue("value@value.org"); assertTrue(email1.equals(email2)); assertTrue(email2.equals(email1)); assertEquals(email1.hashCode(), email2.hashCode()); } @Test public void testPhoneNumber() throws Exception { ScimUser.PhoneNumber p1 = new ScimUser.PhoneNumber(); assertNull(p1.getType()); assertNull(p1.getValue()); p1.setValue("value"); p1.setType("type"); assertEquals("value",p1.getValue()); assertEquals("type", p1.getType()); ScimUser user = new ScimUser(); user.setPhoneNumbers(Arrays.asList(p1)); try { p1.setType(null); user.addPhoneNumber(p1.getValue()); fail(); }catch (IllegalArgumentException x) { } } @Test public void testPasswordLastModified() throws Exception { ScimUser user = new ScimUser(); assertNull(user.getPasswordLastModified()); user.setId("someid"); assertSame(user.getMeta().getCreated(), user.getPasswordLastModified()); Date d = new Date(System.currentTimeMillis()); user.setPasswordLastModified(d); assertNotNull(user.getPasswordLastModified()); assertSame(d, user.getPasswordLastModified()); } @Test public void user_verified_byDefault() throws Exception { ScimUser user = new ScimUser(); assertTrue(user.isVerified()); } @Test public void test_patch_last_logon() { patch.setLastLogonTime(System.currentTimeMillis()); user.patch(patch); assertNull(user.getLastLogonTime()); } @Test public void test_patch_previous_logon() { patch.setPreviousLogonTime(System.currentTimeMillis()); user.patch(patch); assertNull(user.getPreviousLogonTime()); } @Test public void testPatchUserSetPrimaryEmail() { ScimUser.Email newMail = new ScimUser.Email(); newMail.setPrimary(true); newMail.setValue("newTest@example.org"); patch.setEmails(Arrays.asList(newMail)); user.patch(patch); assertEquals("newTest@example.org", user.getPrimaryEmail()); } @Test public void testPatchUserSelectPrimaryEmailFromList() { ScimUser.Email newMail = new ScimUser.Email(); newMail.setPrimary(false); newMail.setValue("newTest@example.org"); ScimUser.Email secondMail = new ScimUser.Email(); newMail.setPrimary(true); newMail.setValue("secondTest@example.org"); patch.setEmails(Arrays.asList(newMail, secondMail)); user.patch(patch); assertEquals("secondTest@example.org", user.getPrimaryEmail()); //complex property is merged. not replaced. assertEquals(3, user.getEmails().size()); //drop the email first patch.getMeta().setAttributes(new String[] {"emails"}); user.patch(patch); assertEquals("secondTest@example.org", user.getPrimaryEmail()); assertEquals(2, user.getEmails().size()); } @Test public void testPatchUserChangeUserName() { patch.setUserName("newUsername"); user.patch(patch); assertEquals("newUsername", user.getUserName()); //username is a required field patch.getMeta().setAttributes(new String[] {"username"}); patch.setUserName(null); try { user.patch(patch); fail("username is a required field, can't nullify it."); } catch (IllegalArgumentException e) { } assertNotNull(user.getUserName()); //we can drop and set the username again patch.setUserName("newUsername2"); user.patch(patch); assertEquals("newUsername2", user.getUserName()); } @Test public void testPatchUserChangeName() { patch.setName(new ScimUser.Name("Test", "Name")); user.patch(patch); assertEquals("Test", user.getName().getGivenName()); assertEquals("Name", user.getName().getFamilyName()); } @Test public void testPatchUserDropName() { patch.setName(new ScimUser.Name("given-only",null)); user.patch(patch); assertEquals("given-only", user.getName().getGivenName()); assertNotNull(user.getName().getFamilyName()); patch.getMeta().setAttributes(new String[]{"NAME"}); user.patch(patch); assertEquals("given-only", user.getName().getGivenName()); assertNull(user.getName().getFamilyName()); } @Test public void testPatchUserDropNameSubAttributes() { patch.setName(null); patch.getMeta().setAttributes(new String[]{"name.givenname"}); user.patch(patch); assertNull(user.getName().getGivenName()); assertNotNull(user.getName().getFamilyName()); patch.getMeta().setAttributes(new String[]{"Name.familyname"}); user.patch(patch); assertNull(user.getName().getGivenName()); assertNull(user.getName().getFamilyName()); } @Test public void testPatchUserDropNonUsedAttributes() { int pos = 0; allSet(pos++); setAndPatchAndValidate("displayname", pos++); setAndPatchAndValidate("nickname", pos++); setAndPatchAndValidate("profileurl", pos++); setAndPatchAndValidate("title", pos++); setAndPatchAndValidate("locale", pos++); setAndPatchAndValidate("timezone", pos++); setAndPatchAndValidate("name.honorificprefix", pos++); setAndPatchAndValidate("name.honorificsuffix", pos++); setAndPatchAndValidate("name.formatted", pos++); setAndPatchAndValidate("name.middlename", pos++); setAndPatchAndValidate("name.givenname", pos++); setAndPatchAndValidate("name.familyname", pos++); setAndPatchAndValidate("preferredlanguage", pos++); pos--; patch.setName(new ScimUser.Name(null,null)); patch.getName().setFormatted(null); patch.setPreferredLanguage("test"); setAndPatchAndValidate("preferredlanguage", --pos); patch.getName().setFamilyName("test"); setAndPatchAndValidate("name.familyname", --pos); patch.getName().setGivenName("test"); setAndPatchAndValidate("name.givenname", --pos); patch.getName().setMiddleName("test"); setAndPatchAndValidate("name.middlename", --pos); patch.getName().setFormatted("test"); setAndPatchAndValidate("name.formatted", --pos); patch.getName().setHonorificSuffix("test"); setAndPatchAndValidate("name.honorificsuffix", --pos); patch.getName().setHonorificPrefix("test"); setAndPatchAndValidate("name.honorificprefix", --pos); patch.setTimezone("test"); setAndPatchAndValidate("timezone", --pos); patch.setLocale("test"); setAndPatchAndValidate("locale", --pos); patch.setTitle("test"); setAndPatchAndValidate("title", --pos); patch.setProfileUrl("test"); setAndPatchAndValidate("profileurl", --pos); patch.setNickName("test"); setAndPatchAndValidate("nickname", --pos); patch.setDisplayName("test"); setAndPatchAndValidate("displayname", --pos); assertEquals(0, pos); } public void setAndPatchAndValidate(String attribute, int nullable) { patch.getMeta().setAttributes(new String[] {attribute}); user.patch(patch); allSet(nullable); } public void doAssertNull(int skip, int pos, Object value) { if (skip<=pos) { assertNotNull(value); } else { assertNull(value); } } protected void allSet(int nullable) { int pos = 0; doAssertNull(nullable, pos++, user.getDisplayName()); doAssertNull(nullable, pos++, user.getNickName()); doAssertNull(nullable, pos++, user.getProfileUrl()); doAssertNull(nullable, pos++, user.getTitle()); doAssertNull(nullable, pos++, user.getLocale()); doAssertNull(nullable, pos++, user.getTimezone()); doAssertNull(nullable, pos++, user.getName().getHonorificPrefix()); doAssertNull(nullable, pos++, user.getName().getHonorificSuffix()); doAssertNull(nullable, pos++, user.getName().getFormatted()); doAssertNull(nullable, pos++, user.getName().getMiddleName()); doAssertNull(nullable, pos++, user.getName().getGivenName()); doAssertNull(nullable, pos++, user.getName().getFamilyName()); doAssertNull(nullable, pos++, user.getPreferredLanguage()); } @Test public void testPatchUserDropAndChangeName() { patch.getMeta().setAttributes(new String[]{"NAME"}); user.patch(patch); assertNull(user.getName().getGivenName()); assertNull(user.getName().getFamilyName()); patch.setName(new ScimUser.Name("Test", "Name")); user.patch(patch); assertEquals("Test", user.getName().getGivenName()); assertEquals("Name", user.getName().getFamilyName()); } @Test public void testPatchUserChangePhone() { ScimUser.PhoneNumber newNumber = new ScimUser.PhoneNumber("9876543210"); patch.setPhoneNumbers(Arrays.asList(newNumber)); user.patch(patch); assertEquals(2, user.getPhoneNumbers().size()); assertEquals(newNumber.getValue(), user.getPhoneNumbers().get(0).getValue()); } @Test public void testPatchUserDropPhone() { patch.getMeta().setAttributes(new String[]{"PhOnEnUmBeRs"}); user.patch(patch); assertNull(patch.getPhoneNumbers()); ScimUser.PhoneNumber newNumber = new ScimUser.PhoneNumber("9876543210"); patch.setPhoneNumbers(Arrays.asList(newNumber)); user.patch(patch); assertEquals(1, user.getPhoneNumbers().size()); assertEquals(newNumber.getValue(), user.getPhoneNumbers().get(0).getValue()); } @Test public void testPatch_Drop_Using_Attributes() { String[] s = { "username", "Name", "Emails", "hOnEnUmBeRs", "DisplayName", "NickName", "ProfileUrl", "Title", "PreferredLanguage", "Locale", "Timezone", "Name.familyName", "Name.givenName", "Name.formatted", "Name.honorificPreFix", "Name.honorificSuffix", "Name.middleName" }; } @Test public void testPatchUserDropAndChangePhone() { ScimUser user = new ScimUser(null, "uname", "gname", "fname"); user.setPassword("password"); user.addEmail("test@example.org"); user.addPhoneNumber("0123456789"); patch.getMeta().setAttributes(new String[]{"PhOnEnUmBeRs"}); ScimUser.PhoneNumber newNumber = new ScimUser.PhoneNumber("9876543210"); patch.setPhoneNumbers(Arrays.asList(newNumber)); user.patch(patch); assertEquals(newNumber.getValue(), user.getPhoneNumbers().get(0).getValue()); } @Test public void testCannotPatchActiveFalse() { ScimUser user = new ScimUser(null, "uname", "gname", "fname"); user.setPassword("password"); user.addEmail("test@example.org"); ScimUser patchUser = new ScimUser(); patchUser.setActive(false); patchUser.patch(user); assertTrue(patchUser.isActive()); } @Test public void testCannotPatchVerifiedFalse() { ScimUser user = new ScimUser(null, "uname", "gname", "fname"); user.setPassword("password"); user.addEmail("test@example.org"); ScimUser patchUser = new ScimUser(); patchUser.setVerified(false); patchUser.patch(user); assertTrue(patchUser.isActive()); } @Test public void testPatchActive() { ScimUser user = new ScimUser(null, "uname", "gname", "fname"); user.setPassword("password"); user.addEmail("test@example.org"); user.setActive(false); ScimUser patchUser = new ScimUser(); patchUser.setActive(true); patchUser.patch(user); assertFalse(patchUser.isActive()); user.setActive(true); patchUser.patch(user); assertTrue(patchUser.isActive()); } @Test public void testPatchVerified() { user.setVerified(false); patch.setVerified(true); user.patch(patch); assertTrue(user.isVerified()); } }