public async Task <PostAnswerResponse> PostAnswer(string sessionId, PostAnswerRequest postAnswerRequest, Guid correlationId)
        {
            string url  = $"{AppSettings.SessionApiRoot}/assessment/{sessionId}";
            var    json = await HttpService.PostData(url, postAnswerRequest, correlationId);

            return(JsonConvert.DeserializeObject <PostAnswerResponse>(json));
        }
コード例 #2
0
        public async Task PostAnswerHttpTrigger_WithValidAnswerValue_ShouldHaveIsSuccessInModel()
        {
            _httpResponseMessageHelper = new HttpResponseMessageHelper();
            var postAnswerRequest = new PostAnswerRequest()
            {
                QuestionId     = "1",
                SelectedOption = "Agree"
            };

            _questionRepository.GetQuestion("1").Returns(Task.FromResult(new Question {
                QuestionId = "1"
            }));

            _userSessionRepository.GetUserSession("session1").Returns(Task.FromResult(new UserSession
            {
                AssessmentState = new AssessmentState("QS-1", 5)
            }));

            var json = Newtonsoft.Json.JsonConvert.SerializeObject(postAnswerRequest);

            _request.Body = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

            var result = await RunFunction("session1");

            var content = await result.Content.ReadAsAsync <PostAnswerResponse>();

            Assert.IsType <HttpResponseMessage>(result);
            Assert.Equal(HttpStatusCode.OK, result.StatusCode);
            Assert.True(content.IsSuccess);
        }
コード例 #3
0
        public async Task PostAnswerHttpTrigger_UnableToFindQuestion_ShouldReturnNoContent()
        {
            _httpResponseMessageHelper = new HttpResponseMessageHelper();
            var postAnswerRequest = new PostAnswerRequest()
            {
                QuestionId     = "1",
                SelectedOption = "Agree"
            };

            _questionRepository.GetQuestion("1").Returns(Task.FromResult <Question>(null));

            _userSessionRepository.GetUserSession("session1").Returns(Task.FromResult(new UserSession
            {
                AssessmentState = new AssessmentState("QS-1", 5)
            }));

            var json = Newtonsoft.Json.JsonConvert.SerializeObject(postAnswerRequest);

            _request.Body = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

            var result = await RunFunction("session1");

            Assert.IsType <HttpResponseMessage>(result);
            Assert.Equal(HttpStatusCode.NoContent, result.StatusCode);
        }
コード例 #4
0
        public async Task PostAnswerHttpTrigger_WithValidAnswerValue_ShouldReturnNextQuestionEvenIfComplete()
        {
            _httpResponseMessageHelper = new HttpResponseMessageHelper();
            var postAnswerRequest = new PostAnswerRequest()
            {
                QuestionId     = "short-1-1",
                SelectedOption = "Agree"
            };
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(postAnswerRequest);

            _request.Body = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

            _questionRepository.GetQuestion("short-1-1").Returns(Task.FromResult(new Question
            {
                QuestionId       = "short-1-1",
                IsFilterQuestion = false,
                Order            = 1,
                Texts            = new []
                {
                    new QuestionText {
                        LanguageCode = "en", Text = "q1"
                    },
                }
            }));

            var session = new UserSession
            {
                AssessmentType  = "short",
                AssessmentState = new AssessmentState("QS-1", 2)
                {
                    RecordedAnswers = new[]
                    {
                        new Answer
                        {
                            QuestionId     = "1", QuestionNumber = 1, QuestionSetVersion = "QS-1",
                            SelectedOption = AnswerOption.Agree
                        },
                    }
                }
            };


            _userSessionRepository.GetUserSession("session1").Returns(Task.FromResult(session));

            var result = await RunFunction("session1");

            var content = await result.Content.ReadAsAsync <PostAnswerResponse>();

            Assert.IsType <HttpResponseMessage>(result);
            Assert.Equal(HttpStatusCode.OK, result.StatusCode);
            Assert.True(content.IsSuccess);
            Assert.Equal(2, content.NextQuestionNumber);
        }
コード例 #5
0
        public async Task <IActionResult> AnswerQuestion(string assessment, string questionNumber)
        {
            var    correlationId        = Guid.NewGuid();
            var    isRealQuestionNumber = int.TryParse(questionNumber, out int questionNumberValue);
            string sessionId            = null;

            try
            {
                sessionId = await TryGetSessionId(Request);

                if (sessionId == null || sessionId != HttpUtility.UrlEncode(sessionId))
                {
                    _log.LogWarning($"q/{assessment}/{questionNumber} called with no session id.");
                    return(BadRequest());
                }
                if (!isRealQuestionNumber)
                {
                    _log.LogWarning($"q/{assessment}/{questionNumber} called with invalid questionNumber.");
                    return(BadRequest());
                }

                var postAnswerRequest = new PostAnswerRequest()
                {
                    QuestionId     = GetFormValue("questionId"),
                    SelectedOption = GetFormValue("selected_answer")
                };

                if (postAnswerRequest.SelectedOption == null)
                {
                    return(await NextQuestion(sessionId, assessment, questionNumberValue, true));
                }

                var postAnswerResponse = await _apiServices.PostAnswer(sessionId, postAnswerRequest, correlationId);

                if (postAnswerResponse.IsComplete)
                {
                    var finishEndpoint = postAnswerResponse.IsFilterAssessment ? $"/finish/{postAnswerResponse.JobCategorySafeUrl}" : "/finish";
                    AppendCookie(sessionId);
                    return(Redirect(finishEndpoint));
                }
                var url = $"/q/{assessment}/{postAnswerResponse.NextQuestionNumber.ToQuestionPageNumber()}";
                return(Redirect(url));
            }
            catch (Exception ex)
            {
                _log.LogError(ex, $"Correlation Id: {correlationId} - An error occurred in session {sessionId} answering question: {questionNumber} in assessment {assessment}.");
                return(RedirectToAction("Error500", "Error"));
            }
        }
        public async Task <PostAnswerResponse> AnswerQuestion(string assessmentType, int realQuestionNumber, int questionNumberCounter, string answer)
        {
            var sessionId = await sessionService.GetSessionId().ConfigureAwait(false);

            var questionSetResponse = await GetQuestion(assessmentType, questionNumberCounter).ConfigureAwait(false);

            var questionIdFull = $"{questionSetResponse.QuestionSetVersion}-{realQuestionNumber}";
            var post           = new PostAnswerRequest()
            {
                QuestionId = questionIdFull, SelectedOption = answer
            };
            var answerQuestionResponse = await assessmentApiService.AnswerQuestion(sessionId, post).ConfigureAwait(false);

            return(answerQuestionResponse);
        }
コード例 #7
0
        public async Task <PostAnswerResponse> AnswerQuestion(string sessionId, PostAnswerRequest postAnswerRequest)
        {
            var url = $"{httpClient.BaseAddress}/assessment/{sessionId}";

            using (var sc = new StringContent(serialiser.Serialise(postAnswerRequest), Encoding.UTF8, MediaTypeNames.Application.Json))
            {
                var httpResponseMessage = await httpClient.PostAsync(url, sc).ConfigureAwait(false);

                httpResponseMessage.EnsureSuccessStatusCode();
                var contentResponse = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);

                var response = serialiser.Deserialise <PostAnswerResponse>(contentResponse);
                return(response);
            }
        }
コード例 #8
0
        public async Task PostAnswerHttpTrigger_Returns_500OnException()
        {
            _httpResponseMessageHelper = new HttpResponseMessageHelper();
            var postAnswerRequest = new PostAnswerRequest()
            {
                QuestionId     = "1",
                SelectedOption = "Agree"
            };

            _userSessionRepository.GetUserSession("session1").Throws(new Exception());
            var result = await RunFunction("session1");

            Assert.IsType <HttpResponseMessage>(result);
            Assert.Equal(HttpStatusCode.InternalServerError, result.StatusCode);
        }
コード例 #9
0
        public async Task AnswerQuestionReturnsValidDataForSuccess()
        {
            var sessionId         = "session1";
            var questionNumber    = 2;
            var postAnswerRequest = new PostAnswerRequest()
            {
                QuestionId = questionNumber.ToString(), SelectedOption = "2"
            };

            httpMessageHandler.When($"{httpClient.BaseAddress}/assessment/{sessionId}")
            .Respond("application/json", "{'nextQuestionNumber':'2'}");

            var answerResponse = await assessmentApiService.AnswerQuestion(sessionId, postAnswerRequest);

            Assert.Equal(2, answerResponse.NextQuestionNumber);
        }
コード例 #10
0
        public async Task PostAnswerHttpTrigger_WithInvalidSessionId_ShouldReturnNoContent()
        {
            _httpResponseMessageHelper = new HttpResponseMessageHelper();
            var postAnswerRequest = new PostAnswerRequest()
            {
                QuestionId     = "1",
                SelectedOption = "Agree"
            };
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(postAnswerRequest);

            _request.Body = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

            var result = await RunFunction("invalid-session-id");

            Assert.IsType <HttpResponseMessage>(result);
            Assert.Equal(HttpStatusCode.NoContent, result.StatusCode);
        }
コード例 #11
0
        public async Task PostAnswerHttpTrigger_WhenAssessmentComplete_ShouldCallAssementCalculationService()
        {
            _httpResponseMessageHelper = new HttpResponseMessageHelper();
            var postAnswerRequest = new PostAnswerRequest()
            {
                QuestionId     = "short-1-1",
                SelectedOption = "Agree"
            };
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(postAnswerRequest);

            _request.Body = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

            _questionRepository.GetQuestion("short-1-1").Returns(Task.FromResult(new Question
            {
                QuestionId       = "short-1-1",
                IsFilterQuestion = false,
                Order            = 1,
                Texts            = new []
                {
                    new QuestionText {
                        LanguageCode = "en", Text = "q1"
                    },
                }
            }));

            var session = new UserSession
            {
                AssessmentType  = "short",
                AssessmentState = new AssessmentState("QS-1", 1)
                {
                    CurrentQuestion = 1
                }
            };

            _userSessionRepository.GetUserSession("session1").Returns(Task.FromResult(session));

            var result = await RunFunction("session1");

            await _assessmentCalculationService.ReceivedWithAnyArgs(1)
            .CalculateAssessment(Arg.Any <UserSession>(), Arg.Any <ILogger>());
        }
        public async Task AnswerQuestionReturnsValidResponse()
        {
            var sessionId        = "session1";
            var assessmentType   = "at1";
            var questionResponse = new GetQuestionResponse()
            {
                QuestionNumber = 1, QuestionSetVersion = $"{assessmentType}-v1"
            };
            var answerRequest = new PostAnswerRequest()
            {
                QuestionId = $"{assessmentType}-v1-1", SelectedOption = "2"
            };
            var answerResponse = A.Fake <PostAnswerResponse>();

            A.CallTo(() => sessionService.GetSessionId()).Returns(sessionId);
            A.CallTo(() => assessmentApiService.GetQuestion(sessionId, assessmentType, questionResponse.QuestionNumber)).Returns(questionResponse);
            A.CallTo(() => assessmentApiService.AnswerQuestion(sessionId, answerRequest)).Returns(answerResponse);

            var response = await assessmentService.AnswerQuestion(assessmentType, questionResponse.QuestionNumber, questionResponse.QuestionNumber, answerRequest.SelectedOption);

            Assert.Equal(answerResponse.IsSuccess, response.IsSuccess);
        }
        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);
        }
コード例 #14
0
        public async Task PostAnswerHttpTrigger_WhenFilterAssessmentComplete_ShouldCallAssementCalculationService()
        {
            _httpResponseMessageHelper = new HttpResponseMessageHelper();
            var postAnswerRequest = new PostAnswerRequest()
            {
                QuestionId     = "AC-1",
                SelectedOption = "Agree"
            };
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(postAnswerRequest);

            _request.Body = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json));

            _questionRepository.GetQuestion("AC-1").Returns(Task.FromResult(new Question
            {
                QuestionId       = "AC-1",
                IsFilterQuestion = true,
                Order            = 1,
                TraitCode        = "A",
                Texts            = new []
                {
                    new QuestionText {
                        LanguageCode = "en", Text = "q1"
                    },
                }
            }));

            var session = new UserSession
            {
                AssessmentType  = "filtered",
                AssessmentState = new AssessmentState("QS-1", 1)
                {
                    RecordedAnswers = new []
                    {
                        new Answer {
                            QuestionNumber = 1, SelectedOption = AnswerOption.Agree, TraitCode = "A"
                        }
                    },
                    CurrentQuestion = 1
                },
                FilteredAssessmentState = new FilteredAssessmentState
                {
                    CurrentFilterAssessmentCode = "AC",
                    JobCategoryStates           = new List <JobCategoryState>
                    {
                        new JobCategoryState("AC", "Animal Care", "QS-1", new []
                        {
                            new JobCategorySkill {
                                QuestionId = "AC-1", QuestionNumber = 1, Skill = "A"
                            },
                        })
                    }
                }
            };

            _userSessionRepository.GetUserSession("session1").Returns(Task.FromResult(session));

            var result = await RunFunction("session1");

            await _filterAssessmentCalculationService.ReceivedWithAnyArgs(1)
            .CalculateAssessment(Arg.Any <UserSession>(), Arg.Any <ILogger>());
        }