public async Task <QuestionToAskDto> GetQuestionToAskAsync(int courseInstanceQuestionId) { QuestionToAskDto questionToAskDto = await _context.CourseInstancesQuestion .Where(x => x.Id == courseInstanceQuestionId) .Select(x => new QuestionToAskDto { IdCourseInstanceQuestion = x.Id, IdCourseInstance = x.CourseInstance.Id, IdQuestion = x.Question.Id, Text = x.Question.Text, QuestionType = x.Question.QuestionType, CourseEnded = x.CourseInstance.EndedAt.HasValue, NumCurrentQuestion = x.Number, NumQuestions = x.CourseInstance.Course.NumQuestionsToAsk, Answered = x.AnsweredAt.HasValue, AnswerShown = x.AnswerShown, }).SingleAsync(); //Check access await CheckAccessToCourseInstance(questionToAskDto.IdCourseInstance); //Images questionToAskDto.Images = await _context.RelQuestionImages .Where(x => x.Question.CourseInstancesQuestion.Any(y => y.Id == courseInstanceQuestionId)) .Select(x => new ImageDto { Id = x.Image.Id, IdBinary = x.Image.Binary.Id, Full = x.Image.Full, Height = x.Image.Height, Width = x.Image.Width, }).ToListAsync(); //NumQuestions korrigieren, falls es nicht genügend Fragen hat. //Diese Infos ist nur nötig, wenn Kurs noch nicht beendet ist. if (!questionToAskDto.CourseEnded) { Language language = await _context.CourseInstancesQuestion.Where(x => x.Id == courseInstanceQuestionId) .Select(x => x.CourseInstance.Course.Language).SingleAsync(); int possibleQuestions = await PossibleQuestionsQuery(questionToAskDto.IdCourseInstance, language).CountAsync(); questionToAskDto.NumQuestions = possibleQuestions <= questionToAskDto.NumQuestions - questionToAskDto.NumCurrentQuestion ? possibleQuestions + questionToAskDto.NumCurrentQuestion : questionToAskDto.NumQuestions; //Id nicht leaken, wenn Kurs noch nicht beendet ist. if (!questionToAskDto.AnswerShown) { questionToAskDto.IdQuestion = 0; } } else { questionToAskDto.NumQuestions = await _context.CourseInstancesQuestion.Where(x => x.CourseInstance.Id == questionToAskDto.IdCourseInstance).CountAsync(); } //Optionen questionToAskDto.Options = await _context.CourseInstancesQuestionOption .Where(x => x.CourseInstanceQuestion.Id == courseInstanceQuestionId) .OrderBy(x => x.CourseInstanceQuestion.Id) .Select(x => new QuestionOptionToAskDto { IdCourseInstanceQuestionOption = x.Id, Text = x.QuestionOption.Text, IsChecked = x.Checked, }).ToListAsync(); //Questions already asked questionToAskDto.QuestionSelectors = await _context.CourseInstancesQuestion.Where(x => x.CourseInstance.Id == questionToAskDto.IdCourseInstance) .Select(x => new QuestionSelectorInfoDto() { IdCourseInstanceQuestion = x.Id, Number = x.Number, Correct = x.Correct, AnswerShown = x.AnswerShown, }).OrderBy(x => x.Number).ToListAsync(); if (!questionToAskDto.CourseEnded) { foreach (var q in questionToAskDto.QuestionSelectors.Where(x => !x.AnswerShown)) { q.Correct = null; } } return(questionToAskDto); }
public async Task TestStartTest() { TestingContext testingContext = new TestingContext(); InitTestingContext(testingContext); ICourseService courseService = testingContext.GetService <CourseService>(); testingContext.DependencyMap[typeof(ICourseService)] = courseService; ICourseInstanceService courseInstanceService = testingContext.GetService <CourseInstanceService>(); var courses = await courseService.GetCoursesAsync(0); int courseId = courses.Data.Select(x => x.Id).First(); //Act CourseInstanceDto result = await courseInstanceService.StartCourseAsync(courseId); Assert.True(result.IdCourseInstance > 0); Assert.True(result.IdCourse == courseId); Assert.True(result.IdCourseInstanceQuestion > 0); Assert.True(result.NumQuestionsAlreadyAsked == 0); Assert.True(result.NumQuestionsTotal > 0); CourseInstanceDto result2 = await courseInstanceService.NextQuestion(result.IdCourseInstance); Assert.True(result2.IdCourse == courseId); Assert.True(result2.IdCourseInstanceQuestion > 0); Assert.True(result2.NumQuestionsAlreadyAsked == 1); Assert.True(result2.NumQuestionsTotal > 0); CourseInstanceDto result3 = await courseInstanceService.NextQuestion(result.IdCourseInstance); Assert.True(result3.IdCourse == courseId); Assert.True(result3.IdCourseInstanceQuestion > 0); Assert.True(result3.NumQuestionsAlreadyAsked == 2); Assert.True(result3.NumQuestionsTotal > 0); QuestionToAskDto result4 = await courseInstanceService.GetQuestionToAskAsync(result.IdCourseInstanceQuestion); Assert.Equal(QuestionType.MultipleChoice, result4.QuestionType); QuestionAnswerDto answer = new QuestionAnswerDto(); answer.IdCourseInstanceQuestion = result.IdCourseInstanceQuestion; answer.Answers.Add(false); answer.Answers.Add(true); answer.Answers.Add(false); answer.Answers.Add(true); QuestionDto result5 = await courseInstanceService.AnswerQuestionAndGetSolutionAsync(answer); Assert.True(result5.Explanation != null); Assert.Equal(4, result5.Options.Count); Assert.True(result5.Options[1].IsTrue); Assert.True(result5.Options[3].IsTrue); CourseInstanceDto result6 = await courseInstanceService.AnswerQuestionAndGetNextQuestionAsync(answer); Assert.True(result6.AnsweredCorrectly); Assert.True(result6.Done); Assert.Equal(3, result6.NumQuestionsAlreadyAsked); Assert.Equal(3, result6.NumQuestionsTotal); }