From 7b5b0542368602b6138892999f0d4fc24eb67812 Mon Sep 17 00:00:00 2001 From: sana Date: Wed, 28 Feb 2018 14:54:43 +0100 Subject: [PATCH] Release 3.5.1 --- .../queueit/knownuserv3/sdk/KnownUser.java | 167 ++++---- .../sdk/RequestValidationResult.java | 18 + .../knownuserv3/sdk/UserInQueueService.java | 5 +- .../knownuserv3/sdk/KnownUserTest.java | 404 ++++++++++++++---- 4 files changed, 424 insertions(+), 170 deletions(-) diff --git a/SDK/src/queueit/knownuserv3/sdk/KnownUser.java b/SDK/src/queueit/knownuserv3/sdk/KnownUser.java index 74e989b..e82d1df 100644 --- a/SDK/src/queueit/knownuserv3/sdk/KnownUser.java +++ b/SDK/src/queueit/knownuserv3/sdk/KnownUser.java @@ -1,4 +1,5 @@ package queueit.knownuserv3.sdk; + import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; @@ -11,9 +12,10 @@ import queueit.knownuserv3.sdk.integrationconfig.*; public class KnownUser { - + public static final String QueueITTokenKey = "queueittoken"; public static final String QueueITDebugKey = "queueitdebug"; + public static final String QueueITAjaxHeaderKey = "x-queueit-ajaxpageurl"; private static IUserInQueueService _userInQueueService; private static IUserInQueueService getUserInQueueService(HttpServletRequest request, HttpServletResponse response) { @@ -37,7 +39,7 @@ public static RequestValidationResult validateRequestByIntegrationConfig(String HttpServletResponse response, String secretKey) throws Exception { Map debugEntries = new HashMap<>(); - + try { boolean isDebug = getIsDebug(queueitToken, secretKey); if (isDebug) { @@ -55,7 +57,7 @@ public static RequestValidationResult validateRequestByIntegrationConfig(String throw new KnowUserException("customerIntegrationInfo can not be null."); } - Cookie[] cookies = request != null ? request.getCookies() : new Cookie[0]; + Cookie[] cookies = request != null ? request.getCookies() : new Cookie[0]; IntegrationEvaluator configEvaluater = new IntegrationEvaluator(); @@ -64,7 +66,7 @@ public static RequestValidationResult validateRequestByIntegrationConfig(String if (isDebug) { String matchedConfigName = (matchedConfig != null) ? matchedConfig.Name : "NULL"; - debugEntries.put("MatchedConfig", matchedConfigName); + debugEntries.put("MatchedConfig", matchedConfigName); } if (matchedConfig == null) { @@ -72,18 +74,15 @@ public static RequestValidationResult validateRequestByIntegrationConfig(String } // unspecified or 'Queue' specified - if(Utils.isNullOrWhiteSpace(matchedConfig.ActionType) || ActionType.QUEUE_ACTION.equals(matchedConfig.ActionType)) { + if (Utils.isNullOrWhiteSpace(matchedConfig.ActionType) || ActionType.QUEUE_ACTION.equals(matchedConfig.ActionType)) { return handleQueueAction(matchedConfig, currentUrlWithoutQueueITToken, customerIntegrationInfo, queueitToken, customerId, request, response, secretKey, debugEntries); - } - else if (ActionType.CANCEL_ACTION.equals(matchedConfig.ActionType)){ + } else if (ActionType.CANCEL_ACTION.equals(matchedConfig.ActionType)) { return handleCancelAction(matchedConfig, customerIntegrationInfo, currentUrlWithoutQueueITToken, queueitToken, customerId, request, response, secretKey, debugEntries); - } - // for all unknown types default to 'Ignore' + } // for all unknown types default to 'Ignore' else { return handleIgnoreAction(request, response); } - } - finally { + } finally { setDebugCookie(debugEntries, request, response); } } @@ -92,24 +91,23 @@ public static RequestValidationResult cancelRequestByLocalConfig( String targetUrl, String queueitToken, CancelEventConfig cancelConfig, String customerId, HttpServletRequest request, HttpServletResponse response, String secretKey) throws Exception { - + Map debugEntries = new HashMap<>(); - + try { - return cancelRequestByLocalConfig( - targetUrl, queueitToken, cancelConfig, customerId, request, response, secretKey, debugEntries); - } - finally { + targetUrl = generateTargetUrl(targetUrl, request); + return cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, customerId, request, response, secretKey, debugEntries); + } finally { setDebugCookie(debugEntries, request, response); } } - + private static RequestValidationResult cancelRequestByLocalConfig( String targetUrl, String queueitToken, CancelEventConfig cancelConfig, String customerId, HttpServletRequest request, - HttpServletResponse response, String secretKey, + HttpServletResponse response, String secretKey, Map debugEntries) throws Exception { - + boolean isDebug = getIsDebug(queueitToken, secretKey); if (isDebug) { debugEntries.put("TargetUrl", targetUrl); @@ -118,7 +116,7 @@ private static RequestValidationResult cancelRequestByLocalConfig( debugEntries.put("OriginalUrl", getOriginalUrl(request)); logMoreRequestDetails(debugEntries, request); } - + if (Utils.isNullOrWhiteSpace(targetUrl)) { throw new Exception("targetUrl can not be null or empty."); } @@ -137,33 +135,35 @@ private static RequestValidationResult cancelRequestByLocalConfig( if (Utils.isNullOrWhiteSpace(cancelConfig.getQueueDomain())) { throw new Exception("QueueDomain from cancelConfig can not be null or empty."); } - + IUserInQueueService userInQueueService = getUserInQueueService(request, response); - return userInQueueService.validateCancelRequest(targetUrl, cancelConfig, customerId, secretKey); + RequestValidationResult result = userInQueueService.validateCancelRequest(targetUrl, cancelConfig, customerId, secretKey); + result.isAjaxResult = isQueueAjaxCall(request); + + return result; } - + public static RequestValidationResult resolveQueueRequestByLocalConfig( String targetUrl, String queueitToken, QueueEventConfig queueConfig, String customerId, HttpServletRequest request, HttpServletResponse response, String secretKey) throws Exception { - + Map debugEntries = new HashMap<>(); - + try { - return resolveQueueRequestByLocalConfig( - targetUrl, queueitToken, queueConfig, customerId, request, response, secretKey, debugEntries); - } - finally { + targetUrl = generateTargetUrl(targetUrl, request); + return resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, request, response, secretKey, debugEntries); + } finally { setDebugCookie(debugEntries, request, response); } } - + private static RequestValidationResult resolveQueueRequestByLocalConfig( String targetUrl, String queueitToken, QueueEventConfig queueConfig, String customerId, HttpServletRequest request, - HttpServletResponse response, String secretKey, + HttpServletResponse response, String secretKey, Map debugEntries) throws Exception { - + boolean isDebug = getIsDebug(queueitToken, secretKey); if (isDebug) { debugEntries.put("TargetUrl", targetUrl); @@ -172,7 +172,7 @@ private static RequestValidationResult resolveQueueRequestByLocalConfig( debugEntries.put("OriginalUrl", getOriginalUrl(request)); logMoreRequestDetails(debugEntries, request); } - + if (Utils.isNullOrWhiteSpace(customerId)) { throw new Exception("customerId can not be null or empty."); } @@ -196,7 +196,10 @@ private static RequestValidationResult resolveQueueRequestByLocalConfig( } IUserInQueueService userInQueueService = getUserInQueueService(request, response); - return userInQueueService.validateQueueRequest(targetUrl, queueitToken, queueConfig, customerId, secretKey); + RequestValidationResult result = userInQueueService.validateQueueRequest(targetUrl, queueitToken, queueConfig, customerId, secretKey); + result.isAjaxResult = isQueueAjaxCall(request); + + return result; } public static void extendQueueCookie(String eventId, @@ -205,7 +208,7 @@ public static void extendQueueCookie(String eventId, HttpServletRequest request, HttpServletResponse response, String secretKey) throws Exception { - + if (Utils.isNullOrWhiteSpace(eventId)) { throw new Exception("eventId can not be null or empty."); } @@ -215,26 +218,27 @@ public static void extendQueueCookie(String eventId, if (Utils.isNullOrWhiteSpace(secretKey)) { throw new Exception("secretKey can not be null or empty."); } - + IUserInQueueService userInQueueService = getUserInQueueService(request, response); userInQueueService.extendQueueCookie(eventId, cookieValidityMinute, cookieDomain, secretKey); } - + private static void setDebugCookie(Map debugEntries, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { - if(debugEntries.isEmpty()) + if (debugEntries.isEmpty()) { return; - + } + ICookieManager cookieManager = new CookieManager(request, response); String cookieValue = ""; for (Map.Entry entry : debugEntries.entrySet()) { - cookieValue += (entry.getKey() + "=" + entry.getValue() + "|"); + cookieValue += (entry.getKey() + "=" + entry.getValue() + "|"); } - if(!"".equals(cookieValue)) + if (!"".equals(cookieValue)) { cookieValue = cookieValue.substring(0, cookieValue.length() - 1); // remove trailing char - + } cookieManager.setCookie(QueueITDebugKey, cookieValue, null, null); } - + private static void logMoreRequestDetails(Map debugEntries, HttpServletRequest request) { debugEntries.put("ServerUtcTime", Instant.now().toString()); debugEntries.put("RequestIP", request.getRemoteAddr()); @@ -242,11 +246,10 @@ private static void logMoreRequestDetails(Map debugEntries, Http debugEntries.put("RequestHttpHeader_Forwarded", request.getHeader("forwarded") != null ? request.getHeader("forwarded") : ""); debugEntries.put("RequestHttpHeader_XForwardedFor", request.getHeader("x-forwarded-for") != null ? request.getHeader("x-forwarded-for") : ""); debugEntries.put("RequestHttpHeader_XForwardedHost", request.getHeader("x-forwarded-host") != null ? request.getHeader("x-forwarded-host") : ""); - debugEntries.put("RequestHttpHeader_XForwardedProto", request.getHeader("x-forwarded-proto") != null ? request.getHeader("x-forwarded-proto") : ""); + debugEntries.put("RequestHttpHeader_XForwardedProto", request.getHeader("x-forwarded-proto") != null ? request.getHeader("x-forwarded-proto") : ""); } - - private static boolean getIsDebug(String queueitToken, String secretKey) throws Exception - { + + private static boolean getIsDebug(String queueitToken, String secretKey) throws Exception { QueueUrlParams qParams = QueueParameterHelper.extractQueueParams(queueitToken); if (qParams != null && qParams.getRedirectType() != null && "debug".equals(qParams.getRedirectType().toLowerCase())) { String hash = HashHelper.generateSHA256Hash(secretKey, qParams.getQueueITTokenWithoutHash()); @@ -254,13 +257,13 @@ private static boolean getIsDebug(String queueitToken, String secretKey) throws } return false; } - - private static String getOriginalUrl(HttpServletRequest request){ - return (request.getQueryString() != null) - ? String.join("", request.getRequestURL(), "?",request.getQueryString()) - : request.getRequestURL().toString(); + + private static String getOriginalUrl(HttpServletRequest request) { + return (request.getQueryString() != null) + ? String.join("", request.getRequestURL(), "?", request.getQueryString()) + : request.getRequestURL().toString(); } - + private static RequestValidationResult handleQueueAction(IntegrationConfigModel matchedConfig, String currentUrlWithoutQueueITToken, CustomerIntegration customerIntegrationInfo, String queueitToken, String customerId, HttpServletRequest request, HttpServletResponse response, String secretKey, Map debugEntries) throws Exception { String targetUrl; switch (matchedConfig.RedirectLogic) { @@ -272,10 +275,10 @@ private static RequestValidationResult handleQueueAction(IntegrationConfigModel targetUrl = ""; break; default: - targetUrl = currentUrlWithoutQueueITToken; + targetUrl = generateTargetUrl(currentUrlWithoutQueueITToken, request); break; } - + QueueEventConfig queueConfig = new QueueEventConfig(); queueConfig.setQueueDomain(matchedConfig.QueueDomain); queueConfig.setCulture(matchedConfig.Culture); @@ -285,9 +288,8 @@ private static RequestValidationResult handleQueueAction(IntegrationConfigModel queueConfig.setCookieValidityMinute(matchedConfig.CookieValidityMinute); queueConfig.setCookieDomain(matchedConfig.CookieDomain); queueConfig.setVersion(customerIntegrationInfo.Version); - - return resolveQueueRequestByLocalConfig( - targetUrl, queueitToken, queueConfig, customerId, request, response, secretKey, debugEntries); + + return resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, request, response, secretKey, debugEntries); } private static RequestValidationResult handleCancelAction(IntegrationConfigModel matchedConfig, CustomerIntegration customerIntegrationInfo, String currentUrlWithoutQueueITToken, String queueitToken, String customerId, HttpServletRequest request, HttpServletResponse response, String secretKey, Map debugEntries) throws Exception { @@ -296,20 +298,37 @@ private static RequestValidationResult handleCancelAction(IntegrationConfigModel cancelConfig.setEventId(matchedConfig.EventId); cancelConfig.setCookieDomain(matchedConfig.CookieDomain); cancelConfig.setVersion(customerIntegrationInfo.Version); - - return cancelRequestByLocalConfig( - currentUrlWithoutQueueITToken, queueitToken, cancelConfig, customerId, request, response, secretKey, debugEntries); + + String targetUrl = generateTargetUrl(currentUrlWithoutQueueITToken, request); + return cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, customerId, request, response, secretKey, debugEntries); } private static RequestValidationResult handleIgnoreAction(HttpServletRequest request, HttpServletResponse response) { IUserInQueueService userInQueueService = getUserInQueueService(request, response); - return userInQueueService.getIgnoreActionResult(); + RequestValidationResult result = userInQueueService.getIgnoreActionResult(); + result.isAjaxResult = isQueueAjaxCall(request); + return result; + } + + private static String generateTargetUrl(String originalTargetUrl, HttpServletRequest request) { + try { + return !isQueueAjaxCall(request) + ? originalTargetUrl + : URLDecoder.decode(request.getHeader(QueueITAjaxHeaderKey), "UTF-8"); + } catch (UnsupportedEncodingException e) { + } + return ""; + } + + private static boolean isQueueAjaxCall(HttpServletRequest request) { + return !Utils.isNullOrWhiteSpace(request.getHeader(QueueITAjaxHeaderKey)); } } interface ICookieManager { void setCookie(String cookieName, String cookieValue, Integer expiration, String cookieDomain); + String getCookie(String cookieName); } @@ -318,26 +337,28 @@ class CookieManager implements ICookieManager { HttpServletRequest request; HttpServletResponse response; - public CookieManager(HttpServletRequest request, - HttpServletResponse response) { + public CookieManager(HttpServletRequest request, HttpServletResponse response) { this.request = request; this.response = response; } @Override public void setCookie(String cookieName, String cookieValue, Integer expiration, String cookieDomain) { - if(response == null) + if (response == null) { return; - + } + Cookie cookie = new Cookie(cookieName, cookieValue); if (cookieValue == null) { cookieValue = ""; } try { cookie.setValue(URLEncoder.encode(cookieValue, "UTF-8")); - } catch (UnsupportedEncodingException ex) {} - if(expiration != null) + } catch (UnsupportedEncodingException ex) { + } + if (expiration != null) { cookie.setMaxAge(expiration); + } cookie.setPath("/"); if (!Utils.isNullOrWhiteSpace(cookieDomain)) { cookie.setDomain(cookieDomain); @@ -348,9 +369,10 @@ public void setCookie(String cookieName, String cookieValue, Integer expiration, @Override public String getCookie(String cookieName) { - if(request == null) + if (request == null) { return null; - + } + Cookie[] cookies = request.getCookies(); if (cookies == null) { return null; @@ -360,7 +382,8 @@ public String getCookie(String cookieName) { if (cookie.getName().equals(cookieName)) { try { return URLDecoder.decode(cookie.getValue(), "UTF-8"); - } catch (UnsupportedEncodingException ex) { } + } catch (UnsupportedEncodingException ex) { + } } } return null; diff --git a/SDK/src/queueit/knownuserv3/sdk/RequestValidationResult.java b/SDK/src/queueit/knownuserv3/sdk/RequestValidationResult.java index 12c9d5d..843a6ee 100644 --- a/SDK/src/queueit/knownuserv3/sdk/RequestValidationResult.java +++ b/SDK/src/queueit/knownuserv3/sdk/RequestValidationResult.java @@ -1,5 +1,8 @@ package queueit.knownuserv3.sdk; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + public class RequestValidationResult { private String actionType; @@ -7,6 +10,7 @@ public class RequestValidationResult { private String redirectUrl; private String queueId; private String redirectType; + public boolean isAjaxResult; public RequestValidationResult(String actionType, String eventId, String queueId, String redirectUrl, String redirectType) { this.actionType = actionType; @@ -39,6 +43,20 @@ public String getQueueId() { public String getRedirectType() { return this.redirectType; } + + public String getAjaxQueueRedirectHeaderKey() { + return "x-queueit-redirect"; + } + + public String getAjaxRedirectUrl() { + try { + if (!Utils.isNullOrWhiteSpace(redirectUrl)) { + return URLEncoder.encode(redirectUrl, "UTF-8"); + } + } catch (UnsupportedEncodingException e) { + } + return ""; + } } class KnowUserException extends Exception { diff --git a/SDK/src/queueit/knownuserv3/sdk/UserInQueueService.java b/SDK/src/queueit/knownuserv3/sdk/UserInQueueService.java index d6edb92..374c640 100644 --- a/SDK/src/queueit/knownuserv3/sdk/UserInQueueService.java +++ b/SDK/src/queueit/knownuserv3/sdk/UserInQueueService.java @@ -31,11 +31,10 @@ void extendQueueCookie( class UserInQueueService implements IUserInQueueService { - public static final String SDK_VERSION = "3.5.0"; + public static final String SDK_VERSION = "3.5.1"; private final IUserInQueueStateRepository _userInQueueStateRepository; - public UserInQueueService( - IUserInQueueStateRepository queueStateRepository) { + public UserInQueueService(IUserInQueueStateRepository queueStateRepository) { this._userInQueueStateRepository = queueStateRepository; } diff --git a/SDK/test/queueit/knownuserv3/sdk/KnownUserTest.java b/SDK/test/queueit/knownuserv3/sdk/KnownUserTest.java index fb7e725..bb54156 100644 --- a/SDK/test/queueit/knownuserv3/sdk/KnownUserTest.java +++ b/SDK/test/queueit/knownuserv3/sdk/KnownUserTest.java @@ -6,7 +6,6 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.security.Principal; -import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; @@ -28,6 +27,7 @@ import javax.servlet.http.HttpSession; import javax.servlet.http.HttpUpgradeHandler; import javax.servlet.http.Part; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; import queueit.knownuserv3.sdk.integrationconfig.CustomerIntegration; @@ -43,7 +43,7 @@ class UserInQueueServiceMock implements IUserInQueueService { public ArrayList> validateCancelRequestCalls = new ArrayList<>(); public ArrayList> extendQueueCookieCalls = new ArrayList<>(); public ArrayList> getIgnoreActionResultCalls = new ArrayList<>(); - + @Override public RequestValidationResult validateQueueRequest(String targetUrl, String queueitToken, QueueEventConfig config, String customerId, String secretKey) throws Exception { ArrayList args = new ArrayList<>(); @@ -61,16 +61,16 @@ public RequestValidationResult validateQueueRequest(String targetUrl, String que args.add(secretKey); validateQueueRequestCalls.add(args); - return null; + return new RequestValidationResult("Queue", "", "", "", ""); } @Override public RequestValidationResult validateCancelRequest( - String targetUrl, - CancelEventConfig config, - String customerId, - String secretKey) throws Exception { - + String targetUrl, + CancelEventConfig config, + String customerId, + String secretKey) throws Exception { + ArrayList args = new ArrayList<>(); args.add(targetUrl); args.add(config.getCookieDomain() + ":" @@ -81,9 +81,9 @@ public RequestValidationResult validateCancelRequest( args.add(secretKey); validateCancelRequestCalls.add(args); - return null; + return new RequestValidationResult("Cancel", "", "", "", ""); } - + @Override public void extendQueueCookie(String eventId, int cookieValidityMinute, String cookieDomain, String secretKey) { ArrayList args = new ArrayList<>(); @@ -97,13 +97,16 @@ public void extendQueueCookie(String eventId, int cookieValidityMinute, String c @Override public RequestValidationResult getIgnoreActionResult() { getIgnoreActionResultCalls.add(new ArrayList<>()); - return null; + return new RequestValidationResult("Ignore", "", "", "", ""); } } @Test public void cancelRequestByLocalConfigTest() throws Exception { - // Arrange + // Arrange + HttpServletRequestMock requestMock = new HttpServletRequestMock(); + HttpServletResponseMock responseMock = new HttpServletResponseMock(); + UserInQueueServiceMock mock = new UserInQueueServiceMock(); KnownUser.setUserInQueueService(mock); CancelEventConfig cancelEventConfig = new CancelEventConfig(); @@ -111,17 +114,43 @@ public void cancelRequestByLocalConfigTest() throws Exception { cancelEventConfig.setEventId("eventid"); cancelEventConfig.setQueueDomain("queuedomain"); cancelEventConfig.setVersion(1); - + // Act - KnownUser.cancelRequestByLocalConfig("url", "queueitToken", cancelEventConfig,"customerid",null, null, "secretkey"); + RequestValidationResult result = KnownUser.cancelRequestByLocalConfig("url", "queueitToken", cancelEventConfig, "customerid", requestMock, responseMock, "secretkey"); // Assert assertTrue("url".equals(mock.validateCancelRequestCalls.get(0).get(0))); assertTrue("cookiedomain:eventid:queuedomain:1".equals(mock.validateCancelRequestCalls.get(0).get(1))); assertTrue("customerid".equals(mock.validateCancelRequestCalls.get(0).get(2))); assertTrue("secretkey".equals(mock.validateCancelRequestCalls.get(0).get(3))); + assertFalse(result.isAjaxResult); } - + + @Test + public void CancelRequestByLocalConfig_AjaxCall_Test() throws Exception { + // Arrange + HttpServletRequestMock requestMock = new HttpServletRequestMock(); + requestMock.Headers.put("x-queueit-ajaxpageurl", "http%3A%2F%2Furl"); + + UserInQueueServiceMock mock = new UserInQueueServiceMock(); + KnownUser.setUserInQueueService(mock); + CancelEventConfig cancelEventConfig = new CancelEventConfig(); + cancelEventConfig.setCookieDomain("cookiedomain"); + cancelEventConfig.setEventId("eventid"); + cancelEventConfig.setQueueDomain("queuedomain"); + cancelEventConfig.setVersion(1); + + // Act + RequestValidationResult result = KnownUser.cancelRequestByLocalConfig("url", "queueitToken", cancelEventConfig, "customerid", requestMock, null, "secretkey"); + + // Assert + assertTrue("http://url".equals(mock.validateCancelRequestCalls.get(0).get(0))); + assertTrue("cookiedomain:eventid:queuedomain:1".equals(mock.validateCancelRequestCalls.get(0).get(1))); + assertTrue("customerid".equals(mock.validateCancelRequestCalls.get(0).get(2))); + assertTrue("secretkey".equals(mock.validateCancelRequestCalls.get(0).get(3))); + assertTrue(result.isAjaxResult); + } + @Test public void cancelRequestByLocalConfigDebugCookieLoggingTest() throws Exception { // Arrange @@ -132,7 +161,7 @@ public void cancelRequestByLocalConfigDebugCookieLoggingTest() throws Exception cancelEventConfig.setEventId("eventid"); cancelEventConfig.setQueueDomain("queuedomain"); cancelEventConfig.setVersion(1); - + HttpServletRequestMock requestMock = new HttpServletRequestMock(); requestMock.RequestURL = "requestUrl"; requestMock.RemoteAddr = "80.35.35.34"; @@ -141,15 +170,15 @@ public void cancelRequestByLocalConfigDebugCookieLoggingTest() throws Exception requestMock.Headers.put("x-forwarded-for", "129.78.138.66, 129.78.64.103"); requestMock.Headers.put("x-forwarded-host", "en.wikipedia.org:8080"); requestMock.Headers.put("x-forwarded-proto", "https"); - + HttpServletResponseMock responseMock = new HttpServletResponseMock(); - + // Act String secretKey = "secretkey"; String queueittoken = QueueITTokenGenerator.generateToken("eventId", secretKey); - + KnownUser.cancelRequestByLocalConfig("url", queueittoken, cancelEventConfig, "customerId", requestMock, responseMock, secretKey); - + // Assert assertTrue(responseMock.addedCookies.size() == 1); assertTrue(responseMock.addedCookies.get(0).getName().equals(KnownUser.QueueITDebugKey)); @@ -158,7 +187,7 @@ public void cancelRequestByLocalConfigDebugCookieLoggingTest() throws Exception assertTrue(decodedCookieValue.contains("|CancelConfig=EventId:eventid")); assertTrue(decodedCookieValue.contains("&Version:1")); assertTrue(decodedCookieValue.contains("&QueueDomain:queuedomain")); - assertTrue(decodedCookieValue.contains("&CookieDomain:cookiedomain")); + assertTrue(decodedCookieValue.contains("&CookieDomain:cookiedomain")); assertTrue(decodedCookieValue.contains("|QueueitToken=" + queueittoken)); assertTrue(decodedCookieValue.contains("|TargetUrl=url")); assertTrue(decodedCookieValue.contains("|RequestIP=80.35.35.34")); @@ -171,7 +200,7 @@ public void cancelRequestByLocalConfigDebugCookieLoggingTest() throws Exception @Test public void cancelRequestByLocalConfigNullQueueDomainTest() { - // Arrange + // Arrange UserInQueueServiceMock mock = new UserInQueueServiceMock(); KnownUser.setUserInQueueService(mock); boolean exceptionWasThrown = false; @@ -179,10 +208,10 @@ public void cancelRequestByLocalConfigNullQueueDomainTest() { cancelEventConfig.setEventId("eventid"); cancelEventConfig.setCookieDomain("cookieDomain"); cancelEventConfig.setVersion(12); - + // Act try { - KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", cancelEventConfig, "customerId", null, null, "secretKey"); + KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", cancelEventConfig, "customerId", new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "QueueDomain from cancelConfig can not be null or empty.".equals(ex.getMessage()); } @@ -191,20 +220,20 @@ public void cancelRequestByLocalConfigNullQueueDomainTest() { assertTrue(mock.validateCancelRequestCalls.isEmpty()); assertTrue(exceptionWasThrown); } - + @Test public void cancelRequestByLocalConfigEventIdNullTest() { - // Arrange + // Arrange UserInQueueServiceMock mock = new UserInQueueServiceMock(); KnownUser.setUserInQueueService(mock); boolean exceptionWasThrown = false; CancelEventConfig cancelEventConfig = new CancelEventConfig(); cancelEventConfig.setCookieDomain("domain"); cancelEventConfig.setVersion(12); - + // Act try { - KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", cancelEventConfig, "customerId", null, null, "secretKey"); + KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", cancelEventConfig, "customerId", new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "EventId from cancelConfig can not be null or empty.".equals(ex.getMessage()); } @@ -213,36 +242,36 @@ public void cancelRequestByLocalConfigEventIdNullTest() { assertTrue(mock.validateCancelRequestCalls.isEmpty()); assertTrue(exceptionWasThrown); } - + @Test public void cancelRequestByLocalConfigCancelEventConfigNullTest() { // Arrange UserInQueueServiceMock mock = new UserInQueueServiceMock(); KnownUser.setUserInQueueService(mock); boolean exceptionWasThrown = false; - + // Act try { - KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", null, "customerId", null, null, "secretKey"); + KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", null, "customerId", new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "cancelConfig can not be null.".equals(ex.getMessage()); } // Assert assertTrue(mock.validateCancelRequestCalls.isEmpty()); - assertTrue(exceptionWasThrown); + assertTrue(exceptionWasThrown); } @Test public void cancelRequestByLocalConfigCustomerIdNullTest() { - // Arrange + // Arrange UserInQueueServiceMock mock = new UserInQueueServiceMock(); KnownUser.setUserInQueueService(mock); boolean exceptionWasThrown = false; - + // Act try { - KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", new CancelEventConfig(), null, null, null, "secretKey"); + KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", new CancelEventConfig(), null, new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "customerId can not be null or empty.".equals(ex.getMessage()); } @@ -251,17 +280,17 @@ public void cancelRequestByLocalConfigCustomerIdNullTest() { assertTrue(mock.validateCancelRequestCalls.isEmpty()); assertTrue(exceptionWasThrown); } - + @Test public void cancelRequestByLocalConfigSecretKeyNullTest() { - // Arrange + // Arrange UserInQueueServiceMock mock = new UserInQueueServiceMock(); KnownUser.setUserInQueueService(mock); boolean exceptionWasThrown = false; - + // Act try { - KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", new CancelEventConfig(), "customerId", null, null, null); + KnownUser.cancelRequestByLocalConfig("targetUrl", "queueitToken", new CancelEventConfig(), "customerId", new HttpServletRequestMock(), null, null); } catch (Exception ex) { exceptionWasThrown = "secretKey can not be null or empty.".equals(ex.getMessage()); } @@ -270,26 +299,26 @@ public void cancelRequestByLocalConfigSecretKeyNullTest() { assertTrue(mock.validateCancelRequestCalls.isEmpty()); assertTrue(exceptionWasThrown); } - + @Test public void CancelRequestByLocalConfigTargetUrlNullTest() { - // Arrange + // Arrange UserInQueueServiceMock mock = new UserInQueueServiceMock(); KnownUser.setUserInQueueService(mock); boolean exceptionWasThrown = false; - + // Act try { - KnownUser.cancelRequestByLocalConfig(null, "queueitToken", new CancelEventConfig(), "customerId", null, null, "secretKey"); + KnownUser.cancelRequestByLocalConfig(null, "queueitToken", new CancelEventConfig(), "customerId", new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "targetUrl can not be null or empty.".equals(ex.getMessage()); } // Assert assertTrue(mock.validateCancelRequestCalls.isEmpty()); - assertTrue(exceptionWasThrown); + assertTrue(exceptionWasThrown); } - + @Test public void extendQueueCookieNullEventIdTest() { // Arrange @@ -372,7 +401,7 @@ public void resolveQueueRequestByLocalConfigNullCustomerIdTest() { // Act try { - KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", null, null, null, null, "secretKey"); + KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", null, null, new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "customerId can not be null or empty.".equals(ex.getMessage()); } @@ -391,7 +420,7 @@ public void resolveQueueRequestByLocalConfigNullSecretKeyTest() { // Act try { - KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", null, "customerId", null, null, null); + KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", null, "customerId", new HttpServletRequestMock(), null, null); } catch (Exception ex) { exceptionWasThrown = "secretKey can not be null or empty.".equals(ex.getMessage()); } @@ -410,7 +439,7 @@ public void resolveQueueRequestByLocalConfigNullEventConfigTest() { // Act try { - KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", null, "customerId", null, null, "secretKey"); + KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", null, "customerId", new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "eventConfig can not be null.".equals(ex.getMessage()); } @@ -439,7 +468,7 @@ public void resolveQueueRequestByLocalConfigNullEventIdTest() { // Act try { - KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", null, null, "secretKey"); + KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "EventId from queueConfig can not be null or empty.".equals(ex.getMessage()); } @@ -468,7 +497,7 @@ public void resolveQueueRequestByLocalConfigNullQueueDomainTest() { // Act try { - KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", null, null, "secretKey"); + KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "QueueDomain from queueConfig can not be null or empty.".equals(ex.getMessage()); } @@ -497,7 +526,7 @@ public void resolveQueueRequestByLocalConfigInvalidCookieValidityMinuteTest() { // Act try { - KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", null, null, "secretKey"); + KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", new HttpServletRequestMock(), null, "secretKey"); } catch (Exception ex) { exceptionWasThrown = "cookieValidityMinute from queueConfig should be greater than 0.".equals(ex.getMessage()); } @@ -524,7 +553,7 @@ public void resolveQueueRequestByLocalConfigTest() throws Exception { eventConfig.setVersion(12); // Act - KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", null, null, "secretKey"); + RequestValidationResult result = KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", new HttpServletRequestMock(), null, "secretKey"); // Assert assertTrue("targetUrl".equals(mock.validateQueueRequestCalls.get(0).get(0))); @@ -532,6 +561,38 @@ public void resolveQueueRequestByLocalConfigTest() throws Exception { assertTrue("cookieDomain:layoutName:culture:eventId:queueDomain:true:10:12".equals(mock.validateQueueRequestCalls.get(0).get(2))); assertTrue("customerId".equals(mock.validateQueueRequestCalls.get(0).get(3))); assertTrue("secretKey".equals(mock.validateQueueRequestCalls.get(0).get(4))); + assertFalse(result.isAjaxResult); + } + + @Test + public void resolveQueueRequestByLocalConfigAjaxCallTest() throws Exception { + // Arrange + HttpServletRequestMock requestMock = new HttpServletRequestMock(); + requestMock.Headers.put("x-queueit-ajaxpageurl", "http%3A%2F%2Furl"); + + UserInQueueServiceMock mock = new UserInQueueServiceMock(); + KnownUser.setUserInQueueService(mock); + + QueueEventConfig eventConfig = new QueueEventConfig(); + eventConfig.setCookieDomain("cookieDomain"); + eventConfig.setLayoutName("layoutName"); + eventConfig.setCulture("culture"); + eventConfig.setEventId("eventId"); + eventConfig.setQueueDomain("queueDomain"); + eventConfig.setExtendCookieValidity(true); + eventConfig.setCookieValidityMinute(10); + eventConfig.setVersion(12); + + // Act + RequestValidationResult result = KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "queueitToken", eventConfig, "customerId", requestMock, null, "secretKey"); + + // Assert + assertTrue("http://url".equals(mock.validateQueueRequestCalls.get(0).get(0))); + assertTrue("queueitToken".equals(mock.validateQueueRequestCalls.get(0).get(1))); + assertTrue("cookieDomain:layoutName:culture:eventId:queueDomain:true:10:12".equals(mock.validateQueueRequestCalls.get(0).get(2))); + assertTrue("customerId".equals(mock.validateQueueRequestCalls.get(0).get(3))); + assertTrue("secretKey".equals(mock.validateQueueRequestCalls.get(0).get(4))); + assertTrue(result.isAjaxResult); } @Test @@ -549,7 +610,7 @@ public void resolveQueueRequestByLocalConfigDebugCookieLoggingTest() throws Exce queueConfig.setExtendCookieValidity(true); queueConfig.setCookieValidityMinute(10); queueConfig.setVersion(12); - + HttpServletRequestMock requestMock = new HttpServletRequestMock(); requestMock.RequestURL = "requestUrl"; requestMock.RemoteAddr = "80.35.35.34"; @@ -558,9 +619,9 @@ public void resolveQueueRequestByLocalConfigDebugCookieLoggingTest() throws Exce requestMock.Headers.put("x-forwarded-for", "129.78.138.66, 129.78.64.103"); requestMock.Headers.put("x-forwarded-host", "en.wikipedia.org:8080"); requestMock.Headers.put("x-forwarded-proto", "https"); - + HttpServletResponseMock responseMock = new HttpServletResponseMock(); - + // Act String secretKey = "secretkey"; String queueittoken = QueueITTokenGenerator.generateToken("eventId", secretKey); @@ -589,7 +650,7 @@ public void resolveQueueRequestByLocalConfigDebugCookieLoggingTest() throws Exce assertTrue(decodedCookieValue.contains("|RequestHttpHeader_XForwardedHost=en.wikipedia.org:8080")); assertTrue(decodedCookieValue.contains("|RequestHttpHeader_XForwardedProto=https")); } - + @Test public void validateRequestByIntegrationConfigEmptyCurrentUrlTest() { // Arrange @@ -629,7 +690,7 @@ public void validateRequestByIntegrationConfigEmptyIntegrationsConfigTest() { } @Test - public void validateRequestByIntegrationConfigTest() throws Exception { + public void validateRequestByIntegrationConfigQueueActionTest() throws Exception { // Arrange UserInQueueServiceMock mock = new UserInQueueServiceMock(); KnownUser.setUserInQueueService(mock); @@ -641,7 +702,7 @@ public void validateRequestByIntegrationConfigTest() throws Exception { triggerPart1.ValidatorType = "UrlValidator"; triggerPart1.IsNegative = false; triggerPart1.IsIgnoreCase = true; - + TriggerPart triggerPart2 = new TriggerPart(); triggerPart2.Operator = "Contains"; triggerPart2.ValueToCompare = "googlebot"; @@ -651,7 +712,7 @@ public void validateRequestByIntegrationConfigTest() throws Exception { TriggerModel trigger = new TriggerModel(); trigger.LogicalOperator = "And"; - trigger.TriggerParts = new TriggerPart[]{triggerPart1,triggerPart2}; + trigger.TriggerParts = new TriggerPart[]{triggerPart1, triggerPart2}; IntegrationConfigModel config = new IntegrationConfigModel(); config.Name = "event1action"; @@ -672,8 +733,9 @@ public void validateRequestByIntegrationConfigTest() throws Exception { customerIntegration.Version = 3; HttpServletRequestMock httpContextMock = new HttpServletRequestMock(); httpContextMock.UserAgent = "googlebot"; + // Act - KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", httpContextMock, null, "secretKey"); + RequestValidationResult result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", httpContextMock, null, "secretKey"); // Assert assertTrue(mock.validateQueueRequestCalls.size() == 1); @@ -682,6 +744,67 @@ public void validateRequestByIntegrationConfigTest() throws Exception { assertTrue(".test.com:Christmas Layout by Queue-it:da-DK:event1:knownusertest.queue-it.net:true:20:3".equals(mock.validateQueueRequestCalls.get(0).get(2))); assertTrue("customerId".equals(mock.validateQueueRequestCalls.get(0).get(3))); assertTrue("secretKey".equals(mock.validateQueueRequestCalls.get(0).get(4))); + assertFalse(result.isAjaxResult); + } + + @Test + public void validateRequestByIntegrationConfigQueueActionAjaxCallTest() throws Exception { + // Arrange + UserInQueueServiceMock mock = new UserInQueueServiceMock(); + KnownUser.setUserInQueueService(mock); + + TriggerPart triggerPart1 = new TriggerPart(); + triggerPart1.Operator = "Contains"; + triggerPart1.ValueToCompare = "event1"; + triggerPart1.UrlPart = "PageUrl"; + triggerPart1.ValidatorType = "UrlValidator"; + triggerPart1.IsNegative = false; + triggerPart1.IsIgnoreCase = true; + + TriggerPart triggerPart2 = new TriggerPart(); + triggerPart2.Operator = "Contains"; + triggerPart2.ValueToCompare = "googlebot"; + triggerPart2.ValidatorType = "UserAgentValidator"; + triggerPart2.IsNegative = false; + triggerPart2.IsIgnoreCase = false; + + TriggerModel trigger = new TriggerModel(); + trigger.LogicalOperator = "And"; + trigger.TriggerParts = new TriggerPart[]{triggerPart1, triggerPart2}; + + IntegrationConfigModel config = new IntegrationConfigModel(); + config.Name = "event1action"; + config.EventId = "event1"; + config.CookieDomain = ".test.com"; + config.LayoutName = "Christmas Layout by Queue-it"; + config.Culture = "da-DK"; + config.ExtendCookieValidity = true; + config.CookieValidityMinute = 20; + config.Triggers = new TriggerModel[]{trigger}; + config.QueueDomain = "knownusertest.queue-it.net"; + config.RedirectLogic = "AllowTParameter"; + config.ForcedTargetUrl = ""; + config.ActionType = ActionType.QUEUE_ACTION; + + CustomerIntegration customerIntegration = new CustomerIntegration(); + customerIntegration.Integrations = new IntegrationConfigModel[]{config}; + customerIntegration.Version = 3; + + HttpServletRequestMock requestMock = new HttpServletRequestMock(); + requestMock.UserAgent = "googlebot"; + requestMock.Headers.put("x-queueit-ajaxpageurl", "http%3A%2F%2Furl"); + + // Act + RequestValidationResult result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", requestMock, null, "secretKey"); + + // Assert + assertTrue(mock.validateQueueRequestCalls.size() == 1); + assertTrue("http://url".equals(mock.validateQueueRequestCalls.get(0).get(0))); + assertTrue("queueitToken".equals(mock.validateQueueRequestCalls.get(0).get(1))); + assertTrue(".test.com:Christmas Layout by Queue-it:da-DK:event1:knownusertest.queue-it.net:true:20:3".equals(mock.validateQueueRequestCalls.get(0).get(2))); + assertTrue("customerId".equals(mock.validateQueueRequestCalls.get(0).get(3))); + assertTrue("secretKey".equals(mock.validateQueueRequestCalls.get(0).get(4))); + assertTrue(result.isAjaxResult); } @Test @@ -697,7 +820,7 @@ public void validateRequestByIntegrationConfigDebugCookieLoggingTest() throws Ex triggerPart1.ValidatorType = "UrlValidator"; triggerPart1.IsNegative = false; triggerPart1.IsIgnoreCase = true; - + TriggerPart triggerPart2 = new TriggerPart(); triggerPart2.Operator = "Contains"; triggerPart2.ValueToCompare = "googlebot"; @@ -707,7 +830,7 @@ public void validateRequestByIntegrationConfigDebugCookieLoggingTest() throws Ex TriggerModel trigger = new TriggerModel(); trigger.LogicalOperator = "And"; - trigger.TriggerParts = new TriggerPart[]{triggerPart1,triggerPart2}; + trigger.TriggerParts = new TriggerPart[]{triggerPart1, triggerPart2}; IntegrationConfigModel config = new IntegrationConfigModel(); config.Name = "event1action"; @@ -726,17 +849,17 @@ public void validateRequestByIntegrationConfigDebugCookieLoggingTest() throws Ex CustomerIntegration customerIntegration = new CustomerIntegration(); customerIntegration.Integrations = new IntegrationConfigModel[]{config}; customerIntegration.Version = 3; - + HttpServletRequestMock requestMock = new HttpServletRequestMock(); requestMock.UserAgent = "googlebot"; requestMock.RequestURL = "requestUrl"; - - HttpServletResponseMock responseMock = new HttpServletResponseMock(); - + + HttpServletResponseMock responseMock = new HttpServletResponseMock(); + // Act String secretKey = "secretkey"; String queueittoken = QueueITTokenGenerator.generateToken("eventId", secretKey); - + KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", queueittoken, customerIntegration, "customerId", requestMock, responseMock, secretKey); // Assert @@ -758,7 +881,7 @@ public void validateRequestByIntegrationConfigDebugCookieLoggingTest() throws Ex assertTrue(decodedCookieValue.contains("|TargetUrl=http://test.com?event1=true")); assertTrue(decodedCookieValue.contains("|MatchedConfig=event1action")); } - + @Test public void validateRequestByIntegrationConfigNotMatchTest() throws Exception { // Arrange @@ -795,18 +918,18 @@ public void validateRequestByIntegrationConfigNotMatchDebugCookieLoggingTest() t requestMock.Headers.put("x-forwarded-for", "129.78.138.66, 129.78.64.103"); requestMock.Headers.put("x-forwarded-host", "en.wikipedia.org:8080"); requestMock.Headers.put("x-forwarded-proto", "https"); - + HttpServletResponseMock responseMock = new HttpServletResponseMock(); - + // Act String secretKey = "secretkey"; String queueittoken = QueueITTokenGenerator.generateToken("eventId", secretKey); - + KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", queueittoken, customerIntegration, "customerId", requestMock, responseMock, secretKey); // Assert assertTrue(responseMock.addedCookies.size() == 1); - assertTrue(responseMock.addedCookies.get(0).getName().equals(KnownUser.QueueITDebugKey)); + assertTrue(responseMock.addedCookies.get(0).getName().equals(KnownUser.QueueITDebugKey)); String decodedCookieValue = URLDecoder.decode(responseMock.addedCookies.get(0).getValue(), "UTF-8"); assertTrue(decodedCookieValue.contains("OriginalUrl=requestUrl")); assertTrue(decodedCookieValue.contains("|PureUrl=http://test.com?event1=true")); @@ -817,9 +940,9 @@ public void validateRequestByIntegrationConfigNotMatchDebugCookieLoggingTest() t assertTrue(decodedCookieValue.contains("|RequestHttpHeader_Forwarded=for=192.0.2.60;proto=http;by=203.0.113.43")); assertTrue(decodedCookieValue.contains("|RequestHttpHeader_XForwardedFor=129.78.138.66, 129.78.64.103")); assertTrue(decodedCookieValue.contains("|RequestHttpHeader_XForwardedHost=en.wikipedia.org:8080")); - assertTrue(decodedCookieValue.contains("|RequestHttpHeader_XForwardedProto=https")); + assertTrue(decodedCookieValue.contains("|RequestHttpHeader_XForwardedProto=https")); } - + @Test public void validateRequestByIntegrationConfigForcedTargeturlTest() throws Exception { // Arrange @@ -950,7 +1073,7 @@ public void validateRequestByIntegrationConfigEventTargetUrl() throws Exception assertTrue(mock.validateQueueRequestCalls.size() == 1); assertTrue("".equals(mock.validateQueueRequestCalls.get(0).get(0))); } - + @Test public void validateRequestByIntegrationConfigIgnoreAction() throws Exception { // Arrange @@ -974,7 +1097,7 @@ public void validateRequestByIntegrationConfigIgnoreAction() throws Exception { config.EventId = "event1"; config.CookieDomain = "cookiedomain"; config.Triggers = new TriggerModel[]{trigger}; - config.QueueDomain = "queuedomain"; + config.QueueDomain = "queuedomain"; config.ActionType = ActionType.IGNORE_ACTION; CustomerIntegration customerIntegration = new CustomerIntegration(); @@ -982,12 +1105,54 @@ public void validateRequestByIntegrationConfigIgnoreAction() throws Exception { customerIntegration.Version = 3; // Act - KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", new HttpServletRequestMock(), null, "secretKey"); + RequestValidationResult result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", new HttpServletRequestMock(), null, "secretKey"); + + // Assert + assertTrue(mock.getIgnoreActionResultCalls.size() == 1); + assertFalse(result.isAjaxResult); + } + + @Test + public void validateRequestByIntegrationConfigAjaxCallIgnoreAction() throws Exception { + // Arrange + TriggerPart triggerPart = new TriggerPart(); + triggerPart.Operator = "Contains"; + triggerPart.ValueToCompare = "event1"; + triggerPart.UrlPart = "PageUrl"; + triggerPart.ValidatorType = "UrlValidator"; + triggerPart.IsNegative = false; + triggerPart.IsIgnoreCase = true; + + TriggerModel trigger = new TriggerModel(); + trigger.LogicalOperator = "And"; + trigger.TriggerParts = new TriggerPart[]{triggerPart}; + + IntegrationConfigModel config = new IntegrationConfigModel(); + config.Name = "event1action"; + config.EventId = "event1"; + config.CookieDomain = "cookiedomain"; + config.Triggers = new TriggerModel[]{trigger}; + config.QueueDomain = "queuedomain"; + config.ActionType = ActionType.IGNORE_ACTION; + + CustomerIntegration customerIntegration = new CustomerIntegration(); + customerIntegration.Integrations = new IntegrationConfigModel[]{config}; + customerIntegration.Version = 3; + + HttpServletRequestMock requestMock = new HttpServletRequestMock(); + requestMock.Headers.put("x-queueit-ajaxpageurl", "url"); + + UserInQueueServiceMock mock = new UserInQueueServiceMock(); + KnownUser.setUserInQueueService(mock); + + // Act + RequestValidationResult result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", requestMock, null, "secretKey"); // Assert - assertTrue(mock.getIgnoreActionResultCalls.size() == 1); + assertTrue(mock.getIgnoreActionResultCalls.size() == 1); + assertTrue(result.isAjaxResult); } - + @Test public void validateRequestByIntegrationConfigCancelAction() throws Exception { // Arrange @@ -1011,7 +1176,7 @@ public void validateRequestByIntegrationConfigCancelAction() throws Exception { config.EventId = "event1"; config.CookieDomain = "cookiedomain"; config.Triggers = new TriggerModel[]{trigger}; - config.QueueDomain = "queuedomain"; + config.QueueDomain = "queuedomain"; config.ActionType = ActionType.CANCEL_ACTION; CustomerIntegration customerIntegration = new CustomerIntegration(); @@ -1019,27 +1184,73 @@ public void validateRequestByIntegrationConfigCancelAction() throws Exception { customerIntegration.Version = 3; // Act - KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", new HttpServletRequestMock(), null, "secretKey"); + RequestValidationResult result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", new HttpServletRequestMock(), null, "secretKey"); // Assert assertTrue("http://test.com?event1=true".equals(mock.validateCancelRequestCalls.get(0).get(0))); assertTrue("cookiedomain:event1:queuedomain:3".equals(mock.validateCancelRequestCalls.get(0).get(1))); assertTrue("customerId".equals(mock.validateCancelRequestCalls.get(0).get(2))); assertTrue("secretKey".equals(mock.validateCancelRequestCalls.get(0).get(3))); + assertFalse(result.isAjaxResult); } - + + @Test + public void validateRequestByIntegrationConfigAjaxCallCancelAction() throws Exception { + // Arrange + TriggerPart triggerPart = new TriggerPart(); + triggerPart.Operator = "Contains"; + triggerPart.ValueToCompare = "event1"; + triggerPart.UrlPart = "PageUrl"; + triggerPart.ValidatorType = "UrlValidator"; + triggerPart.IsNegative = false; + triggerPart.IsIgnoreCase = true; + + TriggerModel trigger = new TriggerModel(); + trigger.LogicalOperator = "And"; + trigger.TriggerParts = new TriggerPart[]{triggerPart}; + + IntegrationConfigModel config = new IntegrationConfigModel(); + config.Name = "event1action"; + config.EventId = "event1"; + config.CookieDomain = "cookiedomain"; + config.Triggers = new TriggerModel[]{trigger}; + config.QueueDomain = "queuedomain"; + config.ActionType = ActionType.CANCEL_ACTION; + + CustomerIntegration customerIntegration = new CustomerIntegration(); + customerIntegration.Integrations = new IntegrationConfigModel[]{config}; + customerIntegration.Version = 3; + + HttpServletRequestMock requestMock = new HttpServletRequestMock(); + requestMock.Headers.put("x-queueit-ajaxpageurl", "http%3A%2F%2Furl"); + + UserInQueueServiceMock mock = new UserInQueueServiceMock(); + KnownUser.setUserInQueueService(mock); + + // Act + RequestValidationResult result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueitToken", customerIntegration, "customerId", requestMock, null, "secretKey"); + + // Assert + assertTrue("http://url".equals(mock.validateCancelRequestCalls.get(0).get(0))); + assertTrue("cookiedomain:event1:queuedomain:3".equals(mock.validateCancelRequestCalls.get(0).get(1))); + assertTrue("customerId".equals(mock.validateCancelRequestCalls.get(0).get(2))); + assertTrue("secretKey".equals(mock.validateCancelRequestCalls.get(0).get(3))); + assertTrue(result.isAjaxResult); + } + class HttpServletRequestMock implements HttpServletRequest { + public Cookie[] CookiesValue; public String UserAgent; public String RequestURL; public String QueryString; public String RemoteAddr; public HashMap Headers; - + public HttpServletRequestMock() { this.Headers = new HashMap(); } - + @Override public String getAuthType() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. @@ -1057,14 +1268,16 @@ public long getDateHeader(String string) { @Override public String getHeader(String key) { - if("User-Agent".equals(key)) + if ("User-Agent".equals(key)) { return this.UserAgent; - + } + String value = (String) this.Headers.get(key); - - if(value == null) + + if (value == null) { value = ""; - + } + return value; } @@ -1393,10 +1606,11 @@ public DispatcherType getDispatcherType() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } } - + class HttpServletResponseMock implements HttpServletResponse { + ArrayList addedCookies = new ArrayList<>(); - + @Override public void addCookie(Cookie cookie) { addedCookies.add(cookie); @@ -1582,13 +1796,13 @@ public Locale getLocale() { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } } - + public static class QueueITTokenGenerator { public static String generateToken( - String eventId, - String secretKey) throws Exception { - + String eventId, + String secretKey) throws Exception { + ArrayList paramList = new ArrayList<>(); paramList.add(QueueParameterHelper.EventIdKey + QueueParameterHelper.KeyValueSeparatorChar + eventId); paramList.add(QueueParameterHelper.RedirectTypeKey + QueueParameterHelper.KeyValueSeparatorChar + "debug");