public void ValidateRequestByLocalEventConfig_Test()
        {
            // Arrange
            UserInQueueServiceMock mock = new UserInQueueServiceMock();

            KnownUser._UserInQueueService = (mock);

            EventConfig eventConfig = new EventConfig();

            eventConfig.CookieDomain         = "cookieDomain";
            eventConfig.LayoutName           = "layoutName";
            eventConfig.Culture              = "culture";
            eventConfig.EventId              = "eventId";
            eventConfig.QueueDomain          = "queueDomain";
            eventConfig.ExtendCookieValidity = true;
            eventConfig.CookieValidityMinute = 10;
            eventConfig.Version              = 12;

            // Act
            KnownUser.ValidateRequestByLocalEventConfig("targetUrl", "queueitToken", eventConfig, "customerId", "secretKey");

            // Assert
            Assert.Equal("targetUrl", mock.validateRequestCalls[0][0]);
            Assert.Equal("queueitToken", mock.validateRequestCalls[0][1]);
            Assert.Equal("cookieDomain:layoutName:culture:eventId:queueDomain:true:10:12", mock.validateRequestCalls[0][2]);
            Assert.Equal("customerId", mock.validateRequestCalls[0][3]);
            Assert.Equal("secretKey", mock.validateRequestCalls[0][4]);
        }
        public void ValidateRequestByLocalEventConfig_InvalidCookieValidityMinute_Test()
        {
            // Arrange
            UserInQueueServiceMock mock = new UserInQueueServiceMock();

            KnownUser._UserInQueueService = (mock);
            bool exceptionWasThrown = false;

            EventConfig eventConfig = new EventConfig();

            eventConfig.CookieDomain         = "cookieDomain";
            eventConfig.LayoutName           = "layoutName";
            eventConfig.Culture              = "culture";
            eventConfig.EventId              = "eventId";
            eventConfig.QueueDomain          = "queueDomain";
            eventConfig.ExtendCookieValidity = true;
            //eventConfig.CookieValidityMinute = 10;
            eventConfig.Version = 12;

            // Act
            try
            {
                KnownUser.ValidateRequestByLocalEventConfig("targetUrl", "queueitToken", eventConfig, "customerId", "secretKey");
            }
            catch (ArgumentException ex)
            {
                exceptionWasThrown = ex.Message == "CookieValidityMinute from eventConfig should be greater than 0.";
            }

            // Assert
            Assert.True(mock.validateRequestCalls.Count == 0);
            Assert.True(exceptionWasThrown);
        }
        private void DoValidationByLocalEventConfig()
        {
            try
            {
                var customerId = "Your Queue-it customer ID";
                var secretKey  = "Your 72 char secrete key as specified in Go Queue-it self-service platform";

                var queueitToken = Request.QueryString[KnownUser.QueueITTokenKey];
                var pureUrl      = Regex.Replace(Request.Url.ToString(), @"([\?&])(" + KnownUser.QueueITTokenKey + "=[^&]*)", string.Empty, RegexOptions.IgnoreCase);
                var eventConfig  = new EventConfig()
                {
                    EventId              = "event1",             //ID of the queue to use
                    CookieDomain         = ".mydomain.com",      //Optional - Domain name where the Queue-it session cookie should be saved. Default is to save on the domain of the request
                    QueueDomain          = "queue.mydomain.com", //Optional - Domian name of the queue. Default is [CustomerId].queue-it.net
                    CookieValidityMinute = 15,                   //Optional - Validity of the Queue-it session cookie. Default is 10 minutes
                    ExtendCookieValidity = false,                //Optional - Should the Queue-it session cookie validity time be extended each time the validation runs? Default is true.
                    Culture              = "en-US",              //Optional - Culture of the queue ticket layout in the format specified here: https://msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx Default is to use what is specified on Event
                    LayoutName           = "MyCustomLayoutName"  //Optional - Name of the queue ticket layout - e.g. "Default layout by Queue-it". Default is to use what is specified on the Event
                };

                //Verify if the user has been through the queue
                var validationResult = KnownUser.ValidateRequestByLocalEventConfig(pureUrl, queueitToken, eventConfig, customerId, secretKey);

                if (validationResult.DoRedirect)
                {
                    //Send the user to the queue - either becuase hash was missing or becuase is was invalid
                    Response.Redirect(validationResult.RedirectUrl);
                }
                else
                {
                    //Request can continue - we remove queueittoken form querystring parameter to avoid sharing of user specific token
                    if (HttpContext.Current.Request.Url.ToString().Contains(KnownUser.QueueITTokenKey))
                    {
                        Response.Redirect(pureUrl);
                    }
                }
            }
            catch (System.Threading.ThreadAbortException)
            {
                //Response.Redirect will raise System.Threading.ThreadAbortException to end the exceution, no need to log the error
            }
            catch (Exception ex)
            {
                //There was an error validationg the request
                //Please log the error and let user continue
            }
        }
        public void ValidateRequestByLocalEventConfig_NullEventConfig_Test()
        {
            // Arrange
            UserInQueueServiceMock mock = new UserInQueueServiceMock();

            KnownUser._UserInQueueService = (mock);
            bool exceptionWasThrown = false;

            // Act
            try
            {
                KnownUser.ValidateRequestByLocalEventConfig("targetUrl", "queueitToken", null, "customerId", "secretKey");
            }
            catch (ArgumentException ex)
            {
                exceptionWasThrown = ex.Message == "eventConfig can not be null.";
            }

            // Assert
            Assert.True(mock.validateRequestCalls.Count == 0);
            Assert.True(exceptionWasThrown);
        }