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