public async Task <Result <int> > AddResult(string userId, TestResultCreateDto testResultCreateDto) { var test = await dataStorage.Tests.GetAsync(testResultCreateDto.TestId); if (userId is null) { return(Result.Fail <int>(-42)); } if (test is null) { return(Result.Fail <int>(-1)); } var answers = (await dataStorage.Answers.GetCorrectAnswersForTest(testResultCreateDto.TestId)).ToList(); var correctAnswersNumber = answers.Join(testResultCreateDto.Answers, correctAnswer => correctAnswer.QuestionId, userAnswer => userAnswer.Key, (correctAnswer, userAnswer) => correctAnswer.Id == userAnswer.Value) .Count(result => result); double usersTestResult = (correctAnswersNumber / (double)answers.Count) * 100; var testResult = new TestResult { TestId = testResultCreateDto.TestId, Result = usersTestResult, UserId = userId, AttemptDate = DateTime.Today }; dataStorage.TestResults.Add(testResult); await dataStorage.SaveChangesAsync(); return(Result.Ok(testResult.Id)); }
public async Task AddResultTest() { unitOfWorksMock .Setup(u => u.Tests.GetAsync(It.IsAny <int>())) .ReturnsAsync((int id) => new Test { Id = id, Questions = new List <Question>() }); unitOfWorksMock .Setup(u => u.Answers.GetCorrectAnswersForTest(It.IsAny <int>())) .ReturnsAsync((int id) => new [] { new Answer { Id = 1, QuestionId = 1, IsCorrect = true }, new Answer { Id = 5, QuestionId = 2, IsCorrect = true } }); var testResultCreateDto = new TestResultCreateDto { TestId = 1, UserId = "user_id", Answers = new [] { new KeyValuePair <int, int>(1, 1), new KeyValuePair <int, int>(2, 5) } }; double expectedResult = 100; unitOfWorksMock .Setup(u => u.TestResults.Add(It.IsAny <TestResult>())) .Callback((TestResult testResult) => Assert.AreEqual(expectedResult, testResult.Result, 0.001)); var result = await testResultService.AddResult("user_id", testResultCreateDto); Assert.IsTrue(result.Success); testResultCreateDto.Answers = new[] { new KeyValuePair <int, int>(1, 1), new KeyValuePair <int, int>(2, 2) }; expectedResult = 50; result = await testResultService.AddResult("user_id", testResultCreateDto); Assert.IsTrue(result.Success); testResultCreateDto.Answers = new KeyValuePair <int, int> [0]; expectedResult = 0; result = await testResultService.AddResult("user_id", testResultCreateDto); Assert.IsTrue(result.Success); }