package org.exoplatform.social.core.storage; import java.util.ArrayList; import java.util.List; import org.exoplatform.social.core.identity.model.Identity; import org.exoplatform.social.core.identity.model.Profile; import org.exoplatform.social.core.identity.provider.OrganizationIdentityProvider; import org.exoplatform.social.core.profile.ProfileFilter; import org.exoplatform.social.core.storage.cache.CachedIdentityStorage; import org.exoplatform.social.core.test.AbstractCoreTest; /** * Created by IntelliJ IDEA. * User: zun * Date: Jun 17, 2010 * Time: 9:34:56 AM */ public class IdentityStorageTest extends AbstractCoreTest { private CachedIdentityStorage identityStorage; private List<Identity> tearDownIdentityList; public void setUp() throws Exception { super.setUp(); identityStorage = (CachedIdentityStorage) getContainer().getComponentInstanceOfType(CachedIdentityStorage.class); assertNotNull("identityStorage must not be null", identityStorage); tearDownIdentityList = new ArrayList<Identity>(); } public void tearDown() throws Exception { for (Identity identity : tearDownIdentityList) { identityStorage.deleteIdentity(identity); } super.tearDown(); } /** * Tests {@link IdenityStorage#saveIdentity(Identity)} * */ public void testSaveIdentity() { Identity tobeSavedIdentity = new Identity(OrganizationIdentityProvider.NAME, "identity1"); identityStorage.saveIdentity(tobeSavedIdentity); assertNotNull(tobeSavedIdentity.getId()); final String updatedRemoteId = "identity-updated"; tobeSavedIdentity.setRemoteId(updatedRemoteId); identityStorage.saveIdentity(tobeSavedIdentity); Identity gotIdentity = identityStorage.findIdentityById(tobeSavedIdentity.getId()); assertEquals(updatedRemoteId, gotIdentity.getRemoteId()); tearDownIdentityList.add(gotIdentity); } /** * Tests {@link IdenityStorage#deleteIdentity(Identity)} * */ public void testDeleteIdentity() { final String username = "username"; Identity tobeSavedIdentity = new Identity(OrganizationIdentityProvider.NAME, username); identityStorage.saveIdentity(tobeSavedIdentity); assertNotNull(tobeSavedIdentity.getId()); identityStorage.deleteIdentity(tobeSavedIdentity); tobeSavedIdentity = identityStorage.findIdentity(OrganizationIdentityProvider.NAME, username); assertNull("tobeSavedIdentity must be null", tobeSavedIdentity); // Delete identity with loaded profile { tobeSavedIdentity = new Identity(OrganizationIdentityProvider.NAME, username); identityStorage.saveIdentity(tobeSavedIdentity); assertNotNull("tobeSavedIdentity.getId() must not be null.", tobeSavedIdentity.getId()); assertNull("tobeSavedIdentity.getProfile().getId() must be null.", tobeSavedIdentity.getProfile().getId()); Profile profile = identityStorage.loadProfile(tobeSavedIdentity.getProfile()); tobeSavedIdentity.setProfile(profile); assertNotNull("tobeSavedIdentity.getProfile().getId() must not be null", tobeSavedIdentity.getProfile().getId()); identityStorage.deleteIdentity(tobeSavedIdentity); assertNotNull("tobeSavedIdentity.getId() must not be null", tobeSavedIdentity.getId()); try { identityStorage.findIdentityById(tobeSavedIdentity.getId()); } catch (Exception e1) { assert false : "can't update avatar" + e1 ; } } } /** * Tests {@link IdenityStorage#findIdentityById(String)} * */ public void testFindIdentityById() { final String remoteUser = "identity1"; Identity toSaveIdentity = new Identity(OrganizationIdentityProvider.NAME, remoteUser); identityStorage.saveIdentity(toSaveIdentity); assertNotNull(toSaveIdentity.getId()); Identity gotIdentityById = identityStorage.findIdentityById(toSaveIdentity.getId()); assertNotNull(gotIdentityById); assertEquals(toSaveIdentity.getId(), gotIdentityById.getId()); assertEquals(toSaveIdentity.getProviderId(), gotIdentityById.getProviderId()); assertEquals(toSaveIdentity.getRemoteId(), gotIdentityById.getRemoteId()); Identity notFoundIdentityByRemoteid = identityStorage.findIdentity(OrganizationIdentityProvider.NAME, "not-found"); assertNull(notFoundIdentityByRemoteid); Identity gotIdentityByRemoteId = identityStorage.findIdentity(OrganizationIdentityProvider.NAME, remoteUser); assertNotNull(gotIdentityByRemoteId); assertEquals(gotIdentityByRemoteId.getId(), toSaveIdentity.getId()); assertEquals(gotIdentityByRemoteId.getProviderId(), toSaveIdentity.getProviderId()); assertEquals(gotIdentityByRemoteId.getRemoteId(), toSaveIdentity.getRemoteId()); tearDownIdentityList.add(gotIdentityByRemoteId); } /** * Tests {@link IdenityStorage#findIdentity(String, String)} * */ public void testFindIdentity() { final String userName = "username"; Identity tobeSavedIdentity = new Identity(OrganizationIdentityProvider.NAME, userName); identityStorage.saveIdentity(tobeSavedIdentity); Identity foundIdentity = identityStorage.findIdentity(OrganizationIdentityProvider.NAME, userName); assertNotNull(foundIdentity); assertNotNull(foundIdentity.getId()); assertEquals(OrganizationIdentityProvider.NAME, foundIdentity.getProviderId()); assertEquals(userName, foundIdentity.getRemoteId()); tearDownIdentityList.add(foundIdentity); } /** * Tests {@link IdenityStorage#saveProfile(Profile)} * */ public void testSaveProfile() { final String userName = "username"; final String firstName = "FirstName"; final String lastName = "LastName"; final String avatarUrl = "http://localhost:8080/rest-socialdemo/username/avatar.jpg"; Identity tobeSavedIdentity = new Identity(OrganizationIdentityProvider.NAME, userName); identityStorage.saveIdentity(tobeSavedIdentity); Profile tobeSavedProfile = tobeSavedIdentity.getProfile(); tobeSavedProfile.setProperty(Profile.USERNAME, userName); tobeSavedProfile.setProperty(Profile.FIRST_NAME, firstName); tobeSavedProfile.setProperty(Profile.LAST_NAME, lastName); tobeSavedProfile.setProperty(Profile.AVATAR_URL, avatarUrl); assertTrue(tobeSavedProfile.hasChanged()); identityStorage.saveProfile(tobeSavedProfile); assertFalse(tobeSavedProfile.hasChanged()); assertNotNull(tobeSavedProfile.getId()); assertEquals(userName, tobeSavedProfile.getProperty(Profile.USERNAME)); assertEquals(firstName, tobeSavedProfile.getProperty(Profile.FIRST_NAME)); assertEquals(lastName, tobeSavedProfile.getProperty(Profile.LAST_NAME)); assertEquals(avatarUrl, tobeSavedProfile.getProperty(Profile.AVATAR_URL)); assertEquals(firstName + " " + lastName, tobeSavedProfile.getFullName()); tearDownIdentityList.add(identityStorage.findIdentity(OrganizationIdentityProvider.NAME, userName)); } /** * Tests {@link IdenityStorage#loadProfile(Profile)} * */ public void testLoadProfile() throws Exception { final String username = "username"; Identity tobeSavedIdentity = new Identity(OrganizationIdentityProvider.NAME, username); identityStorage.saveIdentity(tobeSavedIdentity); Profile tobeSavedProfile = tobeSavedIdentity.getProfile(); tobeSavedProfile.setProperty(Profile.USERNAME, username); assertTrue(tobeSavedProfile.hasChanged()); tobeSavedProfile = identityStorage.loadProfile(tobeSavedProfile); assertFalse(tobeSavedProfile.hasChanged()); assertNotNull(tobeSavedProfile.getId()); assertEquals(username, tobeSavedProfile.getProperty(Profile.USERNAME)); tearDownIdentityList.add(identityStorage.findIdentity(OrganizationIdentityProvider.NAME, username)); } public void testLoadProfileByReloadCreatedProfileNode() throws Exception { String providerId = "organization"; String remoteId = "username"; Identity identity = new Identity(providerId, remoteId); identityStorage.saveIdentity(identity); String profileId; //this code snippet will create profile node for test case { //create new profile in db without data (lazy creating) Profile profile = new Profile(identity); assertFalse(profile.hasChanged()); profile = identityStorage.loadProfile(profile); assertFalse(profile.hasChanged()); profileId = profile.getId(); } //here is the testcase { Profile profile = new Profile(identity); assertFalse(profile.hasChanged()); profile = identityStorage.loadProfile(profile); assertFalse(profile.hasChanged()); assertEquals(profileId, profile.getId()); } tearDownIdentityList.add(identityStorage.findIdentity(OrganizationIdentityProvider.NAME, remoteId)); } public void testFindIdentityByExistName() throws Exception { String providerId = "organization"; String remoteId = "username"; Identity identity = new Identity(providerId, remoteId); identityStorage.saveIdentity(identity); Profile profile = new Profile(identity); profile.setProperty(Profile.FIRST_NAME, "FirstName"); profile.setProperty(Profile.LAST_NAME, "LastName"); profile.setProperty(Profile.FULL_NAME, "FirstName" + " " + "LastName"); identityStorage.saveProfile(profile); identity.setProfile(profile); tearDownIdentityList.add(identity); final ProfileFilter filter = new ProfileFilter(); filter.setName("First"); final List<Identity> result = identityStorage.getIdentitiesByProfileFilter(providerId, filter, 0, 1, false); assertEquals(1, result.size()); } public void testFindManyIdentitiesByExistName() throws Exception { final String providerId = "organization"; final int total = 10; for (int i = 0; i < total; i++) { String remoteId = "username" + i; Identity identity = new Identity(providerId, remoteId+i); identityStorage.saveIdentity(identity); Profile profile = new Profile(identity); profile.setProperty(Profile.FIRST_NAME, "FirstName"+ i); profile.setProperty(Profile.LAST_NAME, "LastName" + i); profile.setProperty(Profile.FULL_NAME, "FirstName" + i + " " + "LastName" + i); identityStorage.saveProfile(profile); identity.setProfile(profile); tearDownIdentityList.add(identity); } final ProfileFilter filter = new ProfileFilter(); filter.setName("FirstName"); final List<Identity> result = identityStorage.getIdentitiesByProfileFilter(providerId, filter, 0, total, false); assertEquals(total, result.size()); } public void testFindIdentityByNotExistName() throws Exception { String providerId = "organization"; String remoteId = "username"; Identity identity = new Identity(providerId, remoteId); identityStorage.saveIdentity(identity); Profile profile = new Profile(identity); profile.setProperty(Profile.FIRST_NAME, "FirstName"); profile.setProperty(Profile.LAST_NAME, "LastName"); profile.setProperty(Profile.FULL_NAME, "FirstName" + " " + "LastName"); identityStorage.saveProfile(profile); identity.setProfile(profile); tearDownIdentityList.add(identity); final ProfileFilter filter = new ProfileFilter(); filter.setName("notfound"); final List<Identity> result = identityStorage.getIdentitiesByProfileFilter(providerId, filter, 0, 1, false); assertEquals(0, result.size()); } /** * Tests {@link IdenityStorage#getIdentitiesByProfileFilter(String, ProfileFilter, int, int, boolean)} * */ public void testFindIdentityByProfileFilter() throws Exception { String providerId = "organization"; String remoteId = "username"; Identity identity = new Identity(providerId, remoteId); identityStorage.saveIdentity(identity); Profile profile = new Profile(identity); profile.setProperty(Profile.FIRST_NAME, "FirstName"); profile.setProperty(Profile.LAST_NAME, "LastName"); profile.setProperty(Profile.FULL_NAME, "FirstName" + " " + "LastName"); profile.setProperty("position", "developer"); profile.setProperty("gender", "male"); identityStorage.saveProfile(profile); identity.setProfile(profile); tearDownIdentityList.add(identity); final ProfileFilter filter = new ProfileFilter(); filter.setPosition("developer"); filter.setGender("male"); filter.setName("First"); final List<Identity> result = identityStorage.getIdentitiesByProfileFilter(providerId, filter, 0, 1, false); assertEquals(1, result.size()); //create a new identity Identity test2Identity = populateIdentity("test2", false); //check when new identity is not deleted final ProfileFilter profileFilter2 = new ProfileFilter(); List<Identity> foundIdentities = identityStorage.getIdentitiesByProfileFilter(providerId, profileFilter2, 0, 10, false); assertEquals("foundIdentities.size() must be 1", 2, foundIdentities.size()); //finds the second one profileFilter2.setName("g"); foundIdentities = identityStorage.getIdentitiesByProfileFilter(providerId, profileFilter2, 0, 10, false); assertEquals("foundIdentities.size() must be 1", 1, foundIdentities.size()); //check when new identity is deleted identityStorage.deleteIdentity(test2Identity); foundIdentities = identityStorage.getIdentitiesByProfileFilter(providerId, profileFilter2, 0, 10, false); assertEquals("foundIdentities.size() must be 0", 0, foundIdentities.size()); } /** * Tests {@link IdenityStorage#getIdentitiesByProfileFilter(String, ProfileFilter, int, int, boolean)} * */ public void testFindManyIdentitiesByProfileFilter() throws Exception { String providerId = "organization"; int total = 10; for (int i = 0; i < total; i++) { String remoteId = "username" + i; Identity identity = new Identity(providerId, remoteId); identityStorage.saveIdentity(identity); Profile profile = new Profile(identity); profile.setProperty(Profile.FIRST_NAME, "FirstName" + i); profile.setProperty(Profile.LAST_NAME, "LastName"); profile.setProperty(Profile.FULL_NAME, "FirstName" + i + " " + "LastName" + i); profile.setProperty(Profile.POSITION, "developer"); profile.setProperty(Profile.GENDER, "male"); identity.setProfile(profile); tearDownIdentityList.add(identity); identityStorage.saveProfile(profile); } final ProfileFilter filter = new ProfileFilter(); filter.setPosition("developer"); filter.setGender("male"); filter.setName("FirstN"); final List<Identity> result = identityStorage.getIdentitiesByProfileFilter(providerId, filter, 0, total, false); assertEquals(total, result.size()); } /** * Tests {@link IdenityStorage#getIdentitiesByFirstCharaterOfNameCount(String, char)} * */ public void testGetIdentitiesByFirstCharacterOfNameCount() throws Exception { populateData(); final ProfileFilter filter = new ProfileFilter(); filter.setFirstCharacterOfName('F'); int idsCount = identityStorage.getIdentitiesByFirstCharacterOfNameCount("organization", filter); assertEquals("Number of identity must be " + idsCount, 10, idsCount); filter.setFirstCharacterOfName('L'); idsCount = identityStorage.getIdentitiesByFirstCharacterOfNameCount("organization", filter); assertEquals("Number of identity must be " + idsCount, 0, idsCount); } /** * Tests {@link IdenityStorage#getIdentitiesByFirstCharaterOfName(String, char, int, int, boolean)} * */ public void testGetIdentitiesByFirstCharacterOfName() throws Exception { populateData(); final ProfileFilter filter = new ProfileFilter(); filter.setFirstCharacterOfName('F'); assertEquals(1, identityStorage.getIdentitiesByFirstCharacterOfName("organization", filter, 0, 1, false).size()); assertEquals(10, identityStorage.getIdentitiesByFirstCharacterOfName("organization", filter, 0, 10, false).size()); filter.setFirstCharacterOfName('L'); assertEquals(0, identityStorage.getIdentitiesByFirstCharacterOfName("organization", filter, 0, 10, false).size()); } /** * Tests {@link IdenityStorage#getIdentitiesByProfileFilterCount(String, ProfileFilter)} * */ public void testGetIdentitiesByProfileFilterCount() throws Exception { populateData(); ProfileFilter pf = new ProfileFilter(); int idsCount = identityStorage.getIdentitiesByProfileFilterCount("organization", pf); assertEquals(10, idsCount); pf.setPosition("developer"); pf.setGender("male"); pf.setName("FirstName"); idsCount = identityStorage.getIdentitiesByProfileFilterCount("organization", pf); assertEquals(10, idsCount); pf.setName("LastN"); idsCount = identityStorage.getIdentitiesByProfileFilterCount("organization", pf); assertEquals(10, idsCount); pf.setGender("female"); idsCount = identityStorage.getIdentitiesByProfileFilterCount("organization", pf); assertEquals(0, idsCount); } /** * Tests {@link IdenityStorage#getIdentitiesByProfileFilterCount(String, ProfileFilter, int, int, boolean)} * */ public void testGetIdentitiesByProfileFilterAccessList() throws Exception { populateData(); ProfileFilter pf = new ProfileFilter(); List<Identity> identities = identityStorage.getIdentitiesByProfileFilter("organization", pf, 0, 20, false); assertEquals("Number of identities must be " + identities.size(), 10, identities.size()); pf.setPosition("developer"); pf.setGender("male"); pf.setName("FirstName"); identities = identityStorage.getIdentitiesByProfileFilter("organization", pf, 0, 20, false); assertEquals("Number of identities must be " + identities.size(), 10, identities.size()); try { identities = identityStorage.getIdentitiesByProfileFilter("organization", pf, -1, 20, false); } catch (Exception ext) { assert false : "Can not get Identity by profile filter. " + ext ; } try { identities = identityStorage.getIdentitiesByProfileFilter("organization", pf, 0, -1, false); } catch (Exception ext) { assert false : "Can not get Identity by profile filter. " + ext ; } try { identities = identityStorage.getIdentitiesByProfileFilter("organization", pf, 30, 40, false); } catch (Exception ext) { assert false : "Can not get Identity by profile filter. " + ext ; } } /** * Tests {@link IdenityStorage#findIdentityByProfileFilterCount(String, ProfileFilter)} * */ public void testUpdateIdentity() throws Exception { String providerId = OrganizationIdentityProvider.NAME; String newProviderId = "space"; String userName = "root"; Identity identity = populateIdentity(userName); assertNotNull("Identity must not be null", identity); assertEquals("Identity status must be " + identity.isDeleted(), false, identity.isDeleted()); identity.setDeleted(true); identityStorage.updateIdentity(identity); Identity updatedIdentity = identityStorage.findIdentity(providerId, userName); assertEquals("Identity status must be " + updatedIdentity.isDeleted(), true, updatedIdentity.isDeleted()); identity.setProviderId(newProviderId); identity.setDeleted(false); identityStorage.updateIdentity(identity); updatedIdentity = identityStorage.findIdentity(newProviderId, userName); assertEquals("Identity status must be " + updatedIdentity.isDeleted(), false, updatedIdentity.isDeleted()); assertEquals("Identity provider id must be " + updatedIdentity.getProviderId(), newProviderId, updatedIdentity.getProviderId()); } /** * Tests {@link IdenityStorage#getIdentitiesCount(String)} */ public void testGetIdentitiesCount() throws Exception { populateData(); int identitiesCount = identityStorage.getIdentitiesCount(OrganizationIdentityProvider.NAME); assertEquals("Number of identities must be " + identitiesCount, 10, identitiesCount); } /** * Populate one identity with remoteId. * * @param remoteId * @return */ private Identity populateIdentity(String remoteId) { return populateIdentity(remoteId, false); } /** * Populates one identity with remoteId. * * @param remoteId * @param addedToTearDown * @return */ private Identity populateIdentity(String remoteId, boolean addedToTearDown) { String providerId = "organization"; Identity identity = new Identity(providerId, remoteId); identityStorage.saveIdentity(identity); Profile profile = new Profile(identity); profile.setProperty(Profile.FIRST_NAME, remoteId); profile.setProperty(Profile.LAST_NAME, "gtn"); profile.setProperty(Profile.FULL_NAME, remoteId + " " + "gtn"); profile.setProperty(Profile.POSITION, "developer"); profile.setProperty(Profile.GENDER, "male"); identityStorage.saveProfile(profile); identity.setProfile(profile); if (addedToTearDown) { tearDownIdentityList.add(identity); } return identity; } private void populateData() { String providerId = "organization"; int total = 10; for (int i = 0; i < total; i++) { String remoteId = "username" + i; Identity identity = new Identity(providerId, remoteId); identityStorage.saveIdentity(identity); Profile profile = new Profile(identity); profile.setProperty(Profile.FIRST_NAME, "FirstName" + i); profile.setProperty(Profile.LAST_NAME, "LastName" + i); profile.setProperty(Profile.FULL_NAME, "FirstName" + i + " " + "LastName" + i); profile.setProperty("position", "developer"); profile.setProperty("gender", "male"); identity.setProfile(profile); tearDownIdentityList.add(identity); identityStorage.saveProfile(profile); } } }