using LCU.API.Internal.DocumentIngestor.Services.AttributeDeterminingServices; using LCU.API.Internal.DocumentIngestor.Services.MicroApiServices; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.Accounts; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.Agreements; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.Mixed; using LCU.Library.Internal.DocumentIngestorModels.Entities; using LCU.Library.Internal.DocumentIngestorModels.Enums; using Moq; using NUnit.Framework; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace LCU.API.Internal.DocumentIngestorTests.Services.AttributeDeterminingServices; public class AccountOwnerDeterminingServiceTest { private AccountOwnerDeterminingService _accountOwnerDeterminingService; private Mock _mockCoreApiWrapperService; [SetUp] public void Setup() { _mockCoreApiWrapperService = new Mock(); _accountOwnerDeterminingService = new AccountOwnerDeterminingService(_mockCoreApiWrapperService.Object); } [Test] public async Task DetermineAccountOwnerAttributeForDnaDocument_PersonNumberFound_Success() { var fullName = "Bill B Billson"; var accountNumber = "9999"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.AreEqual("1", resultPayload.PersonNumbers?[0]); Assert.IsEmpty(resultPayload.OrganizationNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByPersonName(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByOrganizationName(It.IsAny()), Times.Never); } [Test] public async Task DetermineAccountOwnerAttributeForDnaDocument_PersonNumberNotFound_OrganizationFound_Success() { var orgName = "The Big Company"; var accountNumber = "9999"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { ByOrgNbr = 2, OrganizationName = orgName, IsPrimaryOwner = true } }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(orgName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.AreEqual("2", resultPayload.OrganizationNumbers?[0]); Assert.IsEmpty(resultPayload.PersonNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task DetermineAccountOwnerAttributeForDnaDocument_PersonNumberNotFound_OrganizationNotFound_Failure() { var fullName = "Bill B Billson"; var accountNumber = "9999"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List(); _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.IsEmpty(resultPayload.OrganizationNumbers); Assert.IsEmpty(resultPayload.PersonNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task DetermineAccountOwnerAttributeForDnaDocument_NoPrimaryOwner_Failure() { var fullName = "Bill B Billson"; var accountNumber = ""; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 2, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = false }, new() { PersonNumber = 5, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = false } }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByPersonName(fullName)).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsEmpty(resultPayload.OrganizationNumbers); Assert.IsEmpty(resultPayload.PersonNumbers); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByPersonName(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByOrganizationName(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task DetermineAccountOwnerAttributeForDnaDocument_TooManyOwners_Failure() { var fullName = "Bill B Billson"; var accountNumber = ""; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 2, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true }, new() { PersonNumber = 5, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByPersonName(fullName)).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsEmpty(resultPayload.OrganizationNumbers); Assert.IsEmpty(resultPayload.PersonNumbers); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByPersonName(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByOrganizationName(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttributeForDnaDocument_EntityNameDoesNotMatch_Failure() { var fullName = "Bill B Billson"; var accountNumber = "9999"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { ByOrgNbr = 2, FirstName = "Pete", MiddleInitial = "P", LastName = "Peterson", IsPrimaryOwner = true } }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.AreEqual("2", resultPayload.OrganizationNumbers?[0]); Assert.IsEmpty(resultPayload.PersonNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task DetermineAccountOwnerAttributeForDnaDocument_OwnerOverridePerson_Success() { var fullName = "Bill B Billson"; var accountNumber = "9999"; var documentProcessingInfoId = 123; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; var ownerOverrideRequest = new OwnerOverrideInfo() { DocumentProcessingInfoId = documentProcessingInfoId, EntityId = "888888", EntityType = EntityTypes.Person, UserName = "Test Tester" }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(fullName, accountNumber, creationDate, ownerOverrideRequest); var resultPayload = result.Payload; Assert.AreEqual("888888", resultPayload.PersonNumbers?[0]); Assert.IsEmpty(resultPayload.OrganizationNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByPersonName(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByOrganizationName(It.IsAny()), Times.Never); } [Test] public async Task DetermineAccountOwnerAttributeForDnaDocument_OwnerOverrideOrganization_Success() { var fullName = "Bill B Billson"; var accountNumber = "9999"; var documentProcessingInfoId = 123; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { ByOrgNbr = 1, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; var ownerOverrideRequest = new OwnerOverrideInfo() { DocumentProcessingInfoId = documentProcessingInfoId, EntityId = "888888", EntityType = EntityTypes.Organization, UserName = "Test Tester" }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(fullName, accountNumber, creationDate, ownerOverrideRequest); var resultPayload = result.Payload; Assert.AreEqual("888888", resultPayload.OrganizationNumbers?[0]); Assert.IsEmpty(resultPayload.PersonNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByPersonName(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByOrganizationName(It.IsAny()), Times.Never); } [Test] public async Task DetermineAccountOwnerAttributeForDnaDocument_OwnerOverrideUnknown_Success() { var fullName = "Bill B Billson"; var accountNumber = "9999"; var documentProcessingInfoId = 123; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; var ownerOverrideRequest = new OwnerOverrideInfo() { DocumentProcessingInfoId = documentProcessingInfoId, EntityId = "888888", EntityType = EntityTypes.Unknown, UserName = "Test Tester" }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttribute(fullName, accountNumber, creationDate, ownerOverrideRequest); var resultPayload = result.Payload; Assert.AreEqual("1", resultPayload.PersonNumbers?[0]); Assert.IsEmpty(resultPayload.OrganizationNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByPersonName(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByOrganizationName(It.IsAny()), Times.Never); } [Test] public async Task DetermineAccountOwnerAttributeByMemberNumberOrUserId_StartsWithM_PersonNumberFound_Success() { var memberNumberOrUserId = "M1234"; var accountNumber = "9999"; var docType = "MTG_NT_110_01"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1234, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; var personOrganization = new PersonOrganization() { PersonNumber = "1234", OrganizationNumber = null }; var agreementAccount = new AgreementAccount() { AccountNumber = 9999, AccountDescription = "PREMIUM CHECKING", MajorAccountTypeCode = "CK", TaxReportForPersonNumber = 1234, TaxReportForOrgNumber = null, OvrDeliveryMethCD = "PRNT", AccountOwner = new AgreementAccountOwner { AccountNumber = 9999, AgreementNumber = 0, UserId = null, PersonNumber = 0 } }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); _mockCoreApiWrapperService.Setup(x => x.GetAgreementAccountByAccountId(It.IsAny())).ReturnsAsync(agreementAccount); _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.IsTrue(result.Success); Assert.AreEqual("1234", resultPayload.PersonNumbers?[0]); Assert.IsEmpty(resultPayload.OrganizationNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetAgreementAccountByAccountId(It.IsAny()), Times.Once); } [Test] public async Task DetermineAccountOwnerAttributeByMemberNumberOrUserId_StartsWithoutM_PersonNumberFound_Success() { var memberNumberOrUserId = "1234"; var accountNumber = "9999"; var docType = "OPS_NT_119_01"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1234, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; var personOrganization = new PersonOrganization() { PersonNumber = "1234", OrganizationNumber = null }; var agreementAccount = new AgreementAccount() { AccountNumber = 9999, AccountDescription = "PREMIUM CHECKING", MajorAccountTypeCode = "CK", TaxReportForPersonNumber = 1234, TaxReportForOrgNumber = null, OvrDeliveryMethCD = "PRNT", AccountOwner = new AgreementAccountOwner { AccountNumber = 9999, AgreementNumber = 0, UserId = null, PersonNumber = 0 } }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); _mockCoreApiWrapperService.Setup(x => x.GetAgreementAccountByAccountId(It.IsAny())).ReturnsAsync(agreementAccount); _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.IsTrue(result.Success); Assert.AreEqual("1234", resultPayload.PersonNumbers?[0]); Assert.IsEmpty(resultPayload.OrganizationNumbers); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetAgreementAccountByAccountId(It.IsAny()), Times.Once); } [Test] public async Task DetermineAccountOwnerAttributeByMemberNumberOrUserId_PersonNumberNotFound_OrganizationNotFound_Failure() { var memberNumberOrUserId = "M1234"; var accountNumber = "9999"; var docType = "OPS_NT_119_01"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; var personOrganization = new PersonOrganization() { PersonNumber = null, OrganizationNumber = null }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DetermineAccountOwnerAttributeByMemberNumberOrUserId_AgreementNotFound_Failure() { var memberNumberOrUserId = "1234"; var accountNumber = "9999"; var docType = "MTG_NT_110_01"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); Assert.IsFalse(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementAccountByAccountId(It.IsAny()), Times.Never); } [Test] public async Task DetermineAccountOwnerAttributeByMemberNumberOrUserId_PersonNumberDoesNotMatch_Failure() { var memberNumberOrUserId = "M1234"; var accountNumber = "9999"; var docType = "OPS_NT_119_01"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true } }; var personOrganization = new PersonOrganization() { PersonNumber = "2", OrganizationNumber = null }; var agreementAccount = new AgreementAccount() { AccountNumber = 9999, AccountDescription = "PREMIUM CHECKING", MajorAccountTypeCode = "CK", TaxReportForPersonNumber = 1234, TaxReportForOrgNumber = null, OvrDeliveryMethCD = "PRNT", AccountOwner = new AgreementAccountOwner { AccountNumber = 9999, AgreementNumber = 0, UserId = null, PersonNumber = 0 } }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); _mockCoreApiWrapperService.Setup(x => x.GetAgreementAccountByAccountId(It.IsAny())).ReturnsAsync(agreementAccount); _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); Assert.IsFalse(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetAgreementAccountByAccountId(It.IsAny()), Times.Once); } [Test] public async Task DetermineAccountOwnerAttributeByMemberNumberOrUserId_OrganizationNumberDoesNotMatch_Failure() { var memberNumberOrUserId = "M1234"; var accountNumber = "9999"; var docType = "OPS_NT_119_01"; var creationDate = new DateTime(2022, 01, 01); var accountOwnership = new List { new() { PersonNumber = 1, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = true, ByOrgNbr = 123 } }; var personOrganization = new PersonOrganization() { PersonNumber = null, OrganizationNumber = "456" }; var agreementAccount = new AgreementAccount() { AccountNumber = 9999, AccountDescription = "PREMIUM CHECKING", MajorAccountTypeCode = "CK", TaxReportForPersonNumber = null, TaxReportForOrgNumber = 123, OvrDeliveryMethCD = "PRNT", AccountOwner = new AgreementAccountOwner { AccountNumber = 9999, AgreementNumber = 0, UserId = null, PersonNumber = 0 } }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); _mockCoreApiWrapperService.Setup(x => x.GetAgreementAccountByAccountId(It.IsAny())).ReturnsAsync(agreementAccount); _mockCoreApiWrapperService.Setup(x => x.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _accountOwnerDeterminingService.DetermineAccountOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); Assert.IsFalse(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementAccountByAccountId(It.IsAny()), Times.Once); } }