public void ValidateRequest_NoCookie_EventIdMismatch_RedirectToErrorPageWithEventIdMissMatchError_DoNotStoreCookie()
        {
            var cookieProviderMock = Substitute.For <IUserInQueueStateRepository>();
            var config             = new QueueEventConfig()
            {
                EventId              = "e2",
                QueueDomain          = "testDomain.com",
                CookieValidityMinute = 10,
                ExtendCookieValidity = false,
                Version              = 10,
                ActionName           = "QueueAction"
            };
            var customerKey = "4e1db821-a825-49da-acd0-5d376f2068db";
            var queueId     = "iopdb821-a825-49da-acd0-5d376f2068db";

            cookieProviderMock.GetState("", 10, "").ReturnsForAnyArgs(new StateInfo(false, false, "", null, ""));
            string hash = "";

            var queueitToken = QueueITTokenGenerator.GenerateToken(
                DateTime.UtcNow.AddHours(1),
                "e1",
                queueId,
                true,
                null,
                customerKey,
                out hash, "queue"
                );

            var targetUrl        = "http://test.test.com?b=h";
            var knownUserVersion = UserInQueueService.SDK_VERSION;
            var expectedMan      = Uri.EscapeDataString(config.ActionName);
            var expectedErrorUrl = $"https://testDomain.com/error/eventid/?c=testCustomer&e=e2" +
                                   $"&ver={knownUserVersion}" + "&cver=10"
                                   + $"&man=QueueAction"
                                   + $"&queueittoken={queueitToken}"
                                   + $"&t={Uri.EscapeDataString(targetUrl)}";

            UserInQueueService testObject = new UserInQueueService(cookieProviderMock);

            var result = testObject.ValidateQueueRequest(targetUrl, queueitToken, config, "testCustomer", customerKey);

            Assert.True(result.DoRedirect);
            var regex           = new Regex("&ts=[^&]*");
            var match           = regex.Match(result.RedirectUrl);
            var serverTimestamp = DateTimeHelper.GetDateTimeFromUnixTimeStamp(match.Value.Replace("&ts=", "").Replace("&", ""));

            Assert.True(DateTime.UtcNow.Subtract(serverTimestamp) < TimeSpan.FromSeconds(10));

            var redirectUrl = regex.Replace(result.RedirectUrl, "");

            Assert.True(redirectUrl.ToUpper() == expectedErrorUrl.ToUpper());
            Assert.True(config.EventId == result.EventId);
            Assert.Equal(config.ActionName, result.ActionName);
            cookieProviderMock.DidNotReceiveWithAnyArgs().Store("", "", null, "", false, false, null, "");
            cookieProviderMock.DidNotReceiveWithAnyArgs().CancelQueueCookie(config.EventId, config.CookieDomain, config.IsCookieHttpOnly, config.IsCookieSecure);
        }
        public void ValidateRequest_NoCookie_ValidToken_ExtendableCookie_DoNotRedirect_StoreExtendableCookie()
        {
            var cookieProviderMock = Substitute.For <IUserInQueueStateRepository>();

            var config = new QueueEventConfig()
            {
                EventId              = "e1",
                QueueDomain          = "testDomain.com",
                CookieValidityMinute = 10,
                ExtendCookieValidity = false,
                ActionName           = "QueueAction"
            };
            var customerKey = "4e1db821-a825-49da-acd0-5d376f2068db";

            var queueId = "iopdb821-a825-49da-acd0-5d376f2068db";

            cookieProviderMock.GetState("", 10, "").ReturnsForAnyArgs(new StateInfo(false, false, "", null, ""));
            string hash = "";

            var queueitToken = QueueITTokenGenerator.GenerateToken(
                DateTime.UtcNow.AddHours(1),
                "e1",
                queueId,
                true,
                null,
                customerKey,
                out hash,
                "queue");

            var targetUrl = "http://test.test.com?b=h";
            UserInQueueService testObject = new UserInQueueService(cookieProviderMock);

            var result = testObject.ValidateQueueRequest(targetUrl, queueitToken, config, "testCustomer", customerKey);

            Assert.True(!result.DoRedirect);

            cookieProviderMock.Received().Store(
                "e1",
                queueId,
                null,
                config.CookieDomain,
                config.IsCookieHttpOnly,
                config.IsCookieSecure,
                "queue",
                customerKey);
            Assert.True(result.QueueId == queueId);
            Assert.True(result.RedirectType == "queue");
            Assert.True(config.EventId == result.EventId);
            cookieProviderMock.DidNotReceiveWithAnyArgs().CancelQueueCookie(config.EventId, config.CookieDomain, config.IsCookieHttpOnly, config.IsCookieSecure);
        }