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