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); }
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); }
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 }); } }