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