public AssignmentStatisticsDto ToAssignmentStatisticsDto(
            AssignmentWithLastResultsOfMultipleUsers assignmentWithLastResultsOfMultipleUsers)
        {
            var passedTestsPerUserQuery = from testWithLastResultOfMultipleUsers in assignmentWithLastResultsOfMultipleUsers.TestsWithLastResultOfMultipleUsers
                                          from testResult in testWithLastResultOfMultipleUsers.TestResults
                                          group testResult by testResult.UserId into userGroup
                                          select new
            {
                UserId = userGroup.Key,
                AmountOfPassedTests = userGroup.Count(g => g.Passed)
            };

            var testPassageStatisticsQuery = from userStatistic in passedTestsPerUserQuery
                                             group userStatistic by userStatistic.AmountOfPassedTests into amountGroup
                                             select new TestPassageStatistic
            {
                AmountOfUsers       = amountGroup.Count(),
                AmountOfPassedTests = amountGroup.Key
            };

            var result = new AssignmentStatisticsDto
            {
                AssignmentId          = assignmentWithLastResultsOfMultipleUsers.Assignment.Id,
                TestPassageStatistics = testPassageStatisticsQuery.OrderBy(statistic => statistic.AmountOfPassedTests).ToList()
            };

            return(result);
        }
        public void GetChapterStatisticsAsyncShouldRetrieveAssignmentsWithLastResultsOfMultipleUsersAndConvertThemToStatistics()
        {
            //Arrange
            var chapterId = _random.NextPositive();
            var nowUtc    = DateTime.UtcNow;
            var assignmentWithResultsOfMultipleUsers      = new AssignmentWithLastResultsOfMultipleUsers();
            var assignmentsWithLastResultsOfMultipleUsers = new List <AssignmentWithLastResultsOfMultipleUsers> {
                assignmentWithResultsOfMultipleUsers
            };

            _testResultRepositoryMock
            .Setup(repo => repo.GetLastTestResultsOfChapterAsync(It.IsAny <int>(), It.IsAny <DateTime?>()))
            .ReturnsAsync(assignmentsWithLastResultsOfMultipleUsers);

            var assignmentStatisticsDto = new AssignmentStatisticsDto();

            _testResultConverterMock
            .Setup(converter => converter.ToAssignmentStatisticsDto(It.IsAny <AssignmentWithLastResultsOfMultipleUsers>()))
            .Returns(assignmentStatisticsDto);

            //Act
            var results = _service.GetChapterStatisticsAsync(chapterId, nowUtc).Result;

            //Assert
            Assert.That(results, Has.Exactly(1).EqualTo(assignmentStatisticsDto));
            _testResultRepositoryMock.Verify(repo => repo.GetLastTestResultsOfChapterAsync(chapterId, nowUtc), Times.Once);
            _testResultConverterMock.Verify(converter => converter.ToAssignmentStatisticsDto(assignmentWithResultsOfMultipleUsers), Times.Once);
        }
Exemple #3
0
        public void ToAssignmentStatisticsDtoShouldCorrectlyGenerateStatistics()
        {
            //Arrange
            var converter = new AssignmentWitResultsConverter();
            var assigment = new ExerciseBuilder().Build();
            var random    = new Random();
            var user1Id   = random.NextPositive();
            var user2Id   = random.NextPositive();
            var user3Id   = random.NextPositive();

            //create test results
            //user 1 and user 2 both have one passing test
            //user 3 passes no tests
            var testsWithResultsOfMultipleUsers = new List <TestWithLastResultOfMultipleUsers>
            {
                new TestWithLastResultOfMultipleUsersBuilder()
                .WithAssignmentId(assigment.Id)
                .WithUserResult(user1Id, false)
                .WithUserResult(user2Id, true)
                .WithUserResult(user3Id, false)
                .Build(),
                new TestWithLastResultOfMultipleUsersBuilder()
                .WithAssignmentId(assigment.Id)
                .WithUserResult(user1Id, true)
                .WithUserResult(user2Id, false)
                .WithUserResult(user3Id, false)
                .Build(),
            };
            var assignmentWithResultsOfMultipleUsers = new AssignmentWithLastResultsOfMultipleUsers()
            {
                Assignment = assigment,
                TestsWithLastResultOfMultipleUsers = testsWithResultsOfMultipleUsers
            };

            //Act
            var result = converter.ToAssignmentStatisticsDto(assignmentWithResultsOfMultipleUsers);

            //Assert
            Assert.That(result, Is.Not.Null);
            Assert.That(result.AssignmentId, Is.EqualTo(assigment.Id));
            Assert.That(result.TestPassageStatistics.Count, Is.EqualTo(2));

            var firstStatistics = result.TestPassageStatistics.First();

            Assert.That(firstStatistics.AmountOfPassedTests, Is.EqualTo(0));
            Assert.That(firstStatistics.AmountOfUsers, Is.EqualTo(1)); //user 3

            var secondStatistics = result.TestPassageStatistics.ElementAt(1);

            Assert.That(secondStatistics.AmountOfPassedTests, Is.EqualTo(1));
            Assert.That(secondStatistics.AmountOfUsers, Is.EqualTo(2)); //user 1 and user 2
        }