public async Task CalculateAsync_WhenCalled_AssertMonthWasCalledOnEachCreditInfoInCreditInfoCollection() { ICreditInfoCollection sut = CreateSut(); DateTime creditInfoOffset = DateTime.Today.AddDays(_random.Next(1, _random.Next(1, 365)) * -1); IEnumerable <Mock <ICreditInfo> > creditInfoMockCollection = new List <Mock <ICreditInfo> > { _fixture.BuildCreditInfoMock(creditInfoOffset, isLastYearOfStatusDate: true), _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-1), isLastYearOfStatusDate: true), _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-2)) }; sut.Add(creditInfoMockCollection.Select(creditInfoMock => creditInfoMock.Object).ToArray()); await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1)); foreach (Mock <ICreditInfo> creditInfoMock in creditInfoMockCollection) { if (creditInfoMock.Object.IsLastYearOfStatusDate) { creditInfoMock.Verify(m => m.Month, Times.Once); continue; } creditInfoMock.Verify(m => m.Month, Times.Never); } }
public void ValuesAtEndOfLastMonthFromStatusDate_WhenCalculateAsyncHasNotBeenCalled_ReturnsCreditInfoValuesWhereCreditIsEqualToZero() { ICreditInfoCollection sut = CreateSut(); ICreditInfoValues result = sut.ValuesAtEndOfLastMonthFromStatusDate; Assert.That(result.Credit, Is.EqualTo(0M)); }
public void ValuesAtStatusDate_WhenCalculateAsyncHasNotBeenCalled_ReturnsCreditInfoValuesWhereBalanceIsEqualToZero() { ICreditInfoCollection sut = CreateSut(); ICreditInfoValues result = sut.ValuesAtStatusDate; Assert.That(result.Balance, Is.EqualTo(0M)); }
public async Task CalculateAsync_WhenCalled_ReturnsCreditInfoCollection() { ICreditInfoCollection sut = CreateSut(); ICreditInfoCollection result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1)); Assert.That(result, Is.SameAs(sut)); }
public void ValuesAtStatusDate_WhenCalculateAsyncHasNotBeenCalled_ReturnsNotNull() { ICreditInfoCollection sut = CreateSut(); ICreditInfoValues result = sut.ValuesAtStatusDate; Assert.That(result, Is.Not.Null); }
public void ValuesAtStatusDate_WhenCalled_ReturnsSameCreditInfoValuesAsValuesAtStatusDateOnCreditInfoCollection() { ICreditInfoCollection creditInfoCollection = _fixture.BuildCreditInfoCollectionMock().Object; IAccount sut = CreateSut(creditInfoCollection); ICreditInfoValues result = sut.ValuesAtStatusDate; Assert.That(result, Is.SameAs(creditInfoCollection.ValuesAtStatusDate)); }
public Account(IAccounting accounting, string accountNumber, string accountName, IAccountGroup accountGroup, ICreditInfoCollection creditInfoCollection, IPostingLineCollection postingLineCollection) : base(accounting, accountNumber, accountName, postingLineCollection) { NullGuard.NotNull(accountGroup, nameof(accountGroup)) .NotNull(creditInfoCollection, nameof(creditInfoCollection)); AccountGroup = accountGroup; CreditInfoCollection = creditInfoCollection; }
public async Task ApplyCalculationAsync_WhenCalledOnPostingLineWhereAccountValuesAtPostingDateWasNotGivenAndCalculatedAccountDoesNotHaveCreditInfoForPostingDate_ReturnsSamePostingLineWhereCreditOnAccountValuesAtPostingDateEqualToZero() { IPostingLine sut = CreateSut(); ICreditInfoCollection creditInfoCollection = _fixture.BuildCreditInfoCollectionMock(hasCreditInfoForFind: false).Object; IAccount calculatedAccount = _fixture.BuildAccountMock(creditInfoCollection: creditInfoCollection).Object; IPostingLine result = await sut.ApplyCalculationAsync(calculatedAccount); Assert.That(result.AccountValuesAtPostingDate.Credit, Is.EqualTo(0M)); }
public async Task CalculateAsync_WhenCalled_ReturnsSameAccountWhereCreditInfoCollectionIsEqualToCalculatedCreditInfoCollection() { ICreditInfoCollection calculatedCreditInfoCollection = _fixture.BuildCreditInfoCollectionMock().Object; ICreditInfoCollection creditInfoCollection = _fixture.BuildCreditInfoCollectionMock(calculatedCreditInfoCollection: calculatedCreditInfoCollection).Object; IAccount sut = CreateSut(creditInfoCollection); IAccount result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1)); Assert.That(result.CreditInfoCollection, Is.EqualTo(calculatedCreditInfoCollection)); }
internal static void EnsurePopulation(this ICreditInfoCollection creditInfoCollection, IAccount account) { NullGuard.NotNull(creditInfoCollection, nameof(creditInfoCollection)) .NotNull(account, nameof(account)); creditInfoCollection.EnsurePopulation <ICreditInfo, ICreditInfoCollection>(creditInfo => { DateTime nextCreditInfoFromDate = creditInfo.ToDate.AddDays(1); return(new CreditInfo(account, (short)nextCreditInfoFromDate.Year, (short)nextCreditInfoFromDate.Month, creditInfo.Credit)); }); }
public async Task CalculateAsync_WhenCreditInfoCollectionDoesNotContainCreditInfoForEndOfLastYearFromStatusDate_ReturnsCreditInfoCollectionWhereBalanceInValuesAtEndOfLastYearFromStatusDateIsEqualToZero() { ICreditInfoCollection sut = CreateSut(); DateTime creditInfoOffset = DateTime.Today.AddDays(_random.Next(1, _random.Next(1, 365)) * -1); IEnumerable <ICreditInfo> creditInfoCollection = new List <ICreditInfo> { _fixture.BuildCreditInfoMock(creditInfoOffset).Object, _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-1)).Object, _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-2)).Object }; sut.Add(creditInfoCollection); ICreditInfoCollection result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1)); Assert.That(result.ValuesAtEndOfLastYearFromStatusDate.Balance, Is.EqualTo(0M)); }
public async Task CalculateAsync_WhenCreditInfoCollectionContainsCreditInfoForStatusDate_ReturnsCreditInfoCollectionWhereValuesAtStatusDateIsNotNull() { ICreditInfoCollection sut = CreateSut(); DateTime creditInfoOffset = DateTime.Today.AddDays(_random.Next(1, _random.Next(1, 365)) * -1); ICreditInfo creditInfoForStatusDate = _fixture.BuildCreditInfoMock(creditInfoOffset, true).Object; IEnumerable <ICreditInfo> creditInfoCollection = new List <ICreditInfo> { creditInfoForStatusDate, _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-1)).Object, _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-2)).Object }; sut.Add(creditInfoCollection); ICreditInfoCollection result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1)); Assert.That(result.ValuesAtStatusDate, Is.Not.Null); }
public async Task CalculateAsync_WhenCreditInfoCollectionContainsCreditInfoForEndOfLastYearFromStatusDate_ReturnsCreditInfoCollectionWhereCreditInValuesAtEndOfLastYearFromStatusDateIsEqualToCreditInCreditInfoForEndOfLastYearFromStatusDate() { ICreditInfoCollection sut = CreateSut(); DateTime creditInfoOffset = DateTime.Today.AddDays(_random.Next(1, _random.Next(1, 365)) * -1); ICreditInfo creditInfoForEndOfLastYearFromStatusDate = _fixture.BuildCreditInfoMock(creditInfoOffset, isLastYearOfStatusDate: true).Object; IEnumerable <ICreditInfo> creditInfoCollection = new List <ICreditInfo> { creditInfoForEndOfLastYearFromStatusDate, _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-1), isLastYearOfStatusDate: true).Object, _fixture.BuildCreditInfoMock(creditInfoOffset.AddMonths(-2), isLastYearOfStatusDate: true).Object }; sut.Add(creditInfoCollection); ICreditInfoCollection result = await sut.CalculateAsync(DateTime.Now.AddDays(_random.Next(1, 365) * -1)); Assert.That(result.ValuesAtEndOfLastYearFromStatusDate.Credit, Is.EqualTo(creditInfoForEndOfLastYearFromStatusDate.Credit)); }
public async Task UpdateAccount_WhenCalledWithAccountingNumberAndAccountNumberForExistingAccount_ReturnsPartialViewResultWhereModelIsAccountViewModelWithCreditInfosContainingDataFromCreditInfoCollectionOnAccountFromQueryBus() { ICreditInfo[] creditInfos = _fixture.BuildCreditInfoCollectionMock().Object.ToArray(); ICreditInfoCollection creditInfoCollection = _fixture.BuildCreditInfoCollectionMock(creditInfoCollection: creditInfos).Object; IAccount account = _fixture.BuildAccountMock(creditInfoCollection: creditInfoCollection).Object; Controller sut = CreateSut(account: account); PartialViewResult result = (PartialViewResult)await sut.UpdateAccount(_fixture.Create <int>(), _fixture.Create <string>()); AccountViewModel accountViewModel = (AccountViewModel)result.Model; foreach (IGrouping <short, ICreditInfo> group in creditInfos.GroupBy(creditInfo => creditInfo.Year)) { Assert.That(accountViewModel.CreditInfos.ContainsKey(group.Key), Is.True); CreditInfoCollectionViewModel creditInfoCollectionViewModel = accountViewModel.CreditInfos[group.Key]; Assert.That(creditInfoCollectionViewModel, Is.Not.Null); Assert.That(creditInfoCollectionViewModel.All(creditInfoViewModel => group.SingleOrDefault(m => m.Month == creditInfoViewModel.Month) != null), Is.True); } }
internal static void Populate(this ICreditInfoCollection creditInfoCollection, IAccount account, ICreditInfo[] creditInfos, DateTime statusDate, DateTime statusDateForCreditInfos) { NullGuard.NotNull(creditInfoCollection, nameof(creditInfoCollection)) .NotNull(account, nameof(account)) .NotNull(creditInfos, nameof(creditInfos)); DateTime fromDate = new DateTime(statusDate.AddYears(-1).Year, 1, 1); if (creditInfos.Length == 0) { creditInfoCollection.Add(BuildCreditInfo(account, (short)fromDate.Year, (short)fromDate.Month)); creditInfoCollection.Add(BuildCreditInfo(account, (short)statusDateForCreditInfos.Year, (short)statusDateForCreditInfos.Month)); creditInfoCollection.EnsurePopulation(account); return; } ICreditInfo creditInfoForFromDate = creditInfos.FindInfoForFromDate(fromDate, (year, month, creditInfoBeforeFromDate) => BuildCreditInfo(account, year, month, creditInfoBeforeFromDate), (year, month) => BuildCreditInfo(account, year, month)); creditInfoCollection.Add(creditInfoForFromDate); creditInfoCollection.Add(creditInfos.Between(creditInfoForFromDate.ToDate.AddDays(1), statusDateForCreditInfos)); ICreditInfo lastCreditInfo = creditInfoCollection.Last(); if (lastCreditInfo == null || lastCreditInfo.Year > (short)statusDateForCreditInfos.Year || lastCreditInfo.Year == (short)statusDateForCreditInfos.Year && lastCreditInfo.Month >= (short)statusDateForCreditInfos.Month) { creditInfoCollection.EnsurePopulation(account); return; } creditInfoCollection.Add(BuildCreditInfo(account, (short)statusDateForCreditInfos.Year, (short)statusDateForCreditInfos.Month, lastCreditInfo)); creditInfoCollection.EnsurePopulation(account); }
private IAccount CreateSut(ICreditInfoCollection creditInfoCollection = null) { return(new Domain.Accounting.Account(_fixture.BuildAccountingMock().Object, _fixture.Create <string>(), _fixture.Create <string>(), _fixture.BuildAccountGroupMock().Object, creditInfoCollection ?? _fixture.BuildCreditInfoCollectionMock().Object, _fixture.BuildPostingLineCollectionMock().Object)); }
internal async Task CreateOrUpdateAsync(ICreditInfoCollection creditInfoCollection, AccountModel accountModel) { NullGuard.NotNull(creditInfoCollection, nameof(creditInfoCollection)) .NotNull(accountModel, nameof(accountModel)); ICreditInfo creditInfo = creditInfoCollection.First(); while (creditInfo != null) { CreditInfoModel currentCreditInfoModel = accountModel.CreditInfos.SingleOrDefault(creditInfoModel => creditInfoModel.YearMonth.Year == creditInfo.Year && creditInfoModel.YearMonth.Month == creditInfo.Month); CreditInfoModel previousCreditInfoModel = accountModel.CreditInfos.Where(creditInfoModel => creditInfoModel.YearMonth.Year < creditInfo.Year || creditInfoModel.YearMonth.Year == creditInfo.Year && creditInfoModel.YearMonth.Month < creditInfo.Month) .OrderByDescending(creditInfoModel => creditInfoModel.YearMonth.Year) .ThenByDescending(creditInfoModel => creditInfoModel.YearMonth.Month) .FirstOrDefault(); if (currentCreditInfoModel != null) { if (previousCreditInfoModel != null && creditInfo.Credit == previousCreditInfoModel.Credit) { accountModel.CreditInfos.Remove(await OnDeleteAsync(currentCreditInfoModel)); creditInfo = creditInfoCollection.Next(creditInfo); continue; } if (creditInfo.Credit == currentCreditInfoModel.Credit) { creditInfo = creditInfoCollection.Next(creditInfo); continue; } await OnUpdateAsync(creditInfo, currentCreditInfoModel); creditInfo = creditInfoCollection.Next(creditInfo); continue; } if (previousCreditInfoModel != null) { if (creditInfo.Credit == previousCreditInfoModel.Credit) { creditInfo = creditInfoCollection.Next(creditInfo); continue; } await CreateAsync(creditInfo, accountModel); creditInfo = creditInfoCollection.Next(creditInfo); continue; } if (creditInfo.Credit == 0M) { creditInfo = creditInfoCollection.Next(creditInfo); continue; } await CreateAsync(creditInfo, accountModel); creditInfo = creditInfoCollection.Next(creditInfo); } }