public async Task Test_PostQuizFeedback_InvalidQuizFeedback(long characterId, long quizId)
        {
            var context    = GetQuizTestsDatabaseContext();
            var controller = new QuizController(new QuizService(new QuizRepository(context), new CharacterRepository(context),
                                                                new CharacterService(new CharacterRepository(context), new ItemRepository(context), Mapper), Mapper));

            var quizFbDTO = new SaveQuizFb_QuizFeedbackDTO
            {
                CharacterId = characterId,
                QuizId      = quizId
            };

            var questionAnswer1DTO = new SaveQuizFb_QuestionAnswerDTO
            {
                QuestionId      = 2,
                ChosenAnswerIds = new List <long> {
                    6
                }
            };

            var questionAnswer2DTO = new SaveQuizFb_QuestionAnswerDTO
            {
                QuestionId      = 3,
                ChosenAnswerIds = new List <long>()
            };

            quizFbDTO.QuestionAnswers.Add(questionAnswer1DTO);
            quizFbDTO.QuestionAnswers.Add(questionAnswer2DTO);

            var actionResult = await controller.PostQuizFeedback(quizFbDTO);

            Assert.IsInstanceOf <BadRequestObjectResult>(actionResult);
        }
        public async Task Test_PostQuizFeedback_SameQuizTwice(long characterId, long quizId)
        {
            var context    = GetQuizTestsDatabaseContext();
            var controller = new QuizController(new QuizService(new QuizRepository(context), new CharacterRepository(context),
                                                                new CharacterService(new CharacterRepository(context), new ItemRepository(context), Mapper), Mapper));

            var quizFbDTO = new SaveQuizFb_QuizFeedbackDTO
            {
                CharacterId = characterId,
                QuizId      = quizId
            };

            var questionAnswer1DTO = new SaveQuizFb_QuestionAnswerDTO
            {
                QuestionId      = 2,
                ChosenAnswerIds = new List <long> {
                    6
                }
            };

            var questionAnswer2DTO = new SaveQuizFb_QuestionAnswerDTO
            {
                QuestionId      = 3,
                ChosenAnswerIds = new List <long> {
                    7, 8
                }
            };

            quizFbDTO.QuestionAnswers.Add(questionAnswer1DTO);
            quizFbDTO.QuestionAnswers.Add(questionAnswer2DTO);

            var actionResult = await controller.PostQuizFeedback(quizFbDTO);

            Assert.IsInstanceOf <OkObjectResult>(actionResult);

            actionResult = await controller.PostQuizFeedback(quizFbDTO);

            Assert.IsInstanceOf <OkObjectResult>(actionResult);

            var okResult = actionResult as OkObjectResult;
            var response = okResult.Value as SaveQuizFeedbackResponseDTO;

            Assert.NotNull(response);
            Assert.AreEqual(SaveQuizFeedbackResponseDTO.RequestResult.Success.ToString(), response.Result);

            var quizFbResult = response.QuizFeedback;

            Assert.AreEqual(0, quizFbResult.GoldGained);
            Assert.AreEqual(0, quizFbResult.ExperienceGained);
            Assert.AreEqual(0, quizFbResult.LevelGained);
        }
Beispiel #3
0
        public async Task <IActionResult> PostQuizFeedback(SaveQuizFb_QuizFeedbackDTO quizFbReceived)
        {
            var result = await _quizService.SaveQuizFeedbackAsync(quizFbReceived);

            switch (result._result)
            {
            case SaveQuizFeedbackResponseDTO.RequestResult.Success: return(Ok(result));

            case SaveQuizFeedbackResponseDTO.RequestResult.CharacterNotFound: return(NotFound(result));

            case SaveQuizFeedbackResponseDTO.RequestResult.QuizNotFound: return(NotFound(result));

            case SaveQuizFeedbackResponseDTO.RequestResult.QuestionNotFound: return(NotFound(result));

            case SaveQuizFeedbackResponseDTO.RequestResult.AnswerNotFound: return(NotFound(result));

            default: return(BadRequest(result));
            }
        }
Beispiel #4
0
        public async Task <SaveQuizFeedbackResponseDTO> SaveQuizFeedbackAsync(SaveQuizFb_QuizFeedbackDTO quizFbReceived)
        {
            float rightAnswerNumber = 0;

            var result = new SaveQuizFeedbackResponseDTO();

            QuizFeedback quizFb = new QuizFeedback()
            {
                Character = new Character()
                {
                    Id = quizFbReceived.CharacterId
                },
                Quiz = await _quizRepo.GetQuizAsync(quizFbReceived.QuizId),
            };

            if (quizFb.Quiz == null)
            {
                result._result = SaveQuizFeedbackResponseDTO.RequestResult.QuizNotFound;
                return(result);
            }

            if (quizFb.Quiz.Questions.Count == 0)
            {
                result._result = SaveQuizFeedbackResponseDTO.RequestResult.QuizWithoutQuestions;
                return(result);
            }

            if (quizFb.Quiz.Questions.Count != quizFbReceived.QuestionAnswers.Count ||
                quizFbReceived.QuestionAnswers.GroupBy(qa => qa.QuestionId).Any(q => q.Count() > 1))
            {
                result._result = SaveQuizFeedbackResponseDTO.RequestResult.InvalidQuizFeedback;
                return(result);
            }

            foreach (var qtAnswerReceived in quizFbReceived.QuestionAnswers)
            {
                var qtAnswer = new QuestionAnswer()
                {
                    Question = quizFb.Quiz.Questions.Where(q => q.Id == qtAnswerReceived.QuestionId).FirstOrDefault()
                };

                if (qtAnswer.Question == null)
                {
                    result._result = SaveQuizFeedbackResponseDTO.RequestResult.QuestionNotFound;
                    return(result);
                }

                if (qtAnswerReceived.ChosenAnswerIds.Count == 0 ||
                    (qtAnswerReceived.ChosenAnswerIds.Count > 1 &&
                     qtAnswer.Question.Answers.Where(a => a.IsCorrect).Count() == 1))
                {
                    result._result = SaveQuizFeedbackResponseDTO.RequestResult.InvalidQuizFeedback;
                    return(result);
                }

                foreach (var answerID in qtAnswerReceived.ChosenAnswerIds)
                {
                    var chonsenAnswer = qtAnswer.Question.Answers.Where(a => a.Id == answerID).FirstOrDefault();

                    if (chonsenAnswer == null)
                    {
                        result._result = SaveQuizFeedbackResponseDTO.RequestResult.AnswerNotFound;
                        return(result);
                    }

                    qtAnswer.ChosenAnswers.Add(chonsenAnswer);
                }

                quizFb.QuestionAnswers.Add(qtAnswer);

                var correctAnswerIds = qtAnswer.Question.Answers.Where(a => a.IsCorrect).Select(a => a.Id).ToHashSet();
                var AnswerIds        = qtAnswerReceived.ChosenAnswerIds.ToHashSet();

                int hits   = Enumerable.Intersect(AnswerIds, correctAnswerIds).Count();
                int misses = AnswerIds.Except(correctAnswerIds).Count();

                if (misses <= hits)
                {
                    rightAnswerNumber += (float)(hits - misses) / correctAnswerIds.Count;
                }
            }

            quizFb.PercentageOfCorrectChosenAnswers = (float)Math.Round(rightAnswerNumber * 100 / quizFb.Quiz.Questions.Count, 2);

            //Save awnsers
            result._result = await _characterService.SaveQuizfeedback(quizFb);

            if (result._result != SaveQuizFeedbackResponseDTO.RequestResult.Success)
            {
                return(result);
            }

            //fill with correct answers
            foreach (var qtAnswer in quizFb.QuestionAnswers)
            {
                qtAnswer.ChosenAnswers = qtAnswer.Question.Answers.Where(c => c.IsCorrect).ToList();
            }

            //Return correct answers
            result.QuizFeedback = _mapper.Map <QuizFeedbackReadDTO>(quizFb);
            return(result);
        }
        public async Task Test_PostQuizFeedback_Success(long characterId, long quizId)
        {
            var context    = GetQuizTestsDatabaseContext();
            var controller = new QuizController(new QuizService(new QuizRepository(context), new CharacterRepository(context),
                                                                new CharacterService(new CharacterRepository(context), new ItemRepository(context), Mapper), Mapper));

            var quizFbDTO = new SaveQuizFb_QuizFeedbackDTO
            {
                CharacterId = characterId,
                QuizId      = quizId
            };

            var questionAnswer1DTO = new SaveQuizFb_QuestionAnswerDTO
            {
                QuestionId      = 2,
                ChosenAnswerIds = new List <long> {
                    6
                }
            };

            var questionAnswer2DTO = new SaveQuizFb_QuestionAnswerDTO
            {
                QuestionId      = 3,
                ChosenAnswerIds = new List <long> {
                    7, 8
                }
            };

            quizFbDTO.QuestionAnswers.Add(questionAnswer1DTO);
            quizFbDTO.QuestionAnswers.Add(questionAnswer2DTO);

            var quizFbCountBefore = await context.QuizFeedbacks.CountAsync();

            var questionAnswerCountBefore = await context.QuestionAnswers.CountAsync();

            var charBefore = await context.Characters.FirstOrDefaultAsync(c => c.Id == characterId);

            var charGoldBefore  = charBefore.Gold;
            var charXPBefore    = charBefore.TotalXP;
            var charLevelBefore = charBefore.Level;

            var actionResult = await controller.PostQuizFeedback(quizFbDTO);

            Assert.IsInstanceOf <OkObjectResult>(actionResult);

            var quizFbCountAfter = await context.QuizFeedbacks.CountAsync();

            var questionAnswerCountAfter = await context.QuestionAnswers.CountAsync();

            var charAfter = await context.Characters.FirstOrDefaultAsync(c => c.Id == characterId);

            var charGoldAfter  = charAfter.Gold;
            var charXPAfter    = charAfter.TotalXP;
            var charLevelAfter = charAfter.Level;

            var okResult = actionResult as OkObjectResult;
            var response = okResult.Value as SaveQuizFeedbackResponseDTO;

            Assert.NotNull(response);
            Assert.AreEqual(SaveQuizFeedbackResponseDTO.RequestResult.Success.ToString(), response.Result);

            var quizFbResult = response.QuizFeedback;

            Assert.AreEqual(quizFbCountBefore + 1, quizFbCountAfter);
            Assert.AreEqual(questionAnswerCountBefore + 2, questionAnswerCountAfter);
            Assert.AreEqual(charGoldAfter - charGoldBefore, quizFbResult.GoldGained);
            Assert.AreEqual(charXPAfter - charXPBefore, quizFbResult.ExperienceGained);
            Assert.AreEqual(100, quizFbResult.GoldGained);
            Assert.AreEqual(100, quizFbResult.ExperienceGained);
            Assert.AreEqual(charLevelAfter - charLevelBefore, quizFbResult.LevelGained);
        }