Ejemplo n.º 1
0
            public void WhenGenerateSessionIdCalledWithSaltIsWhitespace_ValueShouldNotBeNull()
            {
                var sessionId = SessionIdHelper.GenerateSessionId("", DateTime.UtcNow);

                sessionId.Should().NotBeNullOrWhiteSpace();
                sessionId.Should().NotBeNullOrEmpty();
            }
Ejemplo n.º 2
0
            public void WhenGenerateSessionIdCalledWithSaltAndWithoutDate_ValueShouldNotBeNull()
            {
                var sessionId = SessionIdHelper.GenerateSessionId("Salt");

                sessionId.Should().NotBeNullOrWhiteSpace();
                sessionId.Should().NotBeNullOrEmpty();
            }
        public void PartitionKey_WithVariousDates_ShouldMatchTheory(int year, int month, string expectedPartitionKey)
        {
            var creationDate  = new DateTime(year, month, 1);
            var sessionId     = SessionIdHelper.GenerateSessionId(SESSION_SALT, creationDate);
            var datetimeStamp = SessionIdHelper.Decode(SESSION_SALT, sessionId);

            string partitionKey = SessionIdHelper.GetYearMonth(datetimeStamp);

            Assert.Equal(expectedPartitionKey, partitionKey);
        }
        public void PartitionKey_WithNewSession_ShouldDecodeToCurrentMonthYear()
        {
            var expected      = DateTime.Now.ToString("yyyyMM");
            var sessionId     = SessionIdHelper.GenerateSessionId(SESSION_SALT);
            var datetimeStamp = SessionIdHelper.Decode(SESSION_SALT, sessionId);

            string partitionKey = SessionIdHelper.GetYearMonth(datetimeStamp);

            Assert.Equal(expected, partitionKey);
        }
Ejemplo n.º 5
0
            public void CounterShouldResetAfter99()
            {
                var result = 0;

                do
                {
                    result = SessionIdHelper.Counter();
                } while (result < 99);
                result = SessionIdHelper.Counter();
                result.Should().Be(1);
            }
Ejemplo n.º 6
0
            public void EncodedValueShouldReturnSameValueWhenDecoded()
            {
                string Alphabet  = "acefghjkmnrstwxyz23456789";
                var    salt      = "BatteryHorseStapleCorrect";
                var    sessionId = SessionIdHelper.GenerateSessionId(salt, DateTime.UtcNow);
                var    hashids   = new Hashids(salt, 4, Alphabet);
                var    digits    = hashids.DecodeLong(sessionId).First();

                var decode = SessionIdHelper.Decode(salt, sessionId);

                decode.Should().Be(digits.ToString());
            }
Ejemplo n.º 7
0
        private static UserSession CreateSession(string questionSetVersion, int maxQuestions, string languageCode = "en")
        {
            string partitionKey = DateTime.Now.ToString("yyyyMM");
            string salt         = Guid.NewGuid().ToString();

            return(new UserSession()
            {
                UserSessionId = SessionIdHelper.GenerateSessionId(salt) + "_shl",
                Salt = salt,
                StartedDt = DateTime.Now,
                LanguageCode = languageCode,
                PartitionKey = partitionKey,
                AssessmentState = new AssessmentState(questionSetVersion, maxQuestions)
            });
        }
        public void GenerateSessionId_With1000_ShouldAllBeUnique()
        {
            int amount = 1000;
            var codes  = new List <string>();

            for (var i = 0; i < amount; i++)
            {
                var index = new Random().Next(0);
                var hash  = SessionIdHelper.GenerateSessionId(SESSION_SALT);
                if (codes.Contains(hash) == true)
                {
                    throw new Exception($"duplicate {i}");
                }
                codes.Add(hash);
            }
            int maxLength = codes.Select(x => x.Length).OrderByDescending(x => x).First();

            Output.WriteLine($"Code max length {maxLength}");
            Assert.Equal(amount, codes.Count);
        }
Ejemplo n.º 9
0
 private static string ProcessBroker(HttpListenerRequest request)
 {
     return("{ \"ResponseType\": \"System\", \"Port\": " + SessionIdHelper.GetClientSessionPort(request.RemoteEndPoint) + " }");
 }
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "assessment/{sessionId}/{assessment}/q/{questionNumber}")] HttpRequest req,
            string sessionId,
            string assessment,
            int questionNumber,
            ILogger log,
            [Inject] IHttpRequestHelper httpRequestHelper,
            [Inject] IHttpResponseMessageHelper httpResponseMessageHelper,
            [Inject] IUserSessionRepository userSessionRepository,
            [Inject] IQuestionRepository questionRepository,
            [Inject] IOptions <AppSettings> appSettings)
        {
            try
            {
                var correlationId = httpRequestHelper.GetDssCorrelationId(req);
                if (string.IsNullOrEmpty(correlationId))
                {
                    log.LogInformation("Unable to locate 'DssCorrelationId' in request header");
                }

                if (!Guid.TryParse(correlationId, out var correlationGuid))
                {
                    log.LogInformation("Unable to parse 'DssCorrelationId' to a Guid");
                    correlationGuid = Guid.NewGuid();
                }

                if (string.IsNullOrEmpty(sessionId))
                {
                    log.LogInformation($"CorrelationId: {correlationGuid} - Session Id not supplied");
                    return(httpResponseMessageHelper.BadRequest());
                }

                if (string.IsNullOrEmpty(assessment))
                {
                    log.LogInformation($"CorrelationId: {correlationGuid} - Assessment not supplied");
                    return(httpResponseMessageHelper.BadRequest());
                }

                if (string.IsNullOrEmpty(appSettings?.Value.SessionSalt))
                {
                    log.LogInformation($"CorrelationId: {correlationGuid} -Session salt not missing from configuration");
                    return(httpResponseMessageHelper.BadRequest());
                }

                if (!sessionId.Contains("-"))
                {
                    var datetimeStamp = SessionIdHelper.Decode(appSettings?.Value.SessionSalt, sessionId);
                    if (datetimeStamp == null)
                    {
                        log.LogError($"CorrelationId: {correlationGuid} - Could not decode session id correctly: {sessionId}");
                        return(httpResponseMessageHelper.BadRequest());
                    }
                    string partitionKey = SessionIdHelper.GetYearMonth(datetimeStamp);
                    sessionId = $"{partitionKey}-{sessionId}";
                }

                var userSession = await userSessionRepository.GetUserSession(sessionId);

                if (userSession == null)
                {
                    log.LogError($"CorrelationId: {correlationGuid} - Session Id does not exist {sessionId}");
                    return(httpResponseMessageHelper.NoContent());
                }

                Question question = null;

                if (assessment.EqualsIgnoreCase("short"))
                {
                    if (userSession.AssessmentState.IsComplete && questionNumber == 1)
                    {
                        userSession.AssessmentState.RecordedAnswers = new Answer[] {};
                        await userSessionRepository.UpdateUserSession(userSession);
                    }

                    question = await questionRepository.GetQuestion(questionNumber, userSession.CurrentQuestionSetVersion);

                    userSession.AssessmentState.CurrentQuestion = questionNumber;
                }
                else
                {
                    userSession.FilteredAssessmentState.CurrentFilterAssessmentCode = JobCategoryHelper.GetCode(assessment);
                    userSession.FilteredAssessmentState.CurrentQuestion             = questionNumber;

                    question = await questionRepository.GetQuestion(userSession.FilteredAssessmentState.CurrentQuestionId);
                }

                if (question == null)
                {
                    log.LogInformation($"CorrelationId: {correlationGuid} - Question number {userSession.CurrentQuestion} could not be found on session {userSession.PrimaryKey}");
                    return(httpResponseMessageHelper.NoContent());
                }

                var percentageComplete = userSession.AssessmentState.PercentageComplete;

                var nextQuestion = question.IsFilterQuestion ? userSession.FilteredAssessmentState.MoveToNextQuestion() : userSession.AssessmentState.MoveToNextQuestion();
                await userSessionRepository.UpdateUserSession(userSession);

                var response = new AssessmentQuestionResponse()
                {
                    CurrentFilterAssessmentCode = userSession.FilteredAssessmentState?.CurrentFilterAssessmentCode,
                    IsComplete           = question.IsFilterQuestion ? (userSession.FilteredAssessmentState?.IsComplete ?? false) : userSession.AssessmentState.IsComplete,
                    NextQuestionNumber   = nextQuestion,
                    QuestionId           = question.QuestionId,
                    QuestionText         = question.Texts.FirstOrDefault(x => x.LanguageCode.ToLower() == "en")?.Text,
                    TraitCode            = question.TraitCode,
                    QuestionNumber       = questionNumber,
                    SessionId            = userSession.PrimaryKey,
                    PercentComplete      = percentageComplete,
                    ReloadCode           = userSession.UserSessionId,
                    MaxQuestionsCount    = userSession.MaxQuestions,
                    RecordedAnswersCount = userSession.RecordedAnswers.Length,
                    RecordedAnswer       = userSession.RecordedAnswers.SingleOrDefault(r => r?.QuestionId == question.QuestionId)?.SelectedOption,
                    StartedDt            = userSession.StartedDt,
                    IsFilterAssessment   = !assessment.EqualsIgnoreCase("short"),
                    JobCategorySafeUrl   = userSession.FilteredAssessmentState?.JobFamilyNameUrlSafe
                };

                return(httpResponseMessageHelper.Ok(JsonConvert.SerializeObject(response)));
            }
            catch (Exception ex)
            {
                log.LogError(ex, "Fatal exception {message}", ex.ToString());
                return(new HttpResponseMessage {
                    StatusCode = HttpStatusCode.InternalServerError
                });
            }
        }
Ejemplo n.º 11
0
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "assessment")] HttpRequest req,
            ILogger log,
            [Inject] IHttpRequestHelper httpRequestHelper,
            [Inject] IHttpResponseMessageHelper httpResponseMessageHelper,
            [Inject] IUserSessionRepository userSessionRepository,
            [Inject] IQuestionSetRepository questionSetRepository,
            [Inject] IOptions <AppSettings> appSettings)
        {
            try
            {
                var correlationId = httpRequestHelper.GetDssCorrelationId(req);
                if (string.IsNullOrEmpty(correlationId))
                {
                    log.LogWarning("Unable to locate 'DssCorrelationId' in request header");
                    correlationId = Guid.NewGuid().ToString();
                }

                log.LogInformation($"CorrelationId: {correlationId} - Creating a new assessment");

                // Get the assessmentType and questionSetTitle values from the query string
                var queryDictionary = System.Web.HttpUtility.ParseQueryString(req.QueryString.ToString());
                var assessmentType  = queryDictionary.Get("assessmentType");
                if (string.IsNullOrEmpty(assessmentType))
                {
                    log.LogInformation($"CorrelationId: {correlationId} - Missing assessmentType {assessmentType}");
                    return(httpResponseMessageHelper.BadRequest());
                }

                // Get the current question set version for this assesssment type and title (supplied by CMS - configured in appsettings)
                var currentQuestionSetInfo = await questionSetRepository.GetCurrentQuestionSet(assessmentType);

                if (currentQuestionSetInfo == null)
                {
                    log.LogInformation($"CorrelationId: {correlationId} - Unable to load latest question set {assessmentType}");
                    return(httpResponseMessageHelper.NoContent());
                }


                // Create a new user session
                string salt         = appSettings.Value.SessionSalt;
                string sessionId    = SessionIdHelper.GenerateSessionId(salt);
                string partitionKey = PartitionKeyGenerator.UserSession(sessionId);

                var userSession = new UserSession()
                {
                    UserSessionId   = sessionId,
                    Salt            = salt,
                    StartedDt       = DateTime.Now,
                    LanguageCode    = "en",
                    PartitionKey    = partitionKey,
                    AssessmentState = new AssessmentState(currentQuestionSetInfo.QuestionSetVersion, currentQuestionSetInfo.MaxQuestions),
                    AssessmentType  = currentQuestionSetInfo.AssessmentType.ToLower()
                };
                await userSessionRepository.CreateUserSession(userSession);

                log.LogInformation($"CorrelationId: {correlationId} - Finished creating new assessment {userSession.UserSessionId}");

                var result = new FilterSessionResponse()
                {
                    SessionId = userSession.PrimaryKey
                };
                return(httpResponseMessageHelper.Ok(JsonConvert.SerializeObject(result)));
            }
            catch (Exception ex)
            {
                log.LogError(ex, "Fatal exception {message}", ex.ToString());
                return(new HttpResponseMessage {
                    StatusCode = HttpStatusCode.InternalServerError
                });
            }
        }