package com.mozu.api.events.service; import static org.junit.Assert.assertEquals; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import mockit.Expectations; import mockit.Mocked; import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.mozu.api.ApiContext; import com.mozu.api.Headers; import com.mozu.api.contracts.appdev.AppAuthInfo; import com.mozu.api.contracts.commerceruntime.carts.Cart; import com.mozu.api.contracts.commerceruntime.carts.CartItem; import com.mozu.api.contracts.commerceruntime.products.Product; import com.mozu.api.contracts.event.Event; import com.mozu.api.events.EventManager; import com.mozu.api.events.model.EventHandlerStatus; import com.mozu.api.resources.commerce.CartResource; import com.mozu.api.security.AppAuthenticator; import com.mozu.api.security.AuthTicket; import com.mozu.api.security.Crypto; import com.mozu.api.utils.JsonUtils; public class EventServiceTest { private static final String TENANT_URL = "/tenant_url"; private static final String SITE_URL = "/site_url"; private static final Integer TENANT_ID = new Integer(11); private static final Integer SITE_ID = new Integer(22); private static final String CORRELATION_ID = "correlation_id"; private static final String HMAC_SHA_256 = "hmac_sha_256"; private static final Integer MASTER_CATALOG_ID = new Integer(33); private static final Integer CATALOG_ID = new Integer(44); private static final String HEADER_DATE = "Tue, 31 Dec 2013 06:26:07 GMT"; private static final String ENTITY_ID = "EntityId"; private static final String EVENT_ID = "123"; private static final boolean IS_TEST = false; private static final String CREATED_TOPIC = "cart.created"; private static final String UPDATED_TOPIC = "cart.updated"; private static final String DELETED_TOPIC = "cart.deleted"; @Mocked HttpServletRequest mockHttpServletRequest; @Mocked ServletInputStream mockServletInputStream; @Mocked AppAuthenticator mockAppAuthenticator; @Mocked AppAuthInfo mockAppAuthInfo; @Mocked AuthTicket mockAuthTicket; @Mocked CartResource mockCartResource; @Mocked Cart mockCart; @Mocked CartItem mockCartItem; @Mocked Product mockProduct; @Mocked ApiContext mockApiContext; @Mocked IOUtils mockIOUtils; @Mocked Crypto mockCrypto; @BeforeClass public static void registerHandler() { EventManager.getInstance().registerHandler(new CartEventHandlerTestImpl()); } @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void invokeMethodTest() throws Exception { Event event = new Event(); event.setTopic("cart.created"); EventService eventService = new EventService(); eventService.invokeHandler(event, mockApiContext); } @Test public void createEventTest() throws Exception { final String jsonString = createdEventJson(); new Expectations() { { mockHttpServletRequest.getHeader(Headers.X_VOL_TENANT_DOMAIN); result=TENANT_URL; } { mockHttpServletRequest.getHeader(Headers.X_VOL_SITE_DOMAIN); result=SITE_URL; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_TENANT); result=TENANT_ID; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_SITE); result=SITE_ID; } { mockHttpServletRequest.getHeader(Headers.X_VOL_CORRELATION); result=CORRELATION_ID; } { mockHttpServletRequest.getHeader(Headers.X_VOL_HMAC_SHA256); result = HMAC_SHA_256; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_MASTER_CATALOG); result=MASTER_CATALOG_ID; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_CATALOG); result=CATALOG_ID; } { AppAuthenticator.isUseSSL(); result=false; times=2; } { mockHttpServletRequest.getHeader(Headers.DATE); result=HEADER_DATE; } { mockHttpServletRequest.getInputStream(); result=mockServletInputStream; } { IOUtils.toString(mockServletInputStream); result=jsonString; } { Crypto.isRequestValid((ApiContext)any, (String)any); result=true; } }; EventService eventService = new EventService(); EventHandlerStatus status = eventService.dispatchEvent(mockHttpServletRequest); assertEquals(HttpServletResponse.SC_OK, status.getStatus()); } @Test public void updateEventTest() throws Exception { final String jsonString = updatedEventJson(); new Expectations() { { mockHttpServletRequest.getHeader(Headers.X_VOL_TENANT_DOMAIN); result=TENANT_URL; } { mockHttpServletRequest.getHeader(Headers.X_VOL_SITE_DOMAIN); result=SITE_URL; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_TENANT); result=TENANT_ID; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_SITE); result=SITE_ID; } { mockHttpServletRequest.getHeader(Headers.X_VOL_CORRELATION); result=CORRELATION_ID; } { mockHttpServletRequest.getHeader(Headers.X_VOL_HMAC_SHA256); result = HMAC_SHA_256; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_MASTER_CATALOG); result=MASTER_CATALOG_ID; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_CATALOG); result=CATALOG_ID; } { AppAuthenticator.isUseSSL(); result=false; times=2; } { mockHttpServletRequest.getHeader(Headers.DATE); result=HEADER_DATE; } { mockHttpServletRequest.getInputStream(); result=mockServletInputStream; } { IOUtils.toString(mockServletInputStream); result=jsonString; } { Crypto.isRequestValid((ApiContext)any, (String)any); result=true; } }; EventService eventService = new EventService(); EventHandlerStatus status = eventService.dispatchEvent(mockHttpServletRequest); assertEquals(HttpServletResponse.SC_OK, status.getStatus()); } @Test public void deleteEventTest() throws Exception { final String jsonString = deletedEventJson(); new Expectations() { { mockHttpServletRequest.getHeader(Headers.X_VOL_TENANT_DOMAIN); result=TENANT_URL; } { mockHttpServletRequest.getHeader(Headers.X_VOL_SITE_DOMAIN); result=SITE_URL; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_TENANT); result=TENANT_ID; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_SITE); result=SITE_ID; } { mockHttpServletRequest.getHeader(Headers.X_VOL_CORRELATION); result=CORRELATION_ID; } { mockHttpServletRequest.getHeader(Headers.X_VOL_HMAC_SHA256); result = HMAC_SHA_256; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_MASTER_CATALOG); result=MASTER_CATALOG_ID; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_CATALOG); result=CATALOG_ID; } { AppAuthenticator.isUseSSL(); result=false; times=2; } { mockHttpServletRequest.getHeader(Headers.DATE); result=HEADER_DATE; } { mockHttpServletRequest.getInputStream(); result=mockServletInputStream; } { IOUtils.toString(mockServletInputStream); result=jsonString; } { Crypto.isRequestValid((ApiContext)any, (String)any); result=true; } }; EventService eventService = new EventService(); EventHandlerStatus status = eventService.dispatchEvent(mockHttpServletRequest); assertEquals(HttpServletResponse.SC_OK, status.getStatus()); } public void unauthorizedEventTest() throws Exception { final String jsonString = deletedEventJson(); new Expectations() { { mockHttpServletRequest.getHeader(Headers.X_VOL_TENANT_DOMAIN); result=TENANT_URL; } { mockHttpServletRequest.getHeader(Headers.X_VOL_SITE_DOMAIN); result=SITE_URL; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_TENANT); result=TENANT_ID; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_SITE); result=SITE_ID; } { mockHttpServletRequest.getHeader(Headers.X_VOL_CORRELATION); result=CORRELATION_ID; } { mockHttpServletRequest.getHeader(Headers.X_VOL_HMAC_SHA256); result = HMAC_SHA_256; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_MASTER_CATALOG); result=MASTER_CATALOG_ID; } { mockHttpServletRequest.getIntHeader(Headers.X_VOL_CATALOG); result=CATALOG_ID; } { AppAuthenticator.isUseSSL(); result=false; times=2; } { mockHttpServletRequest.getHeader(Headers.DATE); result=HEADER_DATE; } { mockHttpServletRequest.getInputStream(); result=mockServletInputStream; } { IOUtils.toString(mockServletInputStream); result=jsonString; } { AppAuthenticator.getInstance(); returns(mockAppAuthenticator); } { mockAppAuthenticator.getAppAuthInfo(); result=mockAppAuthInfo; } { mockAppAuthInfo.getSharedSecret(); result=HMAC_SHA_256; } { Crypto.isRequestValid((ApiContext)any, (String)any); result=false; } }; EventService eventService = new EventService(); EventHandlerStatus status = eventService.dispatchEvent(mockHttpServletRequest); assertEquals(HttpServletResponse.SC_UNAUTHORIZED, status.getStatus()); } private String createdEventJson() throws JsonProcessingException { ObjectMapper mapper = JsonUtils.initObjectMapper(); return mapper.writeValueAsString(createEvent(CREATED_TOPIC)); } private String updatedEventJson() throws JsonProcessingException { ObjectMapper mapper = JsonUtils.initObjectMapper(); return mapper.writeValueAsString(createEvent(UPDATED_TOPIC)); } private String deletedEventJson() throws JsonProcessingException { ObjectMapper mapper = JsonUtils.initObjectMapper(); return mapper.writeValueAsString(createEvent(DELETED_TOPIC)); } private Event createEvent(String topic) { Event event = new Event(); event.setAuditInfo(null); event.setCatalogId(CATALOG_ID); event.setCorrelationId(CORRELATION_ID); event.setEntityId(ENTITY_ID); event.setId(EVENT_ID); event.setIsTest(IS_TEST); event.setMasterCatalogId(MASTER_CATALOG_ID); event.setSiteId(SITE_ID); event.setTenantId(TENANT_ID); event.setTopic(topic); return event; } }