/** * ============================================================================= * * 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.integration.blackbox.api.v2.rc1; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.net.URISyntaxException; import javax.annotation.Resource; import javax.ws.rs.core.Response; import org.codehaus.jettison.json.JSONException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.orcid.integration.api.pub.PublicV2ApiClientImpl; import org.orcid.jaxb.model.common_rc1.Visibility; import org.orcid.jaxb.model.error_rc1.OrcidError; import org.orcid.jaxb.model.message.ScopePathType; import org.orcid.jaxb.model.record_rc1.Education; import org.orcid.jaxb.model.record_rc1.Employment; import org.orcid.jaxb.model.record_rc1.Funding; import org.orcid.jaxb.model.record_rc1.FundingExternalIdentifier; import org.orcid.jaxb.model.record_rc1.FundingExternalIdentifierType; import org.orcid.jaxb.model.record_rc1.PeerReview; import org.orcid.jaxb.model.record_rc1.Relationship; import org.orcid.jaxb.model.record_rc1.Work; import org.orcid.jaxb.model.record_rc1.WorkExternalIdentifier; import org.orcid.jaxb.model.record_rc1.WorkExternalIdentifierId; import org.orcid.jaxb.model.record_rc1.WorkExternalIdentifierType; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.sun.jersey.api.client.ClientResponse; /** * * @author Angel Montenegro * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:test-context.xml" }) public class VerifyOrcidBeforeFetchElementTest extends BlackBoxBaseRC1 { @Resource(name = "memberV2ApiClient_rc1") private MemberV2ApiClientImpl memberV2ApiClient; @Resource(name = "publicV2ApiClient_rc1") private PublicV2ApiClientImpl publicV2ApiClient; @Before public void before() throws JSONException, InterruptedException, URISyntaxException { createGroupIds(); } @Test public void testWork() throws InterruptedException, JSONException, URISyntaxException { long time = System.currentTimeMillis(); Work workToCreate = (Work) unmarshallFromPath("/record_2.0_rc1/samples/work-2.0_rc1.xml", Work.class); workToCreate.setPutCode(null); workToCreate.getExternalIdentifiers().getExternalIdentifier().clear(); WorkExternalIdentifier wExtId = new WorkExternalIdentifier(); wExtId.setWorkExternalIdentifierId(new WorkExternalIdentifierId("Work Id " + time)); wExtId.setWorkExternalIdentifierType(WorkExternalIdentifierType.AGR); wExtId.setRelationship(Relationship.PART_OF); workToCreate.getExternalIdentifiers().getWorkExternalIdentifier().add(wExtId); String user1AccessToken = getAccessToken(); // Create a work ClientResponse postResponse = memberV2ApiClient.createWorkXml(getUser1OrcidId(), workToCreate, user1AccessToken); assertNotNull(postResponse); assertEquals(Response.Status.CREATED.getStatusCode(), postResponse.getStatus()); String locationPath = postResponse.getLocation().getPath(); assertTrue("Location header path should match pattern, but was " + locationPath, locationPath.matches(".*/v2.0_rc1/" + getUser1OrcidId() + "/work/\\d+")); // Fetch it with the owner ClientResponse getResponse = memberV2ApiClient.viewLocationXml(postResponse.getLocation(), user1AccessToken); assertEquals(Response.Status.OK.getStatusCode(), getResponse.getStatus()); Work gotWork = getResponse.getEntity(Work.class); assertEquals("Current treatment of left main coronary artery disease", gotWork.getWorkTitle().getTitle().getContent()); String user2AccessToken = getAccessToken(getUser2OrcidId(), getUser2Password(), getScopes(ScopePathType.ACTIVITIES_UPDATE), getClient1ClientId(), getClient1ClientSecret(), getClient1RedirectUri()); // Try to fetch it with other user orcid // Using the members API ClientResponse user2GetResponse = memberV2ApiClient.viewWorkXml(getUser2OrcidId(), gotWork.getPutCode(), user2AccessToken); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); OrcidError error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Using the public API user2GetResponse = publicV2ApiClient.viewWorkXml(getUser2OrcidId(), String.valueOf(gotWork.getPutCode())); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Delete it ClientResponse deletedResponse = memberV2ApiClient.deleteWorkXml(getUser1OrcidId(), gotWork.getPutCode(), user1AccessToken); assertNotNull(deletedResponse); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), deletedResponse.getStatus()); } @Test public void testEducation() throws InterruptedException, JSONException, URISyntaxException { Education education = (Education) unmarshallFromPath("/record_2.0_rc1/samples/education-2.0_rc1.xml", Education.class); education.setPutCode(null); education.setVisibility(Visibility.PUBLIC); String user1AccessToken = getAccessToken(); // Create an education ClientResponse postResponse = memberV2ApiClient.createEducationXml(getUser1OrcidId(), education, user1AccessToken); assertNotNull(postResponse); assertEquals(Response.Status.CREATED.getStatusCode(), postResponse.getStatus()); String locationPath = postResponse.getLocation().getPath(); assertTrue("Location header path should match pattern, but was " + locationPath, locationPath.matches(".*/v2.0_rc1/" + getUser1OrcidId() + "/education/\\d+")); // Fetch it with the owner ClientResponse getResponse = memberV2ApiClient.viewLocationXml(postResponse.getLocation(), user1AccessToken); assertEquals(Response.Status.OK.getStatusCode(), getResponse.getStatus()); Education gotEducation = getResponse.getEntity(Education.class); assertEquals("education:department-name", gotEducation.getDepartmentName()); assertEquals("education:role-title", gotEducation.getRoleTitle()); String user2AccessToken = getAccessToken(getUser2OrcidId(), getUser2Password(), getScopes(ScopePathType.ACTIVITIES_UPDATE), getClient1ClientId(), getClient1ClientSecret(), getClient1RedirectUri()); // Try to fetch it with other user orcid // Using the members API ClientResponse user2GetResponse = memberV2ApiClient.viewEducationXml(getUser2OrcidId(), gotEducation.getPutCode(), user2AccessToken); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); OrcidError error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Using the public API user2GetResponse = publicV2ApiClient.viewEducationXml(getUser2OrcidId(), String.valueOf(gotEducation.getPutCode())); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Delete it ClientResponse deletedResponse = memberV2ApiClient.deleteEducationXml(getUser1OrcidId(), gotEducation.getPutCode(), user1AccessToken); assertNotNull(deletedResponse); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), deletedResponse.getStatus()); } @Test public void testEmployment() throws InterruptedException, JSONException, URISyntaxException { Employment employment = (Employment) unmarshallFromPath("/record_2.0_rc1/samples/employment-2.0_rc1.xml", Employment.class); employment.setPutCode(null); employment.setVisibility(Visibility.PUBLIC); String user1AccessToken = getAccessToken(); // Create an employment ClientResponse postResponse = memberV2ApiClient.createEmploymentXml(getUser1OrcidId(), employment, user1AccessToken); assertNotNull(postResponse); assertEquals(Response.Status.CREATED.getStatusCode(), postResponse.getStatus()); String locationPath = postResponse.getLocation().getPath(); assertTrue("Location header path should match pattern, but was " + locationPath, locationPath.matches(".*/v2.0_rc1/" + getUser1OrcidId() + "/employment/\\d+")); // Fetch it with the owner ClientResponse getResponse = memberV2ApiClient.viewLocationXml(postResponse.getLocation(), user1AccessToken); assertEquals(Response.Status.OK.getStatusCode(), getResponse.getStatus()); Employment gotEmployment = getResponse.getEntity(Employment.class); assertEquals("affiliation:department-name", gotEmployment.getDepartmentName()); assertEquals("affiliation:role-title", gotEmployment.getRoleTitle()); // Try to fetch it with other user orcid // Using the members API String user2AccessToken = getAccessToken(getUser2OrcidId(), getUser2Password(), getScopes(ScopePathType.ACTIVITIES_UPDATE), getClient1ClientId(), getClient1ClientSecret(), getClient1RedirectUri()); ClientResponse user2GetResponse = memberV2ApiClient.viewEmploymentXml(getUser2OrcidId(), gotEmployment.getPutCode(), user2AccessToken); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); OrcidError error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Using the public API user2GetResponse = publicV2ApiClient.viewEmploymentXml(getUser2OrcidId(), String.valueOf(gotEmployment.getPutCode())); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Delete it ClientResponse deletedResponse = memberV2ApiClient.deleteEducationXml(getUser1OrcidId(), gotEmployment.getPutCode(), user1AccessToken); assertNotNull(deletedResponse); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), deletedResponse.getStatus()); } @Test public void testFunding() throws InterruptedException, JSONException, URISyntaxException { long time = System.currentTimeMillis(); Funding funding = (Funding) unmarshallFromPath("/record_2.0_rc1/samples/funding-2.0_rc1.xml", Funding.class); funding.setPutCode(null); funding.setVisibility(Visibility.PUBLIC); funding.getExternalIdentifiers().getExternalIdentifier().clear(); FundingExternalIdentifier fExtId = new FundingExternalIdentifier(); fExtId.setType(FundingExternalIdentifierType.GRANT_NUMBER); fExtId.setValue("Funding Id " + time); fExtId.setRelationship(Relationship.SELF); funding.getExternalIdentifiers().getExternalIdentifier().add(fExtId); String user1AccessToken = getAccessToken(); // Create an funding ClientResponse postResponse = memberV2ApiClient.createFundingXml(getUser1OrcidId(), funding, user1AccessToken); assertNotNull(postResponse); assertEquals(Response.Status.CREATED.getStatusCode(), postResponse.getStatus()); String locationPath = postResponse.getLocation().getPath(); assertTrue("Location header path should match pattern, but was " + locationPath, locationPath.matches(".*/v2.0_rc1/" + getUser1OrcidId() + "/funding/\\d+")); // Fetch it with the owner ClientResponse getResponse = memberV2ApiClient.viewLocationXml(postResponse.getLocation(), user1AccessToken); assertEquals(Response.Status.OK.getStatusCode(), getResponse.getStatus()); Funding gotFunding = getResponse.getEntity(Funding.class); assertEquals("common:title", gotFunding.getTitle().getTitle().getContent()); assertEquals("common:translated-title", gotFunding.getTitle().getTranslatedTitle().getContent()); // Try to fetch it with other user orcid // Using the members API String user2AccessToken = getAccessToken(getUser2OrcidId(), getUser2Password(), getScopes(ScopePathType.ACTIVITIES_UPDATE), getClient1ClientId(), getClient1ClientSecret(), getClient1RedirectUri()); ClientResponse user2GetResponse = memberV2ApiClient.viewFundingXml(getUser2OrcidId(), gotFunding.getPutCode(), user2AccessToken); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); OrcidError error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Using the public API user2GetResponse = publicV2ApiClient.viewFundingXml(getUser2OrcidId(), String.valueOf(gotFunding.getPutCode())); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Delete it ClientResponse deletedResponse = memberV2ApiClient.deleteFundingXml(getUser1OrcidId(), gotFunding.getPutCode(), user1AccessToken); assertNotNull(deletedResponse); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), deletedResponse.getStatus()); } @Test public void testPeerReview() throws InterruptedException, JSONException, URISyntaxException { long time = System.currentTimeMillis(); PeerReview peerReviewToCreate = (PeerReview) unmarshallFromPath("/record_2.0_rc1/samples/peer-review-2.0_rc1.xml", PeerReview.class); peerReviewToCreate.setPutCode(null); peerReviewToCreate.setGroupId(groupRecords.get(0).getGroupId()); peerReviewToCreate.getExternalIdentifiers().getExternalIdentifier().clear(); WorkExternalIdentifier wExtId = new WorkExternalIdentifier(); wExtId.setWorkExternalIdentifierId(new WorkExternalIdentifierId("Work Id " + time)); wExtId.setWorkExternalIdentifierType(WorkExternalIdentifierType.AGR); wExtId.setRelationship(Relationship.SELF); peerReviewToCreate.getExternalIdentifiers().getExternalIdentifier().add(wExtId); String user1AccessToken = getAccessToken(); // Create an peer review ClientResponse postResponse = memberV2ApiClient.createPeerReviewXml(getUser1OrcidId(), peerReviewToCreate, user1AccessToken); assertNotNull(postResponse); assertEquals(Response.Status.CREATED.getStatusCode(), postResponse.getStatus()); String locationPath = postResponse.getLocation().getPath(); assertTrue("Location header path should match pattern, but was " + locationPath, locationPath.matches(".*/v2.0_rc1/" + getUser1OrcidId() + "/peer-review/\\d+")); // Fetch it with the owner ClientResponse getResponse = memberV2ApiClient.viewLocationXml(postResponse.getLocation(), user1AccessToken); assertEquals(Response.Status.OK.getStatusCode(), getResponse.getStatus()); PeerReview gotPeerReview = getResponse.getEntity(PeerReview.class); assertEquals("peer-review:url", gotPeerReview.getUrl().getValue()); assertEquals("peer-review:subject-name", gotPeerReview.getSubjectName().getTitle().getContent()); // Try to fetch it with other user orcid // Using the members API String user2AccessToken = getAccessToken(getUser2OrcidId(), getUser2Password(), getScopes(ScopePathType.ACTIVITIES_UPDATE), getClient1ClientId(), getClient1ClientSecret(), getClient1RedirectUri()); ClientResponse user2GetResponse = memberV2ApiClient.viewPeerReviewXml(getUser2OrcidId(), gotPeerReview.getPutCode(), user2AccessToken); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); OrcidError error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); //Using the public API user2GetResponse = publicV2ApiClient.viewPeerReviewXml(getUser2OrcidId(), String.valueOf(gotPeerReview.getPutCode())); assertNotNull(user2GetResponse); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), user2GetResponse.getStatus()); error = user2GetResponse.getEntity(OrcidError.class); assertNotNull(error); assertEquals(Integer.valueOf(9016), error.getErrorCode()); // Delete it ClientResponse deletedResponse = memberV2ApiClient.deletePeerReviewXml(getUser1OrcidId(), gotPeerReview.getPutCode(), user1AccessToken); assertNotNull(deletedResponse); assertEquals(Response.Status.NO_CONTENT.getStatusCode(), deletedResponse.getStatus()); } public String getAccessToken() throws InterruptedException, JSONException { return getAccessToken(getScopes(ScopePathType.ACTIVITIES_UPDATE)); } }