public async Task <SampleExam.Domain.UserExam> SelectUserExamAsync(int userExamId)
 {
     SampleExam.Domain.UserExam userExam = null;
     using (var dbContext = this.dbContextFactory.CreateDbContext())
     {
         userExam = await dbContext.UserExams.FindAsync(userExamId);
     }
     return(userExam);
 }
        public async Task <Tuple <int, int> > TakeExam(int userExamId, bool fail = false, bool skipSomeQuestions = false)
        {
            var link = "/questionanswers";

            SampleExam.Domain.UserExam userExam = null;
            using (var context = dbContextFactory.CreateDbContext())
            {
                userExam = context.UserExams
                           .Include(e => e.Exam)
                           .ThenInclude(e => e.Questions).ThenInclude(e => e.AnswerOptions)
                           .Where(e => e.Id == userExamId).First();
            }
            var questions        = userExam.Exam.Questions.Shuffle().ToArray();
            int rightAnswerCount = questions.Length * userExam.Exam.PassPercentage / 100;

            rightAnswerCount = fail ? Math.Max(0, rightAnswerCount - 2) : Math.Min(questions.Length, rightAnswerCount + 2);


            if (skipSomeQuestions)
            {
                var takePersentage = userExam.Exam.PassPercentage + ((100 - userExam.Exam.PassPercentage) / 2);
                var take           = questions.Count() * takePersentage / 100;
                take      = Math.Max(take, rightAnswerCount);
                questions = questions.Take(take).ToArray();
            }

            Assert.True(questions.Count() > rightAnswerCount);

            var request = new Request();

            request.UserExamQuestionAnswer = new UserExamQuestionAnswerData()
            {
                UserExamId = userExamId
            };

            //answering questions randomly
            foreach (var question in questions)
            {
                request.UserExamQuestionAnswer.QuestionId      = question.Id;
                request.UserExamQuestionAnswer.AnswerOptionIds = AnswerQuestion(question, AnswerType.Random);
                var questionAnswer = await client.PostQuestionAnswerSuccesfully(link, request);
            }

            //changing answers to fail/succeed
            var random = Utils.NewRandom();

            for (int i = 0; i < questions.Length; i++)
            {
                var question = questions[i];
                request.UserExamQuestionAnswer.QuestionId = question.Id;
                var answerType = i < rightAnswerCount ? AnswerType.Right : AnswerType.Wrong;
                request.UserExamQuestionAnswer.AnswerOptionIds = AnswerQuestion(question, answerType);
                var questionAnswer = await client.PostQuestionAnswerSuccesfully(link, request);
            }
            return(Tuple.Create(rightAnswerCount, questions.Count()));
        }
        public async Task <SampleExam.Domain.UserExam> UpdateUserExamStartDate(int userExamId, int minutesToAdd)
        {
            SampleExam.Domain.UserExam userExam = null;
            using (var dbContext = this.dbContextFactory.CreateDbContext())
            {
                userExam = await dbContext.UserExams.FindAsync(userExamId);

                userExam.StartedtedAt = userExam.StartedtedAt.AddMinutes(minutesToAdd);
                await dbContext.SaveChangesAsync();
            }
            return(userExam);
        }