/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.core.manager.impl; 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.assertTrue; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.orcid.core.manager.BiographyManager; import org.orcid.core.manager.EmailManager; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.core.manager.ProfileEntityManager; import org.orcid.core.manager.RecordNameManager; import org.orcid.core.oauth.OrcidOauth2TokenDetailService; import org.orcid.jaxb.model.common_v2.Visibility; import org.orcid.jaxb.model.common_v2.Locale; import org.orcid.persistence.dao.UserConnectionDao; import org.orcid.persistence.jpa.entities.AddressEntity; import org.orcid.persistence.jpa.entities.ExternalIdentifierEntity; import org.orcid.persistence.jpa.entities.OrcidOauth2TokenDetail; import org.orcid.persistence.jpa.entities.OtherNameEntity; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.persistence.jpa.entities.ProfileKeywordEntity; import org.orcid.persistence.jpa.entities.ResearcherUrlEntity; import org.orcid.persistence.jpa.entities.UserConnectionStatus; import org.orcid.persistence.jpa.entities.UserconnectionEntity; import org.orcid.persistence.jpa.entities.UserconnectionPK; import org.orcid.pojo.ApplicationSummary; import org.orcid.pojo.ajaxForm.Checkbox; import org.orcid.pojo.ajaxForm.Claim; import org.orcid.pojo.ajaxForm.Text; import org.orcid.test.DBUnitTest; import org.orcid.test.OrcidJUnit4ClassRunner; import org.springframework.test.context.ContextConfiguration; import org.springframework.transaction.annotation.Transactional; /** * @author: Declan Newman (declan) Date: 10/02/2012 */ @RunWith(OrcidJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:orcid-core-context.xml" }) public class ProfileEntityManagerImplTest extends DBUnitTest { private static final String CLIENT_ID_1 = "APP-5555555555555555"; private static final String USER_ORCID = "0000-0000-0000-0001"; @Resource private OrcidOauth2TokenDetailService orcidOauth2TokenDetailService; @Resource private ProfileEntityManager profileEntityManager; @Resource(name = "profileEntityCacheManager") private ProfileEntityCacheManager profileEntityCacheManager; @Resource private EmailManager emailManager; @Resource private RecordNameManager recordNameManager; @Resource private BiographyManager biographyManager; @Resource private UserConnectionDao userConnectionDao; @BeforeClass public static void initDBUnitData() throws Exception { initDBUnitData(Arrays.asList("/data/SecurityQuestionEntityData.xml", "/data/SourceClientDetailsEntityData.xml", "/data/ProfileEntityData.xml", "/data/RecordNameEntityData.xml", "/data/BiographyEntityData.xml", "/data/ClientDetailsEntityData.xml")); } @AfterClass public static void removeDBUnitData() throws Exception { removeDBUnitData(Arrays.asList("/data/ClientDetailsEntityData.xml", "/data/RecordNameEntityData.xml", "/data/BiographyEntityData.xml", "/data/ProfileEntityData.xml", "/data/SourceClientDetailsEntityData.xml", "/data/SecurityQuestionEntityData.xml")); } @Test public void testFindByOrcid() throws Exception { String harrysOrcid = "4444-4444-4444-4444"; ProfileEntity profileEntity = profileEntityCacheManager.retrieve(harrysOrcid); assertNotNull(profileEntity); if(profileEntity.getRecordNameEntity() != null) { assertEquals("Harry", profileEntity.getRecordNameEntity().getGivenNames()); assertEquals("Secombe", profileEntity.getRecordNameEntity().getFamilyName()); } assertEquals(harrysOrcid, profileEntity.getId()); } @Test public void testDeprecateProfile() throws Exception { UserconnectionPK pk = new UserconnectionPK(); pk.setProviderid("providerId"); pk.setProvideruserid("provideruserid"); pk.setUserid("4444-4444-4444-4441"); UserconnectionEntity userConnection = new UserconnectionEntity(); userConnection.setAccesstoken("blah"); userConnection.setConnectionSatus(UserConnectionStatus.STARTED); userConnection.setDisplayname("blah"); userConnection.setDateCreated(new Date()); userConnection.setLastModified(new Date()); userConnection.setEmail("blah@blah.com"); userConnection.setOrcid("4444-4444-4444-4441"); userConnection.setId(pk); userConnection.setRank(1); userConnectionDao.persist(userConnection); ProfileEntity profileEntityToDeprecate = profileEntityCacheManager.retrieve("4444-4444-4444-4441"); assertNull(profileEntityToDeprecate.getPrimaryRecord()); boolean result = profileEntityManager.deprecateProfile("4444-4444-4444-4441", "4444-4444-4444-4442"); assertTrue(result); profileEntityToDeprecate = profileEntityCacheManager.retrieve("4444-4444-4444-4441"); assertNotNull(profileEntityToDeprecate.getPrimaryRecord()); assertEquals("4444-4444-4444-4442", profileEntityToDeprecate.getPrimaryRecord().getId()); assertEquals(0, userConnectionDao.findByOrcid("4444-4444-4444-4441").size()); } @Test public void testReviewProfile() throws Exception { boolean result = profileEntityManager.reviewProfile("4444-4444-4444-4441"); assertTrue(result); result = profileEntityManager.unreviewProfile("4444-4444-4444-4442"); assertTrue(result); } @Test @Transactional public void testClaimChangingVisibility() { Claim claim = new Claim(); claim.setActivitiesVisibilityDefault(org.orcid.pojo.ajaxForm.Visibility.valueOf(Visibility.PRIVATE)); claim.setPassword(Text.valueOf("passwordTest1")); claim.setPasswordConfirm(Text.valueOf("passwordTest1")); Checkbox checked = new Checkbox(); checked.setValue(true); claim.setSendChangeNotifications(checked); claim.setSendOrcidNews(checked); claim.setTermsOfUse(checked); assertTrue(profileEntityManager.claimProfileAndUpdatePreferences("0000-0000-0000-0001", "public_0000-0000-0000-0001@test.orcid.org", Locale.EN, claim)); ProfileEntity profile = profileEntityManager.findByOrcid("0000-0000-0000-0001"); assertNotNull(profile); assertNotNull(profile.getBiographyEntity()); assertEquals(org.orcid.jaxb.model.common_v2.Visibility.PRIVATE, profile.getBiographyEntity().getVisibility()); assertNotNull(profile.getAddresses()); assertEquals(3, profile.getAddresses().size()); for(AddressEntity a : profile.getAddresses()) { assertEquals(org.orcid.jaxb.model.common_v2.Visibility.PRIVATE, a.getVisibility()); } assertNotNull(profile.getExternalIdentifiers()); assertEquals(3, profile.getExternalIdentifiers().size()); for(ExternalIdentifierEntity e : profile.getExternalIdentifiers()) { assertEquals(org.orcid.jaxb.model.common_v2.Visibility.PRIVATE, e.getVisibility()); } assertNotNull(profile.getKeywords()); assertEquals(3, profile.getKeywords().size()); for(ProfileKeywordEntity k : profile.getKeywords()) { assertEquals(org.orcid.jaxb.model.common_v2.Visibility.PRIVATE, k.getVisibility()); } assertNotNull(profile.getOtherNames()); assertEquals(3, profile.getOtherNames().size()); for(OtherNameEntity o : profile.getOtherNames()) { assertEquals(org.orcid.jaxb.model.common_v2.Visibility.PRIVATE, o.getVisibility()); } assertNotNull(profile.getResearcherUrls()); assertEquals(3, profile.getResearcherUrls().size()); for(ResearcherUrlEntity r : profile.getResearcherUrls()) { assertEquals(org.orcid.jaxb.model.common_v2.Visibility.PRIVATE, r.getVisibility()); } } @Test public void testGetApplications() { Date expiration = new Date(System.currentTimeMillis() + 10000); OrcidOauth2TokenDetail token1 = createToken(CLIENT_ID_1, "token-1", USER_ORCID, expiration, "/read-limited", false); OrcidOauth2TokenDetail token2 = createToken(CLIENT_ID_1, "token-2", USER_ORCID, expiration, "/orcid-profile/read-limited", false); OrcidOauth2TokenDetail token3 = createToken(CLIENT_ID_1, "token-3", USER_ORCID, expiration, "/activities/update", false); OrcidOauth2TokenDetail token4 = createToken(CLIENT_ID_1, "token-4", USER_ORCID, expiration, "/activities/read-limited", false); OrcidOauth2TokenDetail token5 = createToken(CLIENT_ID_1, "token-5", USER_ORCID, expiration, "/orcid-works/read-limited", false); List<ApplicationSummary> applications = profileEntityManager.getApplications(USER_ORCID); assertNotNull(applications); assertEquals(5, applications.size()); boolean found1 = false, found2=false, found3 = false, found4 = false, found5 = false; for(ApplicationSummary summary : applications) { assertNotNull(summary.getTokenId()); if(summary.getTokenId().equals(String.valueOf(token1.getId()))) { found1 = true; } else if(summary.getTokenId().equals(String.valueOf(token2.getId()))) { found2 = true; } else if(summary.getTokenId().equals(String.valueOf(token3.getId()))) { found3 = true; } else if(summary.getTokenId().equals(String.valueOf(token4.getId()))) { found4 = true; } else if(summary.getTokenId().equals(String.valueOf(token5.getId()))) { found5 = true; } } assertTrue(found1); assertTrue(found2); assertTrue(found3); assertTrue(found4); assertTrue(found5); //Assert we can delete them profileEntityManager.disableApplication(token1.getId(), USER_ORCID); profileEntityManager.disableApplication(token5.getId(), USER_ORCID); found1 = found2 = found3 = found4 = found5 = false; applications = profileEntityManager.getApplications(USER_ORCID); assertEquals(3, applications.size()); for(ApplicationSummary summary : applications) { assertNotNull(summary.getTokenId()); if(summary.getTokenId().equals(String.valueOf(token1.getId()))) { found1 = true; } else if(summary.getTokenId().equals(String.valueOf(token2.getId()))) { found2 = true; } else if(summary.getTokenId().equals(String.valueOf(token3.getId()))) { found3 = true; } else if(summary.getTokenId().equals(String.valueOf(token4.getId()))) { found4 = true; } else if(summary.getTokenId().equals(String.valueOf(token5.getId()))) { found5 = true; } } assertFalse(found1); assertTrue(found2); assertTrue(found3); assertTrue(found4); assertFalse(found5); //Revoke the others profileEntityManager.disableApplication(token2.getId(), USER_ORCID); profileEntityManager.disableApplication(token3.getId(), USER_ORCID); profileEntityManager.disableApplication(token4.getId(), USER_ORCID); applications = profileEntityManager.getApplications(USER_ORCID); assertNotNull(applications); assertTrue(applications.isEmpty()); } @SuppressWarnings("unused") @Test public void testDontGetDuplicatedApplications() { Date expiration = new Date(System.currentTimeMillis() + 10000); OrcidOauth2TokenDetail token1 = createToken(CLIENT_ID_1, "token-1", USER_ORCID, expiration, "/read-limited", false); // Displayed OrcidOauth2TokenDetail token2 = createToken(CLIENT_ID_1, "token-2", USER_ORCID, expiration, "/orcid-profile/read-limited", false); // Displayed OrcidOauth2TokenDetail token3 = createToken(CLIENT_ID_1, "token-3", USER_ORCID, expiration, "/activities/update", false); // Displayed OrcidOauth2TokenDetail token4 = createToken(CLIENT_ID_1, "token-4", USER_ORCID, expiration, "/read-limited", false); OrcidOauth2TokenDetail token5 = createToken(CLIENT_ID_1, "token-5", USER_ORCID, expiration, "/orcid-profile/read-limited", false); OrcidOauth2TokenDetail token6 = createToken(CLIENT_ID_1, "token-6", USER_ORCID, expiration, "/activities/update", false); OrcidOauth2TokenDetail token7 = createToken(CLIENT_ID_1, "token-7", USER_ORCID, expiration, "/read-limited", false); OrcidOauth2TokenDetail token8 = createToken(CLIENT_ID_1, "token-8", USER_ORCID, expiration, "/orcid-profile/read-limited", false); OrcidOauth2TokenDetail token9 = createToken(CLIENT_ID_1, "token-9", USER_ORCID, expiration, "/activities/update", false); OrcidOauth2TokenDetail token10 = createToken(CLIENT_ID_1, "token-10", USER_ORCID, expiration, "/person/read-limited", false); // Displayed OrcidOauth2TokenDetail token11 = createToken(CLIENT_ID_1, "token-11", USER_ORCID, expiration, "/person/read-limited", false); List<ApplicationSummary> applications = profileEntityManager.getApplications(USER_ORCID); assertNotNull(applications); assertEquals(4, applications.size()); boolean found1 = false, found2 = false, found3 = false, found10 = false; for(ApplicationSummary summary : applications) { assertNotNull(summary.getTokenId()); if(summary.getTokenId().equals(String.valueOf(token1.getId()))) { found1 = true; } else if(summary.getTokenId().equals(String.valueOf(token2.getId()))) { found2 = true; } else if(summary.getTokenId().equals(String.valueOf(token3.getId()))) { found3 = true; } else if(summary.getTokenId().equals(String.valueOf(token10.getId()))) { found10 = true; } } assertTrue(found1); assertTrue(found2); assertTrue(found3); assertTrue(found10); //Revoke them to check revoking one revokes all the ones with the same scopes profileEntityManager.disableApplication(token1.getId(), USER_ORCID); profileEntityManager.disableApplication(token2.getId(), USER_ORCID); applications = profileEntityManager.getApplications(USER_ORCID); assertNotNull(applications); assertEquals(2, applications.size()); found1 = found2 = found3 = found10 = false; for(ApplicationSummary summary : applications) { assertNotNull(summary.getTokenId()); if(summary.getTokenId().equals(String.valueOf(token1.getId()))) { found1 = true; } else if(summary.getTokenId().equals(String.valueOf(token2.getId()))) { found2 = true; } else if(summary.getTokenId().equals(String.valueOf(token3.getId()))) { found3 = true; } else if(summary.getTokenId().equals(String.valueOf(token10.getId()))) { found10 = true; } } assertFalse(found1); assertFalse(found2); assertTrue(found3); assertTrue(found10); //Revoke them all profileEntityManager.disableApplication(token3.getId(), USER_ORCID); profileEntityManager.disableApplication(token10.getId(), USER_ORCID); applications = profileEntityManager.getApplications(USER_ORCID); assertNotNull(applications); assertTrue(applications.isEmpty()); } private OrcidOauth2TokenDetail createToken(String clientId, String tokenValue, String userOrcid, Date expirationDate, String scopes, boolean disabled) { OrcidOauth2TokenDetail token = new OrcidOauth2TokenDetail(); token.setApproved(true); token.setClientDetailsId(clientId); token.setDateCreated(new Date()); token.setLastModified(new Date()); token.setProfile(new ProfileEntity(userOrcid)); token.setScope(scopes); token.setTokenDisabled(disabled); token.setTokenExpiration(expirationDate); token.setTokenType("bearer"); token.setTokenValue(tokenValue); orcidOauth2TokenDetailService.saveOrUpdate(token); return token; } }