Example #1
0
        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);
        }