/** * ============================================================================= * * 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.api.memberV2.server.delegator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.annotation.Resource; import javax.ws.rs.core.Response; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.orcid.core.exception.OrcidUnauthorizedException; import org.orcid.core.utils.SecurityContextTestUtils; import org.orcid.jaxb.model.common_v2.Visibility; import org.orcid.jaxb.model.groupid_v2.GroupIdRecord; import org.orcid.jaxb.model.message.ScopePathType; import org.orcid.jaxb.model.record_v2.Address; import org.orcid.jaxb.model.record_v2.Education; import org.orcid.jaxb.model.record_v2.Employment; import org.orcid.jaxb.model.record_v2.Funding; import org.orcid.jaxb.model.record_v2.Keyword; import org.orcid.jaxb.model.record_v2.OtherName; import org.orcid.jaxb.model.record_v2.PeerReview; import org.orcid.jaxb.model.record_v2.PersonExternalIdentifier; import org.orcid.jaxb.model.record_v2.PersonalDetails; import org.orcid.jaxb.model.record_v2.ResearcherUrl; import org.orcid.jaxb.model.record_v2.Work; import org.orcid.jaxb.model.record_v2.WorkBulk; import org.orcid.test.DBUnitTest; import org.orcid.test.OrcidJUnit4ClassRunner; import org.orcid.test.helper.Utils; import org.springframework.test.context.ContextConfiguration; @RunWith(OrcidJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:orcid-api-web-context.xml", "classpath:orcid-api-security-context.xml" }) public class MemberV2ApiServiceDelegator_PersonalDetailsTest extends DBUnitTest { protected static final List<String> DATA_FILES = Arrays.asList("/data/EmptyEntityData.xml", "/data/SecurityQuestionEntityData.xml", "/data/SourceClientDetailsEntityData.xml", "/data/ProfileEntityData.xml", "/data/ClientDetailsEntityData.xml", "/data/Oauth2TokenDetailsData.xml", "/data/RecordNameEntityData.xml", "/data/BiographyEntityData.xml"); // Now on, for any new test, PLAESE USER THIS ORCID ID protected final String ORCID = "0000-0000-0000-0003"; @Resource(name = "memberV2ApiServiceDelegator") protected MemberV2ApiServiceDelegator<Education, Employment, PersonExternalIdentifier, Funding, GroupIdRecord, OtherName, PeerReview, ResearcherUrl, Work, WorkBulk, Address, Keyword> serviceDelegator; @BeforeClass public static void initDBUnitData() throws Exception { initDBUnitData(DATA_FILES); } @AfterClass public static void removeDBUnitData() throws Exception { Collections.reverse(DATA_FILES); removeDBUnitData(DATA_FILES); } @Test public void testViewPersonalDetailsReadPublic() { SecurityContextTestUtils.setUpSecurityContextForClientOnly("APP-5555555555555555", ScopePathType.READ_PUBLIC); Response r = serviceDelegator.viewPersonalDetails(ORCID); PersonalDetails element = (PersonalDetails) r.getEntity(); assertNotNull(element); assertEquals("/0000-0000-0000-0003/personal-details", element.getPath()); Utils.assertIsPublicOrSource(element, "APP-5555555555555555"); } @Test(expected = OrcidUnauthorizedException.class) public void testViewPersonalDetailsWrongToken() { SecurityContextTestUtils.setUpSecurityContext("some-other-user", ScopePathType.READ_LIMITED); serviceDelegator.viewPersonalDetails(ORCID); } @Test public void testReadPublicScope_PersonalDetails() { SecurityContextTestUtils.setUpSecurityContext(ORCID, ScopePathType.READ_PUBLIC); Response r = serviceDelegator.viewPersonalDetails(ORCID); assertNotNull(r); assertEquals(PersonalDetails.class.getName(), r.getEntity().getClass().getName()); PersonalDetails p = (PersonalDetails) r.getEntity(); assertEquals("/0000-0000-0000-0003/personal-details", p.getPath()); Utils.verifyLastModified(p.getLastModifiedDate()); Utils.verifyLastModified(p.getBiography().getLastModifiedDate()); Utils.verifyLastModified(p.getName().getLastModifiedDate()); Utils.verifyLastModified(p.getOtherNames().getLastModifiedDate()); assertEquals("Biography for 0000-0000-0000-0003", p.getBiography().getContent()); assertEquals("Credit Name", p.getName().getCreditName().getContent()); assertEquals("Given Names", p.getName().getGivenNames().getContent()); assertEquals("Family Name", p.getName().getFamilyName().getContent()); assertEquals(3, p.getOtherNames().getOtherNames().size()); boolean found13 = false, found14 = false, found15 = false; for (OtherName element : p.getOtherNames().getOtherNames()) { if (element.getPutCode() == 13) { found13 = true; } else if (element.getPutCode() == 14) { found14 = true; } else if (element.getPutCode() == 15) { found15 = true; } else { fail("Invalid put code " + element.getPutCode()); } } assertTrue(found13); assertTrue(found14); assertTrue(found15); String otherOrcid = "0000-0000-0000-0002"; SecurityContextTestUtils.setUpSecurityContext(otherOrcid, ScopePathType.READ_PUBLIC); r = serviceDelegator.viewPersonalDetails(otherOrcid); assertNotNull(r); assertEquals(PersonalDetails.class.getName(), r.getEntity().getClass().getName()); p = (PersonalDetails) r.getEntity(); assertNull(p.getBiography()); assertNull(p.getName()); assertNotNull(p.getOtherNames()); assertTrue(p.getOtherNames().getOtherNames().isEmpty()); } @Test public void testViewPersonalDetails() { SecurityContextTestUtils.setUpSecurityContext(ORCID, ScopePathType.PERSON_READ_LIMITED); Response response = serviceDelegator.viewPersonalDetails(ORCID); assertNotNull(response); PersonalDetails personalDetails = (PersonalDetails) response.getEntity(); assertNotNull(personalDetails); assertEquals("/0000-0000-0000-0003/personal-details", personalDetails.getPath()); Utils.verifyLastModified(personalDetails.getLastModifiedDate()); assertNotNull(personalDetails.getBiography()); Utils.verifyLastModified(personalDetails.getBiography().getLastModifiedDate()); assertEquals("Biography for 0000-0000-0000-0003", personalDetails.getBiography().getContent()); assertEquals(Visibility.PUBLIC.value(), personalDetails.getBiography().getVisibility().value()); assertEquals("/0000-0000-0000-0003/biography", personalDetails.getBiography().getPath()); assertNotNull(personalDetails.getName()); Utils.verifyLastModified(personalDetails.getName().getLastModifiedDate()); assertNotNull(personalDetails.getName().getCreatedDate().getValue()); assertEquals("Credit Name", personalDetails.getName().getCreditName().getContent()); assertEquals("Family Name", personalDetails.getName().getFamilyName().getContent()); assertEquals("Given Names", personalDetails.getName().getGivenNames().getContent()); assertEquals(Visibility.PUBLIC.value(), personalDetails.getName().getVisibility().value()); assertNotNull(personalDetails.getOtherNames()); Utils.verifyLastModified(personalDetails.getOtherNames().getLastModifiedDate()); assertEquals(4, personalDetails.getOtherNames().getOtherNames().size()); for (OtherName otherName : personalDetails.getOtherNames().getOtherNames()) { Utils.verifyLastModified(otherName.getLastModifiedDate()); if (otherName.getPutCode().equals(Long.valueOf(13))) { assertEquals("Other Name PUBLIC", otherName.getContent()); assertEquals(Long.valueOf(0), otherName.getDisplayIndex()); assertEquals("/0000-0000-0000-0003/other-names/13", otherName.getPath()); assertEquals("APP-5555555555555555", otherName.getSource().retrieveSourcePath()); assertEquals(Visibility.PUBLIC.value(), otherName.getVisibility().value()); } else if (otherName.getPutCode().equals(Long.valueOf(14))) { assertEquals("Other Name LIMITED", otherName.getContent()); assertEquals(Long.valueOf(1), otherName.getDisplayIndex()); assertEquals("/0000-0000-0000-0003/other-names/14", otherName.getPath()); assertEquals("APP-5555555555555555", otherName.getSource().retrieveSourcePath()); assertEquals(Visibility.LIMITED.value(), otherName.getVisibility().value()); } else if (otherName.getPutCode().equals(Long.valueOf(15))) { assertEquals("Other Name PRIVATE", otherName.getContent()); assertEquals(Long.valueOf(2), otherName.getDisplayIndex()); assertEquals("/0000-0000-0000-0003/other-names/15", otherName.getPath()); assertEquals("APP-5555555555555555", otherName.getSource().retrieveSourcePath()); assertEquals(Visibility.PRIVATE.value(), otherName.getVisibility().value()); } else if (otherName.getPutCode().equals(Long.valueOf(16))) { assertEquals("Other Name SELF LIMITED", otherName.getContent()); assertEquals(Long.valueOf(3), otherName.getDisplayIndex()); assertEquals("/0000-0000-0000-0003/other-names/16", otherName.getPath()); assertEquals("0000-0000-0000-0003", otherName.getSource().retrieveSourcePath()); assertEquals(Visibility.LIMITED.value(), otherName.getVisibility().value()); } else { fail("Invalid put code found: " + otherName.getPutCode()); } } assertEquals("/0000-0000-0000-0003/other-names", personalDetails.getOtherNames().getPath()); assertEquals("/0000-0000-0000-0003/personal-details", personalDetails.getPath()); } }