Exemple #1
0
        public async Task WhenAnswerIsProvidedButAnswerIsNotRegisteredReturnsView()
        {
            var assessmentType     = "short";
            var jobCategoryName    = "sales";
            var questionNumberReal = 1;
            var answer             = "answer";
            var answerResponse     = new PostAnswerResponse()
            {
                IsComplete = false, IsSuccess = false
            };
            var viewModel = new FilterQuestionPostRequestViewModel()
            {
                AssessmentType     = assessmentType,
                JobCategoryName    = jobCategoryName,
                Answer             = answer,
                QuestionNumberReal = questionNumberReal,
            };

            A.CallTo(() => sessionService.HasValidSession()).Returns(true);
            A.CallTo(() => assessmentService.AnswerQuestion(assessmentType, questionNumberReal, questionNumberReal, answer)).Returns(answerResponse);

            var actionResponse = await controller.Index(viewModel).ConfigureAwait(false);

            Assert.IsType <ViewResult>(actionResponse);
        }
Exemple #2
0
        public async Task WhenAnsweredRedirectsToCorrectNextView(bool isComplete, string expectedRedirect)
        {
            var assessmentType        = "short";
            var jobCategoryName       = "sales";
            var questionNumberReal    = 1;
            var questionNumberCounter = 1;
            var answer         = "answer";
            var answerResponse = new PostAnswerResponse()
            {
                IsComplete = isComplete, IsSuccess = true
            };
            var viewModel = new FilterQuestionPostRequestViewModel()
            {
                AssessmentType        = assessmentType,
                JobCategoryName       = jobCategoryName,
                Answer                = answer,
                QuestionNumberReal    = questionNumberReal,
                QuestionNumberCounter = questionNumberCounter,
            };

            A.CallTo(() => sessionService.HasValidSession()).Returns(true);

            A.CallTo(() => assessmentService.AnswerQuestion(jobCategoryName, questionNumberReal, questionNumberReal, answer)).Returns(answerResponse);

            var actionResponse = await controller.Index(viewModel).ConfigureAwait(false);

            Assert.IsType <RedirectResult>(actionResponse);
            var redirectResult = actionResponse as RedirectResult;

            Assert.Equal($"~/{RouteName.Prefix}/{assessmentType}/filterquestions/{jobCategoryName}/{expectedRedirect}", redirectResult.Url);
        }
        public async Task IfAnswerIsValidMovesToNextQuestion()
        {
            var answerRequest = new QuestionPostRequestViewModel()
            {
                QuestionNumber = 3, AssessmentType = "short", Answer = "answer1"
            };
            var currentQuestion = new GetQuestionResponse()
            {
                MaxQuestionsCount = 10, CurrentQuestionNumber = 3, NextQuestionNumber = 4
            };
            var answerResponse = new PostAnswerResponse()
            {
                IsSuccess = true, NextQuestionNumber = 4
            };

            A.CallTo(() => Session.HasValidSession()).Returns(true);
            A.CallTo(() => ApiService.GetQuestion(answerRequest.AssessmentType, answerRequest.QuestionNumber)).Returns(currentQuestion);
            A.CallTo(() => ApiService.AnswerQuestion(answerRequest.AssessmentType, answerRequest.QuestionNumber, answerRequest.QuestionNumber, answerRequest.Answer)).Returns(answerResponse);

            var actionResponse = await AssessmentController.Index(answerRequest).ConfigureAwait(false);

            Assert.IsType <RedirectResult>(actionResponse);
            var redirectResult = actionResponse as RedirectResult;

            Assert.Equal($"~/{RouteName.Prefix}/assessment/short/4", redirectResult.Url);
        }
        public async Task WhenAllAnswersAreProvidedAssessmentIsCompleted()
        {
            var answerRequest = new QuestionPostRequestViewModel()
            {
                QuestionNumber = 3, AssessmentType = "name1", Answer = "answer1"
            };
            var currentQuestion = new GetQuestionResponse();
            var answerResponse  = new PostAnswerResponse()
            {
                IsSuccess = true, IsComplete = true
            };

            A.CallTo(() => Session.HasValidSession()).Returns(true);
            A.CallTo(() => ApiService.GetQuestion(answerRequest.AssessmentType, answerRequest.QuestionNumber)).Returns(currentQuestion);
            A.CallTo(() => ApiService.AnswerQuestion(answerRequest.AssessmentType, answerRequest.QuestionNumber, answerRequest.QuestionNumber, answerRequest.Answer)).Returns(answerResponse);

            var actionResponse = await AssessmentController.Index(answerRequest).ConfigureAwait(false);

            Assert.IsType <RedirectResult>(actionResponse);
            var redirectResult = actionResponse as RedirectResult;

            Assert.Equal($"~/{RouteName.Prefix}/assessment/complete", redirectResult.Url);
        }
        public async Task PostAnswer_ShouldCall_CorrectUrl()
        {
            var guid      = Guid.NewGuid();
            var sessionId = "Abc123";
            var url       = $"{ApiRoot}/assessment/{sessionId}";

            var request = new PostAnswerRequest
            {
                SelectedOption = "3",
                QuestionId     = "QS-1-1"
            };

            var response = new PostAnswerResponse()
            {
                NextQuestionNumber = 4
            };

            _httpService.PostData(url, request, guid).Returns(Task.FromResult(JsonConvert.SerializeObject(response)));

            var result = await _api.PostAnswer(sessionId, request, guid);

            Assert.Equal(response.NextQuestionNumber, result.NextQuestionNumber);
        }
Exemple #6
0
        public async Task <JsonResult> Post([FromForm] string data, [FromForm] string signature)
        {
            try
            {
                //string answerJson;
                var decodedData = CryptoUtils.Base64Decode(data);
                var answerToApi = JsonConvert.DeserializeObject <PostAnswer>(decodedData);

                if (!answerToApi.IsModelValid())
                {
                    throw new ErrorWithDataException("Some of the data parameters are invalid. Check the documentation.",
                                                     Models.Api.StatusCode.WrongData);
                }

                var user = _applicationContext.User
                           .Include(u => u.UserProjects)
                           .ThenInclude(up => up.Project)
                           .FirstOrDefault(u => u.UserName == answerToApi.Login);

                if (user == null)// || user.PasswordHash != questionToApi.PasswordHash)
                {
                    throw new ErrorWithDataException("User with such email doesn't exist.",
                                                     Models.Api.StatusCode.WrongLoginPasswordCredentials);
                }

                var userProject = user.UserProjects.FirstOrDefault(up => up.Project.Id == answerToApi.ProjectId);

                if (userProject == null)
                {
                    throw new ErrorWithDataException("Provided user doesn't consist in the project with such ID.",
                                                     Models.Api.StatusCode.WrongProjectId);
                }

                if (!Utils.ValidateSignature(data, signature, userProject.Project.PrivateKey))
                {
                    throw new ErrorWithDataException("Signature is not valid. Check your PrivateKey and MD5 alghorithm.",
                                                     Models.Api.StatusCode.WrongSignature);
                }

                var question = _applicationContext.Questions
                               .Include(q => q.Answer)
                               .FirstOrDefault(q => q.Id == answerToApi.QuestionId);

                if (question == null)
                {
                    throw new ErrorWithDataException("Provided question ID doesn't consist in the project with such ID.",
                                                     Models.Api.StatusCode.WrongQuestionId);
                }

                var answer = new Answer
                {
                    Date      = DateTime.Now,
                    Text      = answerToApi.AnswerText,
                    ProjectId = answerToApi.ProjectId,
                    User      = user
                };

                question.Answer          = answer;
                question.AnsweredByHuman = true;

                _applicationContext.Answers.Add(answer);
                await _applicationContext.SaveChangesAsync();

                // Запускаем обработку вопроса без ожидания результата
                _processorService.AnswerOnSimilarQuestionsAsync(question.Id);

                var postAnswerResponse = new PostAnswerResponse
                {
                    QuestionId    = question.Id,
                    StatusCode    = Models.Api.StatusCode.Success,
                    StatusMessage = $"Answer on question with ID {question.Id} was successfully placed."
                };

                return(Json(postAnswerResponse));
            }
            catch (ErrorWithDataException ex)
            {
                var answer = new PostQuestionResponse()
                {
                    StatusCode    = ex.StatusCode(),
                    StatusMessage = ex.Message
                };
                //var answerJson = JsonConvert.SerializeObject(answer);
                return(Json(answer));
            }
            catch (Exception ex)
            {
                var answer = new PostQuestionResponse()
                {
                    StatusCode    = Models.Api.StatusCode.Error,
                    StatusMessage = ex.Message
                };
                //var answerJson = JsonConvert.SerializeObject(answer);
                return(Json(answer));
            }
        }
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "assessment/{sessionId}")] HttpRequest req,
            string sessionId,
            ILogger log,
            [Inject] IHttpRequestHelper httpRequestHelper,
            [Inject] IHttpResponseMessageHelper httpResponseMessageHelper,
            [Inject] IUserSessionRepository userSessionRepository,
            [Inject] IQuestionRepository questionRepository,
            [Inject] IAssessmentCalculationService resultsService,
            [Inject] IFilterAssessmentCalculationService filterAssessmentCalculationService)
        {
            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());
                }

                PostAnswerRequest postAnswerRequest;
                using (var streamReader = new StreamReader(req.Body))
                {
                    var body = streamReader.ReadToEnd();
                    postAnswerRequest = JsonConvert.DeserializeObject <PostAnswerRequest>(body);
                }

                AnswerOption answerValue;
                if (Enum.TryParse(postAnswerRequest.SelectedOption, out answerValue) == false)
                {
                    log.LogInformation(
                        $"CorrelationId: {correlationGuid} - Answer supplied is invalid {postAnswerRequest.SelectedOption}");
                    return(httpResponseMessageHelper.BadRequest());
                }

                var userSession = await userSessionRepository.GetUserSession(sessionId);

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

                var question = await questionRepository.GetQuestion(postAnswerRequest.QuestionId);

                if (question == null)
                {
                    log.LogInformation(
                        $"CorrelationId: {correlationGuid} - Question Id does not exist {postAnswerRequest.QuestionId}");
                    return(httpResponseMessageHelper.NoContent());
                }

                userSession.AddAnswer(answerValue, question);

                await TryEvaluateSession(log, resultsService, filterAssessmentCalculationService, userSession);

                var displayFinish = question.IsFilterQuestion
                    ? userSession.FilteredAssessmentState.IsComplete
                    : userSession.AssessmentState.IsComplete;

                if (!question.IsFilterQuestion)
                {
                    userSession.AssessmentState.CurrentQuestion = question.Order;
                }

                var result = new PostAnswerResponse()
                {
                    IsSuccess          = true,
                    IsComplete         = displayFinish,
                    IsFilterAssessment = question.IsFilterQuestion,
                    JobCategorySafeUrl = question.IsFilterQuestion ? userSession.FilteredAssessmentState.JobFamilyNameUrlSafe : null,
                    NextQuestionNumber = question.IsFilterQuestion ? userSession.FilteredAssessmentState.MoveToNextQuestion() : userSession.AssessmentState.MoveToNextQuestion()
                };

                await userSessionRepository.UpdateUserSession(userSession);

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