/** * ============================================================================= * * 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.analytics; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.net.URI; import java.security.NoSuchAlgorithmException; import javax.annotation.Resource; import javax.ws.rs.core.HttpHeaders; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.orcid.core.analytics.client.AnalyticsClient; import org.orcid.core.manager.ClientDetailsEntityCacheManager; import org.orcid.core.manager.EncryptionManager; import org.orcid.core.manager.ProfileEntityCacheManager; import org.orcid.jaxb.model.clientgroup.ClientType; import org.orcid.persistence.jpa.entities.ClientDetailsEntity; import org.orcid.persistence.jpa.entities.ProfileEntity; import org.orcid.test.OrcidJUnit4ClassRunner; import org.springframework.test.context.ContextConfiguration; import com.sun.jersey.core.header.InBoundHeaders; import com.sun.jersey.server.impl.application.WebApplicationImpl; import com.sun.jersey.spi.container.ContainerRequest; import com.sun.jersey.spi.container.ContainerResponse; @RunWith(OrcidJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:orcid-core-context.xml" }) public class AnalyticsProcessTest { @Mock private AnalyticsClient analyticsClient; @Mock private ClientDetailsEntityCacheManager clientDetailsEntityCacheManager; @Mock private ProfileEntityCacheManager profileEntityCacheManager; @Resource private EncryptionManager encryptionManager; private String hashedOrcid; @Before public void setUp() throws NoSuchAlgorithmException { MockitoAnnotations.initMocks(this); hashedOrcid = encryptionManager.sha256Hash("1234-4321-1234-4321"); } @Test public void testAnalyticsProcessForPublicClient() throws InterruptedException { String clientDetailsId = "some-client-details-id"; Mockito.when(clientDetailsEntityCacheManager.retrieve(Mockito.eq(clientDetailsId))).thenReturn(getPublicClient()); Mockito.when(profileEntityCacheManager.retrieve(Mockito.eq("1234-4321-1234-4321"))).thenReturn(getProfileEntity()); ContainerRequest request = getRequest(); ContainerResponse response = getResponse(request); AnalyticsProcess process = new AnalyticsProcess(); process.setRequest(request); process.setResponse(response); process.setClientDetailsId(clientDetailsId); process.setAnalyticsClient(analyticsClient); process.setClientDetailsEntityCacheManager(clientDetailsEntityCacheManager); process.setProfileEntityCacheManager(profileEntityCacheManager); process.setPublicApi(true); Thread t = new Thread(process); t.start(); t.join(); ArgumentCaptor<AnalyticsData> captor = ArgumentCaptor.forClass(AnalyticsData.class); Mockito.verify(analyticsClient).sendAnalyticsData(captor.capture()); AnalyticsData data = captor.getValue(); assertNotNull(data); assertEquals("POST", data.getMethod()); assertEquals("works", data.getCategory()); assertEquals("Public API v2.0", data.getApiVersion()); assertEquals(ClientType.PUBLIC_CLIENT.value() + " | a public client - some-client-details-id", data.getClientDetailsString()); assertEquals("37.14.150.0", data.getIpAddress()); assertEquals(Integer.valueOf(200), data.getResponseCode()); assertEquals("https://localhost:8443/orcid-api-web/v2.0/" + hashedOrcid + "/works", data.getUrl()); assertEquals("blah", data.getUserAgent()); assertEquals("application/xml", data.getContentType()); } @Test public void testAnalyticsProcessForMemberClient() throws InterruptedException { String clientDetailsId = "some-client-details-id"; Mockito.when(clientDetailsEntityCacheManager.retrieve(Mockito.eq(clientDetailsId))).thenReturn(getMemberClient()); Mockito.when(profileEntityCacheManager.retrieve(Mockito.eq("1234-4321-1234-4321"))).thenReturn(getProfileEntity()); ContainerRequest request = getRequest(); ContainerResponse response = getResponse(request); AnalyticsProcess process = new AnalyticsProcess(); process.setRequest(request); process.setResponse(response); process.setClientDetailsId(clientDetailsId); process.setAnalyticsClient(analyticsClient); process.setClientDetailsEntityCacheManager(clientDetailsEntityCacheManager); process.setProfileEntityCacheManager(profileEntityCacheManager); process.setPublicApi(false); Thread t = new Thread(process); t.start(); t.join(); ArgumentCaptor<AnalyticsData> captor = ArgumentCaptor.forClass(AnalyticsData.class); Mockito.verify(analyticsClient).sendAnalyticsData(captor.capture()); AnalyticsData data = captor.getValue(); assertNotNull(data); assertEquals("POST", data.getMethod()); assertEquals("works", data.getCategory()); assertEquals("Member API v2.0", data.getApiVersion()); assertEquals(ClientType.CREATOR.value() + " | a member client - some-client-details-id", data.getClientDetailsString()); assertEquals("37.14.150.0", data.getIpAddress()); assertEquals(Integer.valueOf(200), data.getResponseCode()); assertEquals("https://localhost:8443/orcid-api-web/v2.0/" + hashedOrcid + "/works", data.getUrl()); assertEquals("blah", data.getUserAgent()); assertEquals("application/xml", data.getContentType()); } @Test public void testAnalyticsProcessForAnonymous() throws InterruptedException { Mockito.when(profileEntityCacheManager.retrieve(Mockito.eq("1234-4321-1234-4321"))).thenReturn(getProfileEntity()); ContainerRequest request = getRequest(); ContainerResponse response = getResponse(request); AnalyticsProcess process = new AnalyticsProcess(); process.setRequest(request); process.setResponse(response); process.setAnalyticsClient(analyticsClient); process.setClientDetailsEntityCacheManager(clientDetailsEntityCacheManager); process.setProfileEntityCacheManager(profileEntityCacheManager); process.setPublicApi(true); Thread t = new Thread(process); t.start(); t.join(); ArgumentCaptor<AnalyticsData> captor = ArgumentCaptor.forClass(AnalyticsData.class); Mockito.verify(analyticsClient).sendAnalyticsData(captor.capture()); AnalyticsData data = captor.getValue(); assertNotNull(data); assertEquals("POST", data.getMethod()); assertEquals("works", data.getCategory()); assertEquals("Public API v2.0", data.getApiVersion()); assertEquals("Public API user", data.getClientDetailsString()); assertEquals("37.14.150.0", data.getIpAddress()); assertEquals(Integer.valueOf(200), data.getResponseCode()); assertEquals("https://localhost:8443/orcid-api-web/v2.0/" + hashedOrcid + "/works", data.getUrl()); assertEquals("blah", data.getUserAgent()); assertEquals("application/xml", data.getContentType()); } private ClientDetailsEntity getMemberClient() { ClientDetailsEntity client = new ClientDetailsEntity(); client.setClientName("a member client"); client.setClientType(ClientType.CREATOR); return client; } private ClientDetailsEntity getPublicClient() { ClientDetailsEntity client = new ClientDetailsEntity(); client.setClientName("a public client"); client.setClientType(ClientType.PUBLIC_CLIENT); return client; } private ProfileEntity getProfileEntity() { ProfileEntity profileEntity = new ProfileEntity(); profileEntity.setId("1234-4321-1234-4321"); profileEntity.setHashedOrcid(hashedOrcid); return profileEntity; } private ContainerResponse getResponse(ContainerRequest request) { ContainerResponse response = new ContainerResponse(new WebApplicationImpl(), request, null); response.setStatus(200); return response; } private ContainerRequest getRequest() { InBoundHeaders headers = new InBoundHeaders(); headers.add(HttpHeaders.CONTENT_TYPE, "application/xml"); headers.add(HttpHeaders.USER_AGENT, "blah"); headers.add("X-FORWARDED-FOR", "37.14.150.83"); return new ContainerRequest(new WebApplicationImpl(), "POST", URI.create("https://localhost:8443/orcid-api-web/"), URI.create("https://localhost:8443/orcid-api-web/v2.0/1234-4321-1234-4321/works"), headers, null); } }