using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; 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.CoreApiWrapperModel.CoreModels.Tax; using LCU.Library.Internal.DocumentIngestorModels.Entities; using LCU.Library.Internal.DocumentIngestorModels.Enums; using LCU.Library.Internal.Exceptions; using Moq; using NUnit.Framework; namespace LCU.API.Internal.DocumentIngestorTests.Services.AttributeDeterminingServices; public class PrimaryOwnerDeterminingServiceTest { private PrimaryOwnerDeterminingService _primaryOwnerDeterminingService; private Mock _mockCoreApiWrapperService; [SetUp] public void Setup() { _mockCoreApiWrapperService = new Mock(); _primaryOwnerDeterminingService = new PrimaryOwnerDeterminingService(_mockCoreApiWrapperService.Object); } [Test] public async Task DeterminePrimaryOwnerAttribute_PersonNumberFound_Success() { var taxId = "123245"; var fullName = "Tester Unit"; var accountNumber = "9999"; var personsTaxIdData = new List { new() { PersonNumber = 1, NameLastFirstMiddleSuffix = fullName, } }; _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, taxId, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("1", resultPayload.PersonNumber); Assert.IsNull(resultPayload.OrganizationNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonsTaxIdData(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOrganizationsTaxIdData(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttribute_PersonNumberNotFound_OrganizationFound_Success() { var taxId = "123245"; var fullName = "Tester UnitOrg"; var accountNumber = "9999"; var personsTaxIdData = new List(); _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); var organizationTaxIdData = new List { new() { OrganizationNumber = 2, Name = fullName } }; _mockCoreApiWrapperService.Setup(x => x.GetOrganizationsTaxIdData(taxId)).ReturnsAsync(organizationTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, taxId, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("2", resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonsTaxIdData(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOrganizationsTaxIdData(It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttribute_PersonNumberNotFound_OrganizationNotFound_Failure() { var taxId = "123245"; var fullName = "Tester UnitOrg"; var accountNumber = "9999"; var personsTaxIdData = new List(); _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); var organizationTaxIdData = new List(); _mockCoreApiWrapperService.Setup(x => x.GetOrganizationsTaxIdData(taxId)).ReturnsAsync(organizationTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, taxId, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonsTaxIdData(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOrganizationsTaxIdData(It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttribute_PersonNumberNotFound_FullNameNoMatch_Failure() { var taxId = "123245"; var fullName = "Tester Unit"; var accountNumber = "9999"; var personsTaxIdData = new List { new() { PersonNumber = 1, NameLastFirstMiddleSuffix = "Tester Unit Nope", } }; _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); var organizationTaxIdData = new List(); _mockCoreApiWrapperService.Setup(x => x.GetOrganizationsTaxIdData(taxId)).ReturnsAsync(organizationTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, taxId, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonsTaxIdData(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOrganizationsTaxIdData(It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttribute_PersonNumberNotFound_FullNameNoMatch_MessageContainsPersonTaxData() { const string taxId = nameof(taxId); var personNumbers = new Random(DateTime.Now.Millisecond); var personsTaxIdData = Enumerable.Repeat ( () => new PersonTaxIdDataResponse { PersonNumber = personNumbers.Next(), NameLastFirstMiddleSuffix = Guid.NewGuid().ToString(), FirstName = Guid.NewGuid().ToString(), MiddleName = Guid.NewGuid().ToString(), LastName = Guid.NewGuid().ToString() }, 5 ) .Select(f => f()) .ToArray(); _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); _mockCoreApiWrapperService.Setup(x => x.GetOrganizationsTaxIdData(taxId)).ReturnsAsync(Enumerable.Empty()); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), taxId, null!); var message = result.Message; Assert.IsNotNull(message); var personMessages = message!.Split("Person Detail:"); foreach (var person in personsTaxIdData) { var personsMessages = personMessages .Where(o => o.Contains(person.PersonNumber.ToString())) .ToArray(); Assert.AreEqual(1, personsMessages.Length); var personMessage = personsMessages.Single(); StringAssert.Contains(person.FirstName, personMessage); StringAssert.Contains(person.MiddleName, personMessage); StringAssert.Contains(person.LastName, personMessage); if (Array.IndexOf(personMessages, personMessage) != personMessages.Length - 1) { StringAssert.EndsWith(" ", personMessage); } } } [Test] public async Task DeterminePrimaryOwnerAttribute_OrganizationNotFound_FullNameNoMatch_Failure() { var taxId = "123245"; var fullName = "Tester UnitOrg"; var accountNumber = "9999"; var personsTaxIdData = new List(); _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); var organizationTaxIdData = new List { new() { OrganizationNumber = 2, Name = "Tester UnitOrg Nope" } }; _mockCoreApiWrapperService.Setup(x => x.GetOrganizationsTaxIdData(taxId)).ReturnsAsync(organizationTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, taxId, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonsTaxIdData(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetOrganizationsTaxIdData(It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttribute_OrganizationNotFound_FullNameNoMatch_MessageContainsOrganziationTaxData() { const string taxId = nameof(taxId); var organizationNumbers = new Random(DateTime.Now.Millisecond); var organizationTaxIdData = Enumerable.Repeat ( () => new OrganizationTaxIdDataResponse { OrganizationNumber = organizationNumbers.Next(), Name = Guid.NewGuid().ToString() }, 5 ) .Select(f => f()) .ToArray(); _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(Enumerable.Empty()); _mockCoreApiWrapperService.Setup(x => x.GetOrganizationsTaxIdData(taxId)).ReturnsAsync(organizationTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), taxId, null!); var message = result.Message; Assert.IsNotNull(message); var organizationMessages = message!.Split("Organization Detail:"); foreach (var organization in organizationTaxIdData) { var organizationsMessages = organizationMessages .Where(o => o.Contains(organization.Name)) .ToArray(); Assert.AreEqual(1, organizationsMessages.Length); var organizationMessage = organizationsMessages.Single(); StringAssert.Contains(organization.OrganizationNumber.ToString(), organizationMessage); if (Array.IndexOf(organizationMessages, organizationMessage) != organizationMessages.Length - 1) { StringAssert.EndsWith(" ", organizationMessage); } } } [Test] public async Task DeterminePrimaryOwnerAttribute_PersonFound_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 _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("1", resultPayload.PersonNumber); Assert.IsNull(resultPayload.OrganizationNumber); Assert.AreEqual(accountNumber, 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 DeterminePrimaryOwnerAttribute_PersonNumberNotFound_OrganizationNumberFound_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 _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(orgName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("2", resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttribute_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 _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttribute_PersonNumberNotFound_OrganizationNumberNotFound_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 _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttribute_TooManyOwners_Failure() { var fullName = "Bill B Billson"; var accountNumber = Guid.NewGuid().ToString(); 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.GetOwnersByAccountNumber(accountNumber, creationDate.ToShortDateString())).ReturnsAsync(accountOwnership); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsNull(result.EntityIsUnknown); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.IsNotNull(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 DeterminePrimaryOwnerAttribute_NoPrimaryOwner_Failure() { var fullName = "Bill B Billson"; var creationDate = new DateTime(2022, 01, 01); var accountNumber = "5"; var accountOwnership = new List { new() { PersonNumber = 2, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", IsPrimaryOwner = false } }; _mockCoreApiWrapperService.Setup(x => x.GetOwnersByPersonName(fullName)).ReturnsAsync(accountOwnership); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); 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 DeterminePrimaryOwnerAttribute_OwnerOverridePerson_Success() { var taxId = "123245"; var fullName = "Tester Unit"; var accountNumber = "9999"; var documentProcessingInfoId = 123; var personsTaxIdData = new List { new() { PersonNumber = 1, NameLastFirstMiddleSuffix = fullName, } }; var ownerOverride = new OwnerOverrideInfo() { DocumentProcessingInfoId = documentProcessingInfoId, UserName = "Test Tester", EntityId = "888888", EntityType = EntityTypes.Person }; _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, taxId, ownerOverride); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("888888", resultPayload.PersonNumber); Assert.IsNull(resultPayload.OrganizationNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonsTaxIdData(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOrganizationsTaxIdData(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttribute_OwnerOverrideOrganization_Success() { var taxId = "123245"; var fullName = "Tester Unit"; var documentProcessingInfoId = 123; var accountNumber = "9999"; var personsTaxIdData = new List { new() { OrganizationNumber = 1, Name = fullName, } }; var ownerOverride = new OwnerOverrideInfo() { DocumentProcessingInfoId = documentProcessingInfoId, UserName = "Test Tester", EntityId = "888888", EntityType = EntityTypes.Organization }; _mockCoreApiWrapperService.Setup(x => x.GetOrganizationsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, taxId, ownerOverride); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("888888", resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonsTaxIdData(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOrganizationsTaxIdData(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttribute_OwnerOverrideUnknown_Success() { var taxId = "123245"; var fullName = "Tester Unit"; var accountNumber = "9999"; var documentProcessingInfoId = 123; var personsTaxIdData = new List { new() { PersonNumber = 1, NameLastFirstMiddleSuffix = fullName, } }; var ownerOverride = new OwnerOverrideInfo() { DocumentProcessingInfoId = documentProcessingInfoId, UserName = "Test Tester", EntityId = "888888", EntityType = EntityTypes.Unknown }; _mockCoreApiWrapperService.Setup(x => x.GetPersonsTaxIdData(taxId)).ReturnsAsync(personsTaxIdData); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttribute(fullName, accountNumber, taxId, ownerOverride); var resultPayload = result.Payload; Assert.True(result.Success); Assert.IsNull(resultPayload.PersonNumber); Assert.IsNull(resultPayload.OrganizationNumber); Assert.AreEqual(accountNumber, resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonsTaxIdData(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetOrganizationsTaxIdData(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_PersonNumberFound_Success() { var memberNumberOrUserId = "M1234"; var accountNumber = "9999"; var docType = "LVI_LT_106_01"; var creationDate = new DateTime(2022, 01, 01); var personOrganization = new PersonOrganization() { PersonNumber = "1", OrganizationNumber = null }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("1", resultPayload.PersonNumber); Assert.AreEqual(null, resultPayload.OrganizationNumber); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_OrganizationFound_Success() { var memberNumberOrUserId = "M1234"; var accountNumber = "9999"; var docType = "LVI_LT_106_01"; var creationDate = new DateTime(2022, 01, 01); var personOrganization = new PersonOrganization() { PersonNumber = null, OrganizationNumber = "123" }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual(null, resultPayload.PersonNumber); Assert.AreEqual("123", resultPayload.OrganizationNumber); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_AgreementFound_Success() { var memberNumberOrUserId = "1234"; var accountNumber = "9999"; var docType = "LVI_LT_106_01"; var creationDate = new DateTime(2022, 01, 01); var agreement = new Agreement() { AgreementNumber = 123, ByOrgNbr = 0, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", PersonNumber = 1234 }; _mockCoreApiWrapperService.Setup(x => x.GetAgreementByUserId(It.IsAny())).ReturnsAsync(agreement); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("1234", resultPayload.PersonNumber); Assert.AreEqual(null, resultPayload.OrganizationNumber); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetAgreementAccountByAccountId(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_AgreementMmStmxtFound_Success() { var memberNumberOrUserId = "1234"; var accountNumber = "9999"; var docType = "MM_STMXT"; var creationDate = new DateTime(2022, 01, 01); var agreement = new Agreement() { AgreementNumber = 123, ByOrgNbr = 0, FirstName = "Bill", MiddleInitial = "B", LastName = "Billson", PersonNumber = 1234 }; 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 } }; var personOrganization = new PersonOrganization() { PersonNumber = "1234", OrganizationNumber = null }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); _mockCoreApiWrapperService.Setup(x => x.GetAgreementAccountByAccountId(It.IsAny())).ReturnsAsync(agreementAccount); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual("1234", resultPayload.PersonNumber); Assert.AreEqual(null, resultPayload.OrganizationNumber); Assert.AreEqual("9999", resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetAgreementAccountByAccountId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_PersonNotFound_OrganizationNotFound_Failure() { var memberNumberOrUserId = "M1234"; var accountNumber = "9999"; var docType = "LVI_LT_106_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(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_AgreementNotFound_Failure() { var memberNumberOrUserId = "1234"; var accountNumber = "9999"; var docType = "LVI_LT_106_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 _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); var resultPayload = result.Payload; Assert.IsFalse(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_PersonNumberDoesNotMatch_MM_STMXT_Failure() { var memberNumberOrUserId = "M1234"; var accountNumber = "9999"; var docType = "MM_STMXT"; 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 = 5678, 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); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, accountNumber, docType, creationDate, null); Assert.IsFalse(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetOwnersByAccountNumber(It.IsAny(), It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_Success_Agreement() { var memberNumberOrUserId = Guid.NewGuid().ToString(); var agreement = new Agreement() { UserId = memberNumberOrUserId, AgreementNumber = 123, ByOrgNbr = 0, FirstName = Guid.NewGuid().ToString(), MiddleInitial = Guid.NewGuid().ToString(), LastName = Guid.NewGuid().ToString(), Suffix = Guid.NewGuid().ToString(), PersonNumber = 1234 }; var entityName = $"{agreement.FirstName} {agreement.MiddleInitial} {agreement.LastName} {agreement.Suffix}"; _mockCoreApiWrapperService.Setup(x => x.GetAgreementByUserId(It.IsAny())).ReturnsAsync(agreement).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, entityName, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual(agreement.PersonNumber.ToString(), resultPayload.PersonNumber); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_Success_Agreement_NoAgreement() { var memberNumberOrUserId = Guid.NewGuid().ToString(); var entityName = $"{Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()}"; Agreement nullAgreement = null; var personOrganization = new PersonOrganization() { PersonNumber = DateTime.Now.Millisecond.ToString(), OrganizationNumber = null, EntityName = entityName }; _mockCoreApiWrapperService.Setup(x => x.GetAgreementByUserId(It.IsAny())).ReturnsAsync(nullAgreement).Verifiable(); _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, entityName, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual(personOrganization.PersonNumber, resultPayload.PersonNumber); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_Success_PersonOrganization_PersonNumber() { var memberNumberOrUserId = $"M{Guid.NewGuid().ToString()}"; var entityName = $"{Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()}"; var personOrganization = new PersonOrganization() { PersonNumber = DateTime.Now.Millisecond.ToString(), OrganizationNumber = null, EntityName = entityName }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, entityName, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual(personOrganization.PersonNumber, resultPayload.PersonNumber); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_Success_PersonOrganization_OrganizationNumber() { var memberNumberOrUserId = $"M{Guid.NewGuid().ToString()}"; var entityName = $"{Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()}"; var personOrganization = new PersonOrganization { PersonNumber = null, OrganizationNumber = DateTime.Now.Millisecond.ToString(), EntityName = entityName }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, entityName, null); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual(personOrganization.OrganizationNumber, resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.IsNull(resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_Failure_PersonOrganization_IsNull() { var memberNumberOrUserId = $"M{Guid.NewGuid().ToString()}"; var entityName = $"{Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()}"; var personOrganization = new PersonOrganization { PersonNumber = null, OrganizationNumber = null, EntityName = entityName }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, entityName, null); var resultPayload = result.Payload; Assert.False(result.Success); Assert.IsNull(resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.IsNull(resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_Failure_PersonOrganization_EntityNameDoesNotMatch() { var memberNumberOrUserId = $"M{Guid.NewGuid().ToString()}"; var entityName = $"{Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()}"; var personOrganization = new PersonOrganization { PersonNumber = null, OrganizationNumber = DateTime.Now.Millisecond.ToString(), EntityName = Guid.NewGuid().ToString() }; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())).ReturnsAsync(personOrganization).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, entityName, null); Assert.False(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_Failure_PersonOrganization_Exception() { var memberNumberOrUserId = $"M{Guid.NewGuid().ToString()}"; var entityName = $"{Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()}"; _mockCoreApiWrapperService.Setup(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny())) .ThrowsAsync(new ServiceException("Test")).Verifiable(); var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, entityName, null); Assert.IsFalse(result.Success); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Once); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } [Test] public async Task DeterminePrimaryOwnerAttributeByMemberNumberOrUserId_Success_PersonOrganization_OwnerOverride() { var memberNumberOrUserId = $"M{Guid.NewGuid().ToString()}"; var entityName = $"{Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()} {Guid.NewGuid().ToString()}"; var documentProcessingInfo = new DocumentProcessingInfo() { DocumentProcessingInfoId = DateTime.Now.Millisecond }; var ownerOverrideInfo = new OwnerOverrideInfo() { DocumentProcessingInfoId = documentProcessingInfo.DocumentProcessingInfoId, EntityType = EntityTypes.Organization, EntityId = Guid.NewGuid().ToString(), UserName = Guid.NewGuid().ToString() }; var result = await _primaryOwnerDeterminingService.DeterminePrimaryOwnerAttributeByMemberNumberOrUserId(memberNumberOrUserId, entityName, ownerOverrideInfo); var resultPayload = result.Payload; Assert.True(result.Success); Assert.AreEqual(ownerOverrideInfo.EntityId, resultPayload.OrganizationNumber); Assert.IsNull(resultPayload.PersonNumber); Assert.IsNull(resultPayload.AccountNumber); _mockCoreApiWrapperService.Verify(x => x.GetPersonOrOrganizationNumberByMemberId(It.IsAny()), Times.Never); _mockCoreApiWrapperService.Verify(x => x.GetAgreementByUserId(It.IsAny()), Times.Never); } }