This commit is contained in:
Zeeshaun
2026-04-20 14:47:24 -05:00
parent 89057eceea
commit 8b3ea92501
485 changed files with 71042 additions and 0 deletions
@@ -0,0 +1,169 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class AuctionOnHoldCheckerTest
{
readonly AuctionOnHoldChecker _auctionOnHoldChecker;
public AuctionOnHoldCheckerTest()
{
_auctionOnHoldChecker = new AuctionOnHoldChecker();
}
[Fact]
public void Auction_On_Hold_Created_Ok()
{
var updatedAccount = new RepoAccount()
{
Status = "REHO",
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
HoldStatus = 1
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionOnHoldChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Auction On Hold", result[0].Message);
}
[Fact]
public void Auction_On_Hold_Not_Created_RepoRedeemed()
{
var updatedAccount = new RepoAccount()
{
Status = "REDEEMED",
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
HoldStatus = 0
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionOnHoldChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Auction_On_Hold_Not_Created_Sold()
{
var updatedAccount = new RepoAccount()
{
Status = "SOLD",
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
HoldStatus = 0
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionOnHoldChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Auction_On_Hold_Not_Created_No_AuctionAssignments()
{
var updatedAccount = new RepoAccount()
{
Status = "REHO",
Collaterals = new List<Collateral>()
{
new Collateral()
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
FundsSent = DateTime.Now.AddDays(-2)
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionOnHoldChecker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,295 @@
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class AuctionVinDifferentCheckerTest
{
readonly AuctionVinDifferentChecker _auctionVinDifferentChecker;
public AuctionVinDifferentCheckerTest()
{
_auctionVinDifferentChecker = new AuctionVinDifferentChecker();
}
[Fact]
public void Auction_Vin_Different_Single_Created_Ok()
{
var updatedAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
Vin = "OurVin"
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
VIN = "TheirVin"
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionVinDifferentChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Auction VIN Different", result[0].Message);
Assert.Equal("Auction Assignment VIN: THEIRVIN differs from RepoManager VIN: OURVIN", result[0].SubMessage);
}
[Fact]
public void Auction_Vin_Different_Multiple_Created_Ok()
{
var updatedAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
Vin = "OurFirstVin"
},
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
Vin = "OurSecondVin"
},
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
Vin = "OurThirdVin"
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
VIN = "TheirVin"
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionVinDifferentChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Auction VIN Different", result[0].Message);
Assert.Equal(
"Auction Assignment VIN: THEIRVIN is not among RepoManager VINs: OURFIRSTVIN, OURSECONDVIN, OURTHIRDVIN",
result[0].SubMessage);
}
[Fact]
public void Auction_Vin_Different_Not_Created_Single_Vins_Match()
{
var updatedAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
Vin = "OurVin"
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
VIN = "OurVin"
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionVinDifferentChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Auction_Vin_Different_Not_Created_Multiple_Vins_Match()
{
var updatedAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
Vin = "OurFirstVin"
},
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
Vin = "OurSecondVin"
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
VIN = "OurSecondVin"
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionVinDifferentChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Auction_Vin_Different_Not_Created_Vin_Null()
{
var updatedAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
Vin = "OurVin"
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionVinDifferentChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Auction_Vin_Different_Not_Created_No_AuctionAssignments()
{
var updatedAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedAccount
};
var result = _auctionVinDifferentChecker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,95 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using LCU.Shared.Collections.RepoApiLib.Models.Consumer;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class CreditAdjustmentCheckerTest
{
private readonly CreditAdjustmentChecker _creditAdjustmentChecker;
private readonly List<CoreTransaction> _transactions;
public CreditAdjustmentCheckerTest()
{
_transactions = new List<CoreTransaction>()
{
new CoreTransaction()
{
postingDate = DateTime.Now.AddDays(-2),
transactionTypeCode = "PDSB",
amount = 500,
runningBalance = 2000,
transactionTypeDescription = "Test"
}
};
_creditAdjustmentChecker = new CreditAdjustmentChecker();
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_O4R_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "O4R" }
};
var result = _creditAdjustmentChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Credit Adjustment Received", result[0].Message);
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_REPO_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "REPO" }
};
var result = _creditAdjustmentChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Credit Adjustment Received", result[0].Message);
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_SOLD_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "SOLD" }
};
var result = _creditAdjustmentChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Credit Adjustment Received", result[0].Message);
}
[Fact]
public void Does_Not_Create_Alert_For_Unwatched_Statuses()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "RECA" }
};
var result = _creditAdjustmentChecker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,95 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using LCU.Shared.Collections.RepoApiLib.Models.Consumer;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class DebitAdjustmentCheckerTest
{
private readonly DebitAdjustmentChecker _debitAdjustmentChecker;
private readonly List<CoreTransaction> _transactions;
public DebitAdjustmentCheckerTest()
{
_transactions = new List<CoreTransaction>()
{
new CoreTransaction()
{
postingDate = DateTime.Now.AddDays(-2),
transactionTypeCode = "PRCT",
amount = 500,
runningBalance = 2000,
transactionTypeDescription = "Test"
}
};
_debitAdjustmentChecker = new DebitAdjustmentChecker();
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_O4R_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "O4R" }
};
var result = _debitAdjustmentChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Debit Adjustment Received", result[0].Message);
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_REPO_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "REPO" }
};
var result = _debitAdjustmentChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Debit Adjustment Received", result[0].Message);
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_SOLD_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "SOLD" }
};
var result = _debitAdjustmentChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Debit Adjustment Received", result[0].Message);
}
[Fact]
public void Does_Not_Create_Alert_For_Unwatched_Statuses()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "RECA" }
};
var result = _debitAdjustmentChecker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,436 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using LCU.Shared.Collections.RepoApiLib.Models.Consumer;
using Moq;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class DocumentNotFoundCheckerTest
{
public DocumentNotFoundCheckerTest()
{
}
private MemberDetail MakeMemberWithAddressInState(string state)
{
return new MemberDetail
{
Address = new AddressDetail
{
State = state
}
};
}
[Fact]
public void Create_NoticeOfSaleBankruptcy_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
Bankruptcy = "B13",
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("Notice of Sale", "LTR35", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_NoticeOfSaleWiFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>
{
new RepoLetter
{
ActionCode = "LTR35",
NoticeType = "WI Repo-Notice of Plan to Sell"
}
},
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
}
};
var checker = new DocumentNotFoundChecker("Notice of Sale", "LTR35", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_NoticeOfSaleIlFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>
{
new RepoLetter
{
ActionCode = "701",
NoticeType = "Right to Reinstate/Redeem-Illinois"
}
},
Member = MakeMemberWithAddressInState("IL"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
}
};
var checker = new DocumentNotFoundChecker("Notice of Sale", "LTR35", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_NoticeOfSaleWrongStatus_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
}
};
var checker = new DocumentNotFoundChecker("Notice of Sale", "LTR35", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_NoticeOfSaleNotFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("Notice of Plan to Sell", "LTR35", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Notice of Plan to Sell Not Found", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(5, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_NoticeOfRepossessionBankruptcy_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
Bankruptcy = "B13",
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("Notice of Repossession", "LTR34", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_NoticeOfRepossessionWiFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>
{
new RepoLetter
{
ActionCode = "LTR34",
NoticeType = "Repo-WI Notice of Repossession"
}
},
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("Notice of Repossession", "LTR34", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_NoticeOfRepossessionIlFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>
{
new RepoLetter
{
ActionCode = "701",
NoticeType = "Right to Reinstate/Redeem-Illinois"
}
},
Member = MakeMemberWithAddressInState("IL"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("Notice of Repossession", "LTR34", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_NoticeOfRepossessionWrongStatus_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
}
};
var checker = new DocumentNotFoundChecker("Notice of Repossession", "LTR34", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_NoticeOfRepossessionNotFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("Notice of Repossession", "LTR34", "701", "REPO");
var result = checker.CheckForAlert(slip);
Assert.NotNull(result[0]);
Assert.Equal("Notice of Repossession Not Found", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(5, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Null_Letters_Dont_Throw_Exception()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = null,
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
Bankruptcy = "B13",
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("RTC Letter", "RTC 3");
List<EventAlert> result = null;
try
{
result = checker.CheckForAlert(slip);
}
catch (Exception)
{
Assert.True(false, "Null letters should not have thrown an exception.");
}
Assert.Null(result);
}
[Fact]
public void Null_Member_Does_Not_Throw_Exception()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = null,
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
Bankruptcy = "B13",
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("RTC Letter", "RTC 3");
List<EventAlert> result = null;
try
{
result = checker.CheckForAlert(slip);
}
catch (Exception)
{
Assert.True(false, "A null member should not have thrown an exception.");
}
Assert.Null(result);
}
[Fact]
public void Null_Member_Address_Does_Not_Throw_Exception()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState(null),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
Bankruptcy = "B13",
AccountNo = "123456-789",
Status = "REPO"
}
};
var checker = new DocumentNotFoundChecker("RTC Letter", "RTC 3");
List<EventAlert> result = null;
try
{
result = checker.CheckForAlert(slip);
}
catch (Exception)
{
Assert.True(false, "A null member address should not have thrown an exception.");
}
Assert.Null(result);
}
}
}
@@ -0,0 +1,169 @@
using System;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class NoticeOfSurplusDeficiencyNotSentCheckerTest
{
private readonly NoticeOfSurplusDeficiencyNotSentChecker _checker;
public NoticeOfSurplusDeficiencyNotSentCheckerTest()
{
_checker = new NoticeOfSurplusDeficiencyNotSentChecker();
}
[Fact]
public void Does_Not_Create_Alert_When_Refunds_Received_Date_Is_Null()
{
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO"
},
UpdatedRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO",
RefundStatus = new RefundStatus
{
RepoId = 1,
RefundsReceivedDate = null
}
}
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Does_Not_Create_Alert_When_Refunds_Received_Date_Two_Days_Ago_And_Account_Not_Closed()
{
var originalRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO",
RefundStatus = new RefundStatus
{
RepoId = 1,
RefundsReceivedDate = DateTime.Now.AddDays(-2).Date
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Creates_Alert_When_Refunds_Received_Date_Three_Days_Ago_And_Account_Not_Closed()
{
var originalRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO",
RefundStatus = new RefundStatus
{
RepoId = 1,
RefundsReceivedDate = DateTime.Now.AddDays(-3).Date
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.NotNull(result);
}
[Fact]
public void Does_Not_Create_Alert_When_Refunds_Received_Date_Three_Days_Ago_And_Account_Not_Closed_And_Bankruptcy_Not_Null()
{
var originalRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO",
Bankruptcy = "B7"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO",
Bankruptcy = "B7",
RefundStatus = new RefundStatus
{
RepoId = 1,
RefundsReceivedDate = DateTime.Now.AddDays(-3).Date
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Does_Not_Create_Alert_When_Refunds_Received_Date_Three_Days_Ago_And_Account_Is_Closed()
{
var originalRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "REPO",
DateClosed = DateTime.Now.Date,
RefundStatus = new RefundStatus
{
RepoId = 1,
RefundsReceivedDate = DateTime.Now.AddDays(-3).Date
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,517 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApiLib.Models;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Moq;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class O4rNoRepoCheckerTest
{
[Fact]
public void Create_TooFewDays_Ok()
{
var checker = new O4rNoRepoChecker(RepoType.Voluntary);
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Voluntary
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-1)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_Voluntary_Ok()
{
var checker = new O4rNoRepoChecker(RepoType.Voluntary);
var originalRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Voluntary,
RepoCompanyId = 10,
RepoCompanyAssignmentDate = DateTime.Today
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-2)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("O4R No Repo", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(5, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_VoluntaryRepeat_Ok()
{
var checker = new O4rNoRepoChecker(RepoType.Voluntary);
var originalRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Voluntary,
RepoCompanyAssignmentDate = DateTime.Today,
RepoCompanyId = 5
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-3)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("O4R No Repo", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(7, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_Involuntary_Ok()
{
var checker = new O4rNoRepoChecker(RepoType.Involuntary);
var originalRepoAccount = new RepoAccount()
{
RepoId = 4,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 4,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Involuntary,
RepoCompanyAssignmentDate = DateTime.Today,
RepoCompanyId = 5
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-60)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("O4R No Repo", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(4, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_InvoluntaryRepeat_Ok()
{
var checker = new O4rNoRepoChecker(RepoType.Involuntary);
var originalRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Involuntary,
RepoCompanyAssignmentDate = DateTime.Today,
RepoCompanyId = 5
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-90)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("O4R No Repo", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(7, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_Preskip_Ok()
{
var checker = new O4rNoRepoChecker(RepoType.PreSkip);
var originalRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.PreSkip,
RepoCompanyAssignmentDate = DateTime.Today,
RepoCompanyId = 5
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-31)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("O4R No Repo", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(7, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_No_Repo_Ok()
{
var checker = new O4rNoRepoChecker(RepoType.PreSkip);
var originalRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Unknown,
RepoCompanyAssignmentDate = null,
RepoCompanyId = 5
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-31)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Theory]
[InlineData(15, 10, 5, true)]
[InlineData(20, 10, 10, true)]
[InlineData(16, 10, 5, false)]
[InlineData(8, 10, 5, false)]
[InlineData(10, 10, 5, false)]
public void ShouldSendRepeatedAlert_OK(int daysInStatus, int dayCount, int repeatCount, bool expected)
{
var checker = new O4rNoRepoChecker(RepoType.PreSkip);
Assert.Equal(expected, checker.ShouldSendRepeatedAlert(daysInStatus, dayCount, repeatCount));
}
[Fact]
public void IsRepoAssigned_True_OK()
{
var updatedRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.PreSkip,
RepoCompanyAssignmentDate = DateTime.Now,
RepoCompanyId = 5
}
}
}
}
};
var checker = new O4rNoRepoChecker(RepoType.PreSkip);
Assert.True(checker.IsRepoAssigned(updatedRepoAccount));
}
[Fact]
public void IsRepoAssigned_No_Date_OK()
{
var updatedRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.PreSkip,
RepoCompanyAssignmentDate = null,
RepoCompanyId = 5
}
}
}
}
};
var checker = new O4rNoRepoChecker(RepoType.PreSkip);
Assert.False(checker.IsRepoAssigned(updatedRepoAccount));
}
[Fact]
public void IsRepoAssigned_No_Type_OK()
{
var updatedRepoAccount = new RepoAccount()
{
RepoId = 7,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Unknown,
RepoCompanyAssignmentDate = DateTime.Now,
RepoCompanyId = 5
}
}
}
}
};
var checker = new O4rNoRepoChecker(RepoType.PreSkip);
Assert.False(checker.IsRepoAssigned(updatedRepoAccount));
}
}
}
@@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using LCU.Shared.Collections.RepoApiLib.Models.Consumer;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class PaymentReceivedCheckerTest
{
private readonly PaymentReceivedChecker _paymentReceivedChecker;
private readonly List<CoreTransaction> _transactions;
public PaymentReceivedCheckerTest()
{
_transactions = new List<CoreTransaction>()
{
new CoreTransaction()
{
postingDate = DateTime.Now.AddDays(-2),
transactionTypeCode = "EXT",
amount = 500,
runningBalance = 2000,
transactionTypeDescription = "Test"
}
};
_paymentReceivedChecker = new PaymentReceivedChecker();
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_O4R_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "O4R" }
};
var result = _paymentReceivedChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Payment Received", result[0].Message);
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_REPO_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "REPO" }
};
var result = _paymentReceivedChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Payment Received", result[0].Message);
}
[Fact]
public void Creates_Alert_With_Recent_Transactions_Present_And_SOLD_Status()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "SOLD" }
};
var result = _paymentReceivedChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Payment Received", result[0].Message);
}
[Fact]
public void Does_Not_Create_Alert_For_Unwatched_Statuses()
{
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount { Status = "RECA" }
};
var result = _paymentReceivedChecker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,180 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class RedemptionEndedNoTitleOrderedCheckerTest
{
private readonly RedemptionEndedNoTitleOrderedChecker _checker;
public RedemptionEndedNoTitleOrderedCheckerTest()
{
_checker = new RedemptionEndedNoTitleOrderedChecker();
}
[Fact]
public void Create_TooFewDays_Ok()
{
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO",
RedemptionExpiredDate = DateTime.Now.AddDays(-7),
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_StatusNotRepo_Ok()
{
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
RedemptionExpiredDate = DateTime.Now.AddDays(-8),
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RedemptionEndedNoTitleOrdered_Ok()
{
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO",
RedemptionExpiredDate = DateTime.Now.AddDays(-8),
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Redemption Ended No Title Ordered", result[0].Message);
}
[Fact]
public void Create_RedemptionEndedTitleOrdered_Ok()
{
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO",
RedemptionExpiredDate = DateTime.Now.AddDays(-8),
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
},
RetitledInLandmarkName = DateTime.Now.AddDays(-5)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,173 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class RepoNotSoldCheckerTest
{
private readonly RepoNotSoldChecker _checker;
public RepoNotSoldCheckerTest()
{
_checker = new RepoNotSoldChecker(60, 30);
}
[Fact]
public void Create_TooFewDays_Ok()
{
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO",
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "REPO",
ChangedDate = DateTime.Now.AddDays(-59)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RepoNotSold_Ok()
{
var originalRepoAccount = new RepoAccount()
{
RepoId = 3,
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 3,
AccountNo = "123456-789",
Status = "REPO",
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "REPO",
ChangedDate = DateTime.Now.AddDays(-60)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Repo Not Sold", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(3, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_RepoNotSoldRepeat_Ok()
{
var originalRepoAccount = new RepoAccount()
{
RepoId = 6,
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 6,
AccountNo = "123456-789",
Status = "REPO",
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "REPO",
ChangedDate = DateTime.Now.AddDays(-90)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Repo Not Sold", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(6, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_61DaysInRepoNull_Ok()
{
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REPO",
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "REPO",
ChangedDate = DateTime.Now.AddDays(-61)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = _checker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,227 @@
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApiLib.Models;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using LCU.Shared.Collections.RepoApiLib.Models.Consumer;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class RtcLetterIsNullCheckerTest
{
public RtcLetterIsNullCheckerTest()
{
}
private MemberDetail MakeMemberWithAddressInState(string state)
{
return new MemberDetail
{
Address = new AddressDetail
{
State = state
}
};
}
[Fact]
public void Create_RtcLetterWiAutoLoansFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>
{
new RepoLetter
{
ActionCode = "RTC 3",
NoticeType = "RTC-WI-AUTO LOANS"
}
},
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RtcLetterWiNonAutoFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>
{
new RepoLetter
{
ActionCode = "RTC 1",
NoticeType = "RTC WI- ATV,Boat, Snowmobile"
}
},
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RtcLetterIlNotApplicable_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("IL"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RtcLetterWiVoluntary_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1,
RepoCompanySelections = new List<RepoCompanySelection>
{
new RepoCompanySelection
{
Id = 1,
RepoType = RepoType.Voluntary
}
}
}
}
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1,
RepoCompanySelections = new List<RepoCompanySelection>
{
new RepoCompanySelection
{
Id = 1,
RepoType = RepoType.Voluntary
}
}
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RtcLetterNotFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "RECA"
},
UpdatedRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "RECA",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,235 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApiLib.Models;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using LCU.Shared.Collections.RepoApiLib.Models.Consumer;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class RtcLetterNotFoundCheckerTest
{
public RtcLetterNotFoundCheckerTest()
{
}
private MemberDetail MakeMemberWithAddressInState(string state)
{
return new MemberDetail
{
Address = new AddressDetail
{
State = state
}
};
}
[Fact]
public void Create_RtcLetterWiAutoLoansFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>
{
new RepoLetter
{
ActionCode = "RTC 3",
NoticeType = "RTC-WI-AUTO LOANS"
}
},
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RtcLetterWiNonAutoFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>
{
new RepoLetter
{
ActionCode = "RTC 1",
NoticeType = "RTC WI- ATV,Boat, Snowmobile"
}
},
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RtcLetterIlNotApplicable_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("IL"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RtcLetterWiVoluntary_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1,
RepoCompanySelections = new List<RepoCompanySelection>
{
new RepoCompanySelection
{
Id = 1,
RepoType = RepoType.Voluntary
}
}
}
}
},
UpdatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1,
RepoCompanySelections = new List<RepoCompanySelection>
{
new RepoCompanySelection
{
Id = 1,
RepoType = RepoType.Voluntary
}
}
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_RtcLetterNotFound_Ok()
{
var slip = new RepoAccountProcessingSlip()
{
Letters = new List<RepoLetter>(),
Member = MakeMemberWithAddressInState("WI"),
ExistingRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "O4R"
},
UpdatedRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>
{
new Collateral
{
CollateralId = 1
}
}
}
};
var checker = new RtcLetterNotFoundChecker("RTC Letter", new List<string> { "RTC 1", "RTC 3" });
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("RTC Letter Not Found", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(5, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
}
}
@@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.DataAccess;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using LCU.Shared.Collections.RepoApiLib.Models.Consumer;
using Moq;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class SaleFundsReceivedCheckerTest
{
private SaleFundsReceivedChecker _saleFundsReceivedChecker;
private List<CoreTransaction> _transactions;
private readonly Mock<ICoreDao> _mockCoreDao;
public SaleFundsReceivedCheckerTest()
{
_mockCoreDao = new Mock<ICoreDao>();
}
[Fact]
public void Creates_Alert_When_Description_Contains_Sub_string()
{
_mockCoreDao.Setup(service => service.RetrieveMemberAsync(It.IsAny<string>()))
.ReturnsAsync(
new MemberDetail()
{
MemberId = 8675309
}
);
_transactions = new List<CoreTransaction>()
{
new CoreTransaction()
{
postingDate = DateTime.Now.AddDays(-2),
transactionTypeCode = "PRCT",
amount = 500,
runningBalance = 2000,
transactionTypeDescription = "Sale Of Test"
}
};
_saleFundsReceivedChecker = new SaleFundsReceivedChecker();
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount()
};
var result = _saleFundsReceivedChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Sale Funds Received", result[0].Message);
}
[Fact]
public void Does_Not_Create_Alert_When_Description_Does_Not_Contain_Sub_String()
{
_transactions = new List<CoreTransaction>()
{
new CoreTransaction()
{
postingDate = DateTime.Now.AddDays(-2),
transactionTypeCode = "SHOULDFAILTYPECODE",
amount = 500,
runningBalance = 2000,
transactionTypeDescription = "Test"
}
};
_saleFundsReceivedChecker = new SaleFundsReceivedChecker();
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = _transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount()
};
var result = _saleFundsReceivedChecker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,115 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApiLib.Models;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class SkipEndCheckerTest
{
[Fact]
public void Create_SkipNotEnded_Ok()
{
var checker = new SkipEndChecker(91);
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Skip
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-90)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_SkipEnded_Ok()
{
var checker = new SkipEndChecker(91);
var originalRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 1,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Skip
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-91)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Skip Claim Ended", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(1, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
}
}
@@ -0,0 +1,220 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.CollectionsApiLib.Models;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class SkipNotPaidCheckerTest
{
[Fact]
public void Create_TooFewDays_Ok()
{
var checker = new SkipNotPaidChecker(106, 15);
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Skip
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-105)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_PaidSkip_Ok()
{
var checker = new SkipNotPaidChecker(106, 15);
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R",
SubStatus = "PSKP",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Skip
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-106)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_SkipNotPaid_Ok()
{
var checker = new SkipNotPaidChecker(106);
var originalRepoAccount = new RepoAccount()
{
RepoId = 4,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 4,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Skip
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-106)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Skip Not Paid", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(4, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_SkipNotPaidRepeating_Ok()
{
var checker = new SkipNotPaidChecker(106, 15);
var originalRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 5,
AccountNo = "123456-789",
Status = "O4R",
Collaterals = new List<Collateral>()
{
new Collateral
{
RepoCompanySelections = new List<RepoCompanySelection>()
{
new RepoCompanySelection()
{
RepoType = RepoType.Skip
}
}
}
},
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-121)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Skip Not Paid", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(5, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
}
}
@@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class SkipPaidCheckerTest
{
[Fact]
public void Create_Ok()
{
var checker = new SkipPaidChecker(); // 106, 15
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
SubStatus = SkipPaidChecker.RepoSubStatusPaidSkip,
Status = "O4R",
Collaterals = new List<Collateral>(),
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "O4R",
ChangedDate = DateTime.Now.AddDays(-105)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Equal(updatedRepoAccount.SubStatus, updatedRepoAccount.Status);
Assert.NotNull(result);
}
[Fact]
public void DoNotThrowOnNull()
{
var checker = new SkipPaidChecker(); // 106, 15
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "O4R"
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = null
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,175 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class SoldNoProceedsCheckerTest
{
private readonly SoldNoProceedsChecker _soldNoProceedsChecker;
public SoldNoProceedsCheckerTest()
{
_soldNoProceedsChecker = new SoldNoProceedsChecker();
}
[Fact]
public void Sold_No_Proceeds_Created_Ok()
{
var updatedRepoAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
SoldDate = DateTime.Now.AddDays(-6)
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedRepoAccount
};
var result = _soldNoProceedsChecker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Sold No Proceeds", result[0].Message);
}
[Fact]
public void Sold_No_Proceeds_Not_Created_Funds_Sent()
{
var updatedRepoAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
SoldDate = DateTime.Now.AddDays(-6),
FundsSent = DateTime.Now.AddDays(-2)
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedRepoAccount
};
var result = _soldNoProceedsChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Sold_No_Proceeds_Not_Created_SoldDate_Null()
{
var updatedRepoAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
{
AuctionAssignmentToCollaterals = new List<AuctionAssignmentToCollateral>()
{
new AuctionAssignmentToCollateral()
{
AuctionAssignmentId = 1,
CollateralId = 1
}
}
}
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
FundsSent = DateTime.Now.AddDays(-2)
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedRepoAccount
};
var result = _soldNoProceedsChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Sold_No_Proceeds_Not_Created_No_AuctionAssignments()
{
var updatedRepoAccount = new RepoAccount()
{
Collaterals = new List<Collateral>()
{
new Collateral()
}
};
var slip = new RepoAccountProcessingSlip()
{
AuctionAssignments = new List<AuctionAssignment>()
{
new AuctionAssignment()
{
AutoIMS = new ImsAutoFileData()
{
FundsSent = DateTime.Now.AddDays(-2)
}
}
},
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = updatedRepoAccount
};
var result = _soldNoProceedsChecker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,148 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class StatusChangeCheckerTest
{
[Fact]
public void Create_StatusIsUnchanged_Ok()
{
var checker = new StatusChangeChecker("RECA");
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "RECA"
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_StatusIsReca_Ok()
{
var checker = new StatusChangeChecker("RECA");
var originalRepoAccount = new RepoAccount()
{
RepoId = 2,
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 2,
AccountNo = "123456-789",
Status = "RECA"
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Status Changed to RECA", result[0].Message);
Assert.Equal("Previously REPO. I confirm that I have updated the Status to RECA in RDN.",
result[0].SubMessage);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(2, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_StatusIsReho_Ok()
{
var checker = new StatusChangeChecker("REHO");
var originalRepoAccount = new RepoAccount()
{
RepoId = 2,
AccountNo = "123456-789",
Status = "REPO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 2,
AccountNo = "123456-789",
Status = "REHO"
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Status Changed to REHO", result[0].Message);
Assert.Equal("Previously REPO. I confirm that I have updated the Status to REHO in RDN.",
result[0].SubMessage);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(2, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_StatusFromO4rToBlank_Ok()
{
var DefaultNoStatusIntellec = "NO STATUS INTELLEC";
var checker = new StatusChangeChecker(DefaultNoStatusIntellec, new List<string>() { "O4R", "REPO" });
var originalRepoAccount = new RepoAccount()
{
RepoId = 2,
AccountNo = "123456-789",
Status = "O4R"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 2,
AccountNo = "123456-789",
Status = DefaultNoStatusIntellec
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("Status Changed to " + DefaultNoStatusIntellec, result[0].Message);
Assert.Equal("Previously O4R. I confirm that I have updated the Status to NO STATUS INTELLEC in RDN.",
result[0].SubMessage);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(2, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
}
}
@@ -0,0 +1,168 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class TimeInStatusCheckerTest
{
[Fact]
public void Create_TooFewDays_Ok()
{
var checker = new TimeInStatusChecker("REHO", 30, 30);
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REHO"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REHO",
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "REHO",
ChangedDate = DateTime.Now.AddDays(-29)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Create_30DaysInReho_Ok()
{
var checker = new TimeInStatusChecker("REHO", 30, 30);
var originalRepoAccount = new RepoAccount()
{
RepoId = 9,
AccountNo = "123456-789",
Status = "REHO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 9,
AccountNo = "123456-789",
Status = "REHO",
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "REHO",
ChangedDate = DateTime.Now.AddDays(-30)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("30 days in REHO", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(9, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_30DaysInRehoRepeat_Ok()
{
var checker = new TimeInStatusChecker("REHO", 30, 30);
var originalRepoAccount = new RepoAccount()
{
RepoId = 9,
AccountNo = "123456-789",
Status = "REHO"
};
var updatedRepoAccount = new RepoAccount()
{
RepoId = 9,
AccountNo = "123456-789",
Status = "REHO",
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "REHO",
ChangedDate = DateTime.Now.AddDays(-60)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.NotNull(result);
Assert.Equal("60 days in REHO", result[0].Message);
Assert.Equal("123456-789", result[0].AccountNo);
Assert.Equal("Batch", result[0].CreatedBy);
Assert.InRange(result[0].DateAdded, DateTime.Now.AddSeconds(-1), DateTime.Now.AddSeconds(1));
Assert.Equal(9, result[0].RepoId);
Assert.Null(result[0].MarkedReadBy);
Assert.Null(result[0].DateMarkedRead);
}
[Fact]
public void Create_45DaysInRehoNull_Ok()
{
var checker = new TimeInStatusChecker("REHO", 30, 30);
var originalRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REHO"
};
var updatedRepoAccount = new RepoAccount()
{
AccountNo = "123456-789",
Status = "REHO",
RepoStatusChanges = new List<RepoStatusChange>()
{
new RepoStatusChange()
{
StatusFrom = "None",
StatusTo = "REHO",
ChangedDate = DateTime.Now.AddDays(-45)
}
}
};
var slip = new RepoAccountProcessingSlip()
{
ExistingRepoAccount = originalRepoAccount,
UpdatedRepoAccount = updatedRepoAccount
};
var result = checker.CheckForAlert(slip);
Assert.Null(result);
}
}
}
@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using LCU.API.Collections.RepoApi.Domain.AlertChecker;
using LCU.API.Collections.RepoApi.Domain.Processing;
using LCU.Shared.Collections.RepoApiLib.Models;
using LCU.Shared.Collections.RepoApiLib.Models.Consumer;
using Xunit;
namespace LCU.API.Collections.RepoApiTests.AlertCheckers
{
public class TransactionHistoryCheckerTest
{
private DummyTransactionChecker _transactionHistoryChecker;
[Fact]
public void Does_Not_Create_Alert_When_Posting_Date_Is_Too_old()
{
var transactions = new List<CoreTransaction>()
{
new CoreTransaction()
{
postingDate = DateTime.Now.AddDays(-5),
transactionTypeCode = "TEST"
}
};
_transactionHistoryChecker = new DummyTransactionChecker();
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount()
};
var result = _transactionHistoryChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Does_Not_Create_Alert_When_Transaction_Type_Is_Wrong()
{
var transactions = new List<CoreTransaction>()
{
new CoreTransaction()
{
postingDate = DateTime.Now.AddDays(-1),
transactionTypeCode = "WRONGTYPE",
}
};
_transactionHistoryChecker = new DummyTransactionChecker();
var slip = new RepoAccountProcessingSlip()
{
TransactionHistory = transactions,
ExistingRepoAccount = new RepoAccount(),
UpdatedRepoAccount = new RepoAccount()
};
var result = _transactionHistoryChecker.CheckForAlert(slip);
Assert.Null(result);
}
[Fact]
public void Test_Formatted_Message()
{
var transactions = new List<CoreTransaction>()
{
new CoreTransaction()
{
postingDate = DateTime.Now.AddDays(-5),
}
};
_transactionHistoryChecker = new DummyTransactionChecker();
var result = TransactionHistoryChecker.FormatTransactionMessage(new CoreTransaction()
{
postingDate = DateTime.Parse("1941-12-07"),
amount = 248.49M,
runningBalance = 2398.05M,
transactionTypeDescription = "Test",
transactionTypeCode = "TEST"
});
var expectedMessage =
"Transaction Type: \"TEST\" | Posting: 12/7/1941 12:00:00 AM | Transaction: $248.49 | Balance: $2,398.05 | Description: \"Test\"";
Assert.Equal(expectedMessage, result);
}
}
internal class DummyTransactionChecker : TransactionHistoryChecker
{
public override List<EventAlert> CheckForAlert(RepoAccountProcessingSlip slip)
{
var result = GetRecentTransactionsFromType(new List<string> { "TEST TRANSACTION" }, slip.TransactionHistory);
return result != null ? new List<EventAlert> { new EventAlert() } : null;
}
}
}