/**
* =============================================================================
*
* 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"));
}
}
}