public async Task GetDistro_WhenInvoked_LogsMethodInvoked()
        {
            var foldingUsers = new FoldingUser[0];

            statsDownloadApiDataStoreServiceMock.GetFoldingMembers(startDateMock, endDateMock).Returns(foldingUsers);

            await systemUnderTest.GetDistro(startDateMock, endDateMock, amountMock);

            Received.InOrder(() =>
            {
                loggingServiceMock.LogMethodInvoked(nameof(systemUnderTest.GetDistro));
                statsDownloadApiTokenDistributionServiceMock.GetDistro(amountMock, foldingUsers);
                loggingServiceMock.LogMethodFinished(nameof(systemUnderTest.GetDistro));
            });
        }
        public async Task GetDistro_WhenInvoked_ReturnsSuccessGetDistroResponse()
        {
            var foldingUsers = new FoldingUser[0];
            var distro       = new[] { new DistroUser(null, 1, 2, 0.12345678m), new DistroUser(null, 3, 4, 100m) };

            statsDownloadApiDataStoreServiceMock.GetFoldingMembers(startDateMock, endDateMock).Returns(foldingUsers);
            statsDownloadApiTokenDistributionServiceMock.GetDistro(amountMock, foldingUsers).Returns(distro);

            GetDistroResponse actual = await InvokeGetDistro();

            Assert.That(actual.Success, Is.True);
            Assert.That(actual.Errors, Is.Null);
            Assert.That(actual.ErrorCount, Is.Null);
            Assert.That(actual.FirstErrorCode, Is.EqualTo(ApiErrorCode.None));
            Assert.That(actual.Distro, Is.EqualTo(distro));
            Assert.That(actual.TotalPoints, Is.EqualTo(4));
            Assert.That(actual.TotalWorkUnits, Is.EqualTo(6));
            Assert.That(actual.TotalDistro, Is.EqualTo(100.12345678));
        }
        private FoldingUser[] GetFoldingUsers(ParseResults firstFileResults, ParseResults lastFileResults)
        {
            loggingService.LogMethodInvoked();
            int length       = lastFileResults.UsersData.Count();
            var foldingUsers = new List <FoldingUser>(length);

            foreach (UserData userData in lastFileResults.UsersData)
            {
                UserData previous = firstFileResults.UsersData.FirstOrDefault(user =>
                                                                              user.Name == userData.Name &&
                                                                              user.TeamNumber == userData.TeamNumber);
                if (previous is UserData)
                {
                    var user = new FoldingUser(userData.FriendlyName, userData.BitcoinAddress,
                                               userData.TotalPoints - previous.TotalPoints, userData.TotalWorkUnits - previous.TotalWorkUnits);

                    if (user.PointsGained < 0)
                    {
                        throw new InvalidDistributionState(
                                  "Negative points earned was detected for a user. There may be an issue with the database state or the stat files download. Contact development");
                    }

                    if (user.WorkUnitsGained < 0)
                    {
                        throw new InvalidDistributionState(
                                  "Negative work units earned was detected for a user. There may be an issue with the database state or the stat files download. Contact development");
                    }

                    foldingUsers.Add(user);
                }
                else
                {
                    foldingUsers.Add(new FoldingUser(userData.FriendlyName, userData.BitcoinAddress,
                                                     userData.TotalPoints, userData.TotalWorkUnits));
                }
            }

            loggingService.LogMethodFinished();
            return(foldingUsers.ToArray());
        }
 private void AddingUserToDistro(int amount, List <DistroUser> distro, long totalPoints, FoldingUser foldingUser)
 {
     if (distro.Exists(user => user.BitcoinAddress == foldingUser.BitcoinAddress))
     {
         DistroUser previousUser = distro.Find(user => user.BitcoinAddress == foldingUser.BitcoinAddress);
         DistroUser combinedUser = NewDistroUser(amount, totalPoints, foldingUser.BitcoinAddress,
                                                 previousUser.PointsGained + foldingUser.PointsGained,
                                                 previousUser.WorkUnitsGained + foldingUser.WorkUnitsGained);
         distro.Remove(previousUser);
         distro.Add(combinedUser);
     }
     else
     {
         DistroUser distroUser = NewDistroUser(amount, totalPoints, foldingUser.BitcoinAddress,
                                               foldingUser.PointsGained, foldingUser.WorkUnitsGained);
         distro.Add(distroUser);
     }
 }