/** * ============================================================================= * * 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.frontend.web.controllers; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.time.DateUtils; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.orcid.core.locale.LocaleManager; import org.orcid.core.manager.EncryptionManager; import org.orcid.jaxb.model.common_v2.Iso3166Country; import org.orcid.jaxb.model.common_v2.Visibility; import org.orcid.jaxb.model.record_v2.Address; import org.orcid.jaxb.model.record_v2.Biography; import org.orcid.jaxb.model.record_v2.Email; import org.orcid.jaxb.model.record_v2.Keyword; import org.orcid.jaxb.model.record_v2.OtherName; import org.orcid.jaxb.model.record_v2.PersonExternalIdentifier; import org.orcid.jaxb.model.record_v2.ResearcherUrl; import org.orcid.persistence.dao.ProfileDao; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.test.DBUnitTest; import org.orcid.test.OrcidJUnit4ClassRunner; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.servlet.ModelAndView; import com.gargoylesoftware.htmlunit.javascript.host.Console; /** * @author Angel Montenegro */ @RunWith(OrcidJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration(locations = { "classpath:orcid-core-context.xml", "classpath:orcid-frontend-web-servlet.xml", "classpath:statistics-core-context.xml" }) public class PublicProfileControllerTest extends DBUnitTest { private static final List<String> DATA_FILES = Arrays.asList("/data/SecurityQuestionEntityData.xml", "/data/SourceClientDetailsEntityData.xml", "/data/ProfileEntityData.xml", "/data/ClientDetailsEntityData.xml", "/data/BiographyEntityData.xml", "/data/OrgsEntityData.xml", "/data/OrgAffiliationEntityData.xml", "/data/PeerReviewEntityData.xml", "/data/ProfileFundingEntityData.xml", "/data/RecordNameEntityData.xml", "/data/WorksEntityData.xml"); private String unclaimedUserOrcid = "0000-0000-0000-0001"; private String userOrcid = "0000-0000-0000-0003"; private String deprecatedUserOrcid = "0000-0000-0000-0004"; private String lockedUserOrcid = "0000-0000-0000-0005"; @Resource PublicProfileController publicProfileController; @Resource private LocaleManager localeManager; @Resource private ProfileDao profileDao; @Resource private EncryptionManager encryptionManager; @Mock //private HttpServletRequest request; private HttpServletRequest request = Mockito.mock(HttpServletRequest.class); @Before public void before() { MockitoAnnotations.initMocks(this); assertNotNull(publicProfileController); Mockito.when(request.getRequestURI()).thenReturn("/"); } @BeforeClass public static void beforeClass() throws Exception { initDBUnitData(DATA_FILES); } @AfterClass public static void afterClass() throws Exception { Collections.reverse(DATA_FILES); removeDBUnitData(DATA_FILES); } @SuppressWarnings("unchecked") @Test public void testViewValidUser() { ModelAndView mav = publicProfileController.publicPreview(request, 1, 0, 15, userOrcid); assertEquals("public_profile_v3", mav.getViewName()); Map<String, Object> model = mav.getModel(); assertNotNull(model); assertTrue(model.containsKey("isPublicProfile")); assertTrue(model.containsKey("effectiveUserOrcid")); assertEquals(userOrcid, model.get("effectiveUserOrcid")); assertTrue(model.containsKey("biography")); Biography biography = (Biography) model.get("biography"); assertEquals("Biography for 0000-0000-0000-0003", biography.getContent()); assertTrue(model.containsKey("displayName")); String displayName = (String) model.get("displayName"); assertEquals("Credit Name", displayName); assertTrue(model.containsKey("title")); assertEquals(localeManager.resolveMessage("layout.public-layout.title", displayName, userOrcid), model.get("title")); assertTrue(model.containsKey("publicGroupedOtherNames")); Map<String, List<OtherName>> groupedOtherNames = (Map<String, List<OtherName>>) model.get("publicGroupedOtherNames"); assertNotNull(groupedOtherNames); assertEquals(1, groupedOtherNames.keySet().size()); assertTrue(groupedOtherNames.containsKey("Other Name PUBLIC")); List<OtherName> publicOtherNames = groupedOtherNames.get("Other Name PUBLIC"); assertEquals(1, publicOtherNames.size()); assertEquals(Long.valueOf(13), publicOtherNames.get(0).getPutCode()); assertEquals("Other Name PUBLIC", publicOtherNames.get(0).getContent()); assertEquals(Visibility.PUBLIC, publicOtherNames.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedAddresses")); Map<String, List<Address>> groupedAddresses = (Map<String, List<Address>>) model.get("publicGroupedAddresses"); assertNotNull(groupedAddresses); assertEquals(1, groupedAddresses.keySet().size()); assertTrue(groupedAddresses.containsKey("US")); List<Address> publicAddresses = groupedAddresses.get("US"); assertEquals(1, publicAddresses.size()); assertEquals(Long.valueOf(9), publicAddresses.get(0).getPutCode()); assertEquals(Iso3166Country.US, publicAddresses.get(0).getCountry().getValue()); assertEquals(Visibility.PUBLIC, publicAddresses.get(0).getVisibility()); assertTrue(model.containsKey("countryNames")); Map<String, String> countryNames = (Map<String, String>) model.get("countryNames"); Map<String, String> testCountry = new HashMap<String, String>(); testCountry.put("US", localeManager.resolveMessage("org.orcid.persistence.jpa.entities.CountryIsoEntity.US")); assertEquals(testCountry, countryNames); assertTrue(model.containsKey("publicGroupedKeywords")); Map<String, List<Keyword>> groupedKeywords = (Map<String, List<Keyword>>) model.get("publicGroupedKeywords"); assertNotNull(groupedKeywords); assertEquals(1, groupedKeywords.keySet().size()); assertTrue(groupedKeywords.containsKey("PUBLIC")); List<Keyword> publicKeywords = groupedKeywords.get("PUBLIC"); assertEquals(1, publicKeywords.size()); assertEquals(Long.valueOf(9), publicKeywords.get(0).getPutCode()); assertEquals("PUBLIC", publicKeywords.get(0).getContent()); assertEquals(Visibility.PUBLIC, publicKeywords.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedResearcherUrls")); Map<String, List<ResearcherUrl>> rUrls = (Map<String, List<ResearcherUrl>>) model.get("publicGroupedResearcherUrls"); assertNotNull(rUrls); assertEquals(1, rUrls.keySet().size()); assertTrue(rUrls.containsKey("http://www.researcherurl.com?id=13")); List<ResearcherUrl> publicResearchUrls = rUrls.get("http://www.researcherurl.com?id=13"); assertEquals(Long.valueOf(13), publicResearchUrls.get(0).getPutCode()); assertEquals("public_rurl", publicResearchUrls.get(0).getUrlName()); assertEquals(Visibility.PUBLIC, publicResearchUrls.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedEmails")); Map<String, List<Email>> emails = ( Map<String, List<Email>>) model.get("publicGroupedEmails"); assertNotNull(emails); assertEquals(1, emails.keySet().size()); assertTrue(emails.containsKey("public_0000-0000-0000-0003@test.orcid.org")); List<Email> publicEmails = emails.get("public_0000-0000-0000-0003@test.orcid.org"); assertEquals("public_0000-0000-0000-0003@test.orcid.org", publicEmails.get(0).getEmail()); assertEquals(Visibility.PUBLIC, publicEmails.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedPersonExternalIdentifiers")); Map<String, List<PersonExternalIdentifier>> extIds = (Map<String, List<PersonExternalIdentifier>>) model.get("publicGroupedPersonExternalIdentifiers"); assertNotNull(extIds); assertEquals(1, extIds.keySet().size()); assertTrue(extIds.containsKey("public_type:public_ref")); List<PersonExternalIdentifier> publicExternalIdentifiers = extIds.get("public_type:public_ref"); assertEquals(Long.valueOf(13), publicExternalIdentifiers.get(0).getPutCode()); assertEquals("http://ext-id/public_ref", publicExternalIdentifiers.get(0).getUrl().getValue()); assertEquals(Visibility.PUBLIC, publicExternalIdentifiers.get(0).getVisibility()); assertTrue(model.containsKey("workIdsJson")); assertEquals("[11]", model.get("workIdsJson")); assertTrue(model.containsKey("affiliationIdsJson")); assertEquals("[17,20]", model.get("affiliationIdsJson")); assertTrue(model.containsKey("fundingIdsJson")); assertEquals("[10]", model.get("fundingIdsJson")); assertTrue(model.containsKey("peerReviewIdsJson")); assertEquals("[9]", model.get("peerReviewIdsJson")); assertTrue(model.containsKey("isProfileEmpty")); Boolean isProfileEmpty = (Boolean) model.get("isProfileEmpty"); assertFalse(isProfileEmpty); assertFalse(model.containsKey("noIndex")); } @Test public void testViewLockedUser() { String displayName = localeManager.resolveMessage("public_profile.deactivated.given_names") + " " + localeManager.resolveMessage("public_profile.deactivated.family_name"); ModelAndView mav = publicProfileController.publicPreview(request, 1, 0, 15, lockedUserOrcid); Map<String, Object> model = mav.getModel(); assertUnavailableProfileBasicData(mav, lockedUserOrcid, displayName); assertTrue(model.containsKey("locked")); assertTrue(Boolean.TRUE.equals(model.get("locked"))); } @Test public void testViewDeprecatedUser() { ModelAndView mav = publicProfileController.publicPreview(request, 1, 0, 15, deprecatedUserOrcid); Map<String, Object> model = mav.getModel(); assertUnavailableProfileBasicData(mav, deprecatedUserOrcid, null); assertTrue(model.containsKey("deprecated")); assertTrue(Boolean.TRUE.equals(model.get("deprecated"))); assertTrue(model.containsKey("primaryRecord")); assertEquals("0000-0000-0000-0003", model.get("primaryRecord")); } @Test public void testViewClaimedUserBeforeIsLongEnough() { ProfileEntity profile = profileDao.find(unclaimedUserOrcid); profile.setSubmissionDate(new Date()); profileDao.merge(profile); profileDao.flush(); String displayName = localeManager.resolveMessage("orcid.reserved_for_claim"); ModelAndView mav = publicProfileController.publicPreview(request, 1, 0, 15, unclaimedUserOrcid); assertUnavailableProfileBasicData(mav, unclaimedUserOrcid, displayName); } @Test public void testViewClaimedUserWhenIsLongEnough() { //Update the submission date so it is long enough ProfileEntity profileEntity = profileDao.find(unclaimedUserOrcid); profileEntity.setSubmissionDate(DateUtils.addDays(new Date(), -10)); profileDao.merge(profileEntity); profileDao.flush(); ModelAndView mav = publicProfileController.publicPreview(request, 1, 0, 15, unclaimedUserOrcid); assertEquals("public_profile_v3", mav.getViewName()); Map<String, Object> model = mav.getModel(); assertNotNull(model); assertTrue(model.containsKey("isPublicProfile")); assertTrue(model.containsKey("effectiveUserOrcid")); assertEquals(unclaimedUserOrcid, model.get("effectiveUserOrcid")); assertTrue(!model.containsKey("biography")); assertFalse(model.containsKey("displayName")); assertFalse(model.containsKey("title")); assertTrue(model.containsKey("publicGroupedOtherNames")); Map<String, List<OtherName>> groupedOtherNames = (Map<String, List<OtherName>>) model.get("publicGroupedOtherNames"); assertNotNull(groupedOtherNames); assertEquals(1, groupedOtherNames.keySet().size()); List<OtherName> publicOtherNames = groupedOtherNames.get("PUBLIC"); assertEquals(1, publicOtherNames.size()); assertEquals(Long.valueOf(18), publicOtherNames.get(0).getPutCode()); assertEquals("PUBLIC", publicOtherNames.get(0).getContent()); assertEquals(Visibility.PUBLIC, publicOtherNames.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedAddresses")); Map<String, List<Address>> groupedAddresses = (Map<String, List<Address>>) model.get("publicGroupedAddresses"); assertNotNull(groupedAddresses); assertEquals(1, groupedAddresses.keySet().size()); assertTrue(groupedAddresses.containsKey("US")); List<Address> publicAddresses = groupedAddresses.get("US"); assertEquals(1, publicAddresses.size()); assertEquals(Long.valueOf(14), publicAddresses.get(0).getPutCode()); assertEquals(Iso3166Country.US, publicAddresses.get(0).getCountry().getValue()); assertEquals(Visibility.PUBLIC, publicAddresses.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedKeywords")); Map<String, List<Keyword>> groupedKeywords = (Map<String, List<Keyword>>) model.get("publicGroupedKeywords"); assertNotNull(groupedKeywords); assertEquals(1, groupedKeywords.keySet().size()); List<Keyword> publicKeywords = groupedKeywords.get("PUBLIC"); assertEquals(Long.valueOf(14), publicKeywords.get(0).getPutCode()); assertEquals("PUBLIC", publicKeywords.get(0).getContent()); assertEquals(Visibility.PUBLIC, publicKeywords.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedResearcherUrls")); Map<String, List<ResearcherUrl>> rUrls = ( Map<String, List<ResearcherUrl>>) model.get("publicGroupedResearcherUrls"); assertNotNull(rUrls); assertEquals(1, rUrls.keySet().size()); assertTrue(rUrls.containsKey("http://www.researcherurl.com?id=18")); List<ResearcherUrl> publicResearchUrls = rUrls.get("http://www.researcherurl.com?id=18"); assertEquals(Long.valueOf(18), publicResearchUrls.get(0).getPutCode()); assertEquals("public", publicResearchUrls.get(0).getUrlName()); assertEquals(Visibility.PUBLIC, publicResearchUrls.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedEmails")); Map<String, List<Email>> emails = (Map<String, List<Email>>) model.get("publicGroupedEmails"); assertNotNull(emails); assertEquals(1, emails.keySet().size()); List<Email> groupedEmails = emails.get("public_0000-0000-0000-0001@test.orcid.org"); assertEquals("public_0000-0000-0000-0001@test.orcid.org", groupedEmails.get(0).getEmail()); assertEquals(Visibility.PUBLIC, groupedEmails.get(0).getVisibility()); assertTrue(model.containsKey("publicGroupedPersonExternalIdentifiers")); Map<String, List<PersonExternalIdentifier>> extIds = (Map<String, List<PersonExternalIdentifier>>) model.get("publicGroupedPersonExternalIdentifiers"); assertNotNull(extIds); assertEquals(1, extIds.keySet().size()); assertTrue(extIds.containsKey("public:public")); List<PersonExternalIdentifier> publicExternalIdentifiers = extIds.get("public:public"); assertEquals(Long.valueOf(18), publicExternalIdentifiers.get(0).getPutCode()); assertEquals("http://ext-id/self/public", publicExternalIdentifiers.get(0).getUrl().getValue()); assertEquals(Visibility.PUBLIC, publicExternalIdentifiers.get(0).getVisibility()); assertTrue(model.containsKey("isProfileEmpty")); Boolean isProfileEmpty = (Boolean) model.get("isProfileEmpty"); assertTrue(isProfileEmpty); assertFalse(model.containsKey("noIndex")); //Update the submission date so it is not long enough profileEntity = profileDao.find(unclaimedUserOrcid); profileEntity.setSubmissionDate(new Date()); profileDao.merge(profileEntity); profileDao.flush(); } private void assertUnavailableProfileBasicData(ModelAndView mav, String orcid, String displayName) { assertEquals("public_profile_unavailable", mav.getViewName()); Map<String, Object> model = mav.getModel(); assertTrue(model.containsKey("effectiveUserOrcid")); assertEquals(orcid, model.get("effectiveUserOrcid")); if(displayName != null) { assertTrue(model.containsKey("displayName")); assertEquals(displayName, model.get("displayName")); assertTrue(model.containsKey("title")); assertEquals(localeManager.resolveMessage("layout.public-layout.title", displayName, orcid), model.get("title")); } } }