using LCU.Api.Internal.DataCleanUp.Configuration; using LCU.Api.Internal.DataCleanUp.DataAccess; using LCU.Api.Internal.DataCleanUp.Models.ParserModels; using LCU.Api.Internal.DataCleanUp.Services; using LCU.Api.Internal.DataCleanUp.Services.Emailers; using LCU.Api.Internal.DataCleanUp.Services.Validation; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.PostalAddresses; using Moq; using NUnit.Framework; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LCU.Api.Internal.DataCleanUpTest.Services; public class UpdateNcoaProcessServiceTest { private UpdateNcoaProcessService _updateNcoaProcessService; private Mock _mockCoreApiWrapperService; private Mock _mockFileOperationsService; private NcoaConfiguration _ncoaConfiguration; private DataCleanUpConfiguration _dataCleanUpConfiguration; private INcoaValidationService _ncoaValidationService; private Mock _mockEmailService; [SetUp] public void Setup() { _dataCleanUpConfiguration = new DataCleanUpConfiguration() { TimeZone = "America/Chicago" }; _ncoaConfiguration = new NcoaConfiguration() { PrimaryAddressLabel = "PRI", StreetTypeLabel = "ST", UrlBase = "/Persons/{personNumber}/PostalAddresses/PRI", UsaLabel = "USA", PoBoxLabel = "PO BOX", PoBoxAddressTypeLabel = "POBN", ErrorFileDefaultName = "NCOAErrorRecord", PersonNumberLabel = "{personNumber}" }; _ncoaValidationService = new NcoaValidationService(); _mockCoreApiWrapperService = new Mock(); _mockFileOperationsService = new Mock(); _mockEmailService = new Mock(); _updateNcoaProcessService = new UpdateNcoaProcessService(_mockCoreApiWrapperService.Object, _mockFileOperationsService.Object, _ncoaConfiguration, _dataCleanUpConfiguration, _ncoaValidationService, _mockEmailService.Object); } [Test] public async Task MapPersonAddressLine_NoPoBox() { //Arrange var ncoaRecord = new NcoaRecord() { UserId = "123456", NcoaType = "I", ChangeDate = "202212", PrimaryName = "Test E Testerson", CurrentAddressOne = "1 Imaginary Lane", CurrentAddressTwo = "Apt 13", CurrentAddressThree = "Additional Address Line", CurrentAddressFour = "ReallyLongCityName", CurrentAddressFive = "Wisconsin, 53186", SecondaryName = "Test Testerson", BusinessName = "Testerson's Testing", NewAddressLine = "New Address Line", City = "New Test City", StateCode = "WI", ZipCode = "53022", ZipSuffix = "-1234", UserIdTwo = "123456", StatementCode = "TestStatementCode" }; var currentAddress = new PersonPostalAddress() { AddressNumber = 456 }; //Act var result = _updateNcoaProcessService.MapPersonAddrLine(98765, currentAddress, ncoaRecord); //Assert Assert.AreEqual(98765, result.PersonNumber); Assert.AreEqual("PRI", result.Id); Assert.AreEqual("PRI", result.AddressUseCode); Assert.AreEqual(456, result.AddressNumber); Assert.AreEqual("New Address Line", result.AddressLine1); Assert.AreEqual("ST", result.AddressLineTypeCode1); Assert.Null(result.AddressLine2); Assert.Null(result.AddressLineTypeCode2); Assert.Null(result.AddressLine3); Assert.Null(result.AddressLineTypeCode3); Assert.AreEqual("New Test City", result.CityName); Assert.AreEqual("WI", result.CountrySubdivisionCode); Assert.AreEqual("53022", result.PostalCode); Assert.AreEqual("1234", result.ZipPlus); Assert.AreEqual("USA", result.CountryCode); Assert.AreEqual("/Persons/98765/PostalAddresses/PRI", result.Url); Assert.False(result.IsPerformIRSCorrection); } [Test] public async Task MapPersonAddressLine_PoBox() { //Arrange var ncoaRecord = new NcoaRecord() { UserId = "123456", NcoaType = "I", ChangeDate = "202212", PrimaryName = "Test E Testerson", CurrentAddressOne = "1 Imaginary Lane", CurrentAddressTwo = "Apt 13", CurrentAddressThree = "Additional Address Line", CurrentAddressFour = "ReallyLongCityName", CurrentAddressFive = "Wisconsin, 53186", SecondaryName = "Test Testerson", BusinessName = "Testerson's Testing", NewAddressLine = "New Address Line PO BOX Test", City = "New Test City", StateCode = "WI", ZipCode = "53022", ZipSuffix = "-1234", UserIdTwo = "123456", StatementCode = "TestStatementCode" }; var currentAddress = new PersonPostalAddress() { AddressNumber = 456 }; //Act var result = _updateNcoaProcessService.MapPersonAddrLine(98765, currentAddress, ncoaRecord); //Assert Assert.AreEqual(98765, result.PersonNumber); Assert.AreEqual("PRI", result.Id); Assert.AreEqual("PRI", result.AddressUseCode); Assert.AreEqual(456, result.AddressNumber); Assert.AreEqual("New Address Line PO BOX Test", result.AddressLine1); Assert.AreEqual("POBN", result.AddressLineTypeCode1); Assert.Null(result.AddressLine2); Assert.Null(result.AddressLineTypeCode2); Assert.Null(result.AddressLine3); Assert.Null(result.AddressLineTypeCode3); Assert.AreEqual("New Test City", result.CityName); Assert.AreEqual("WI", result.CountrySubdivisionCode); Assert.AreEqual("53022", result.PostalCode); Assert.AreEqual("1234", result.ZipPlus); Assert.AreEqual("USA", result.CountryCode); Assert.AreEqual("/Persons/98765/PostalAddresses/PRI", result.Url); Assert.False(result.IsPerformIRSCorrection); } [Test] public async Task CheckForBoBoxAddressLineType_NoPoBox() { //Arrange var personAddrLine = new PersonAddrLine() { AddressLine1 = "Negative Test", AddressLineTypeCode1 = "ST" }; //Act var result = _updateNcoaProcessService.CheckForPoBoxAddressLineType(personAddrLine); //Assert Assert.AreEqual("Negative Test", result.AddressLine1); Assert.AreEqual("ST", result.AddressLineTypeCode1); } [Test] public async Task CheckForBoBoxAddressLineType_PoBox() { //Arrange var personAddrLine = new PersonAddrLine() { AddressLine1 = "Positive Test PO BOX Something", AddressLineTypeCode1 = "ST" }; //Act var result = _updateNcoaProcessService.CheckForPoBoxAddressLineType(personAddrLine); //Assert Assert.AreEqual("Positive Test PO BOX Something", result.AddressLine1); Assert.AreEqual("POBN", result.AddressLineTypeCode1); } [Test] public async Task CreateErrorrecord_NoPersonNumber() { // Arrange var updateResult = new UpdateNcoaProcessService.NcoaUpdateResult(); var ncoaRecord = new NcoaRecord() { UserId = "123456", NcoaType = "I", ChangeDate = "202212", PrimaryName = "Test E Testerson", CurrentAddressOne = "1 Imaginary Lane", CurrentAddressTwo = "Apt 13", CurrentAddressThree = "Additional Address Line", CurrentAddressFour = "ReallyLongCityName", CurrentAddressFive = "Wisconsin, 53186", SecondaryName = "Test Testerson", BusinessName = "Testerson's Testing", NewAddressLine = "New Address Line PO BOX Test", City = "New Test City", StateCode = "WI", ZipCode = "53022", ZipSuffix = "1234", UserIdTwo = "123456", StatementCode = "TestStatementCode" }; var expectedErrorrecord = "202212|123456||Test E Testerson|1 Imaginary Lane|Apt 13|Additional Address Line|ReallyLongCityName|Wisconsin, 53186" + "|New Address Line PO BOX Test|New Test City|WI|53022|1234|This is a test error message\n"; //Act updateResult.AddStringToErrorList(ncoaRecord, "This is a test error message"); //Assert Assert.AreEqual(1, updateResult.ErrorList.Count); Assert.AreEqual(expectedErrorrecord, updateResult.ErrorList.FirstOrDefault()); } [Test] public async Task CreateErrorrecord_WithPersonNumber() { // Arrange var updateResult = new UpdateNcoaProcessService.NcoaUpdateResult(); var ncoaRecord = new NcoaRecord() { UserId = "123456", NcoaType = "I", ChangeDate = "202212", PrimaryName = "Test E Testerson", CurrentAddressOne = "1 Imaginary Lane", CurrentAddressTwo = "Apt 13", CurrentAddressThree = "Additional Address Line", CurrentAddressFour = "ReallyLongCityName", CurrentAddressFive = "Wisconsin, 53186", SecondaryName = "Test Testerson", BusinessName = "Testerson's Testing", NewAddressLine = "New Address Line PO BOX Test", City = "New Test City", StateCode = "WI", ZipCode = "53022", ZipSuffix = "1234", UserIdTwo = "123456", StatementCode = "TestStatementCode" }; var expectedErrorrecord = "202212|123456|11111|Test E Testerson|1 Imaginary Lane|Apt 13|Additional Address Line|ReallyLongCityName|Wisconsin, 53186" + "|New Address Line PO BOX Test|New Test City|WI|53022|1234|This is a test error message\n"; //Act updateResult.AddStringToErrorList(ncoaRecord, "This is a test error message", "11111"); //Assert Assert.AreEqual(1, updateResult.ErrorList.Count); Assert.AreEqual(expectedErrorrecord, updateResult.ErrorList.FirstOrDefault()); } [Test] public async Task ConvertToTitleCase_FromLower() { //Arrange var textToChange = "milwaukee"; //Act var result = _updateNcoaProcessService.ConvertToTitleCase(textToChange); //Assert Assert.AreEqual("Milwaukee", result); } [Test] public async Task ConvertToTitleCase_TwoWordCity() { //Arrange var textToChange = "menomonee falls"; //Act var result = _updateNcoaProcessService.ConvertToTitleCase(textToChange); //Assert Assert.AreEqual("Menomonee Falls", result); } [Test] public async Task BuildTotalBatchSummary_Ok_OneResult() { // Arrange var updateResults = new List(); var resultOne = new UpdateNcoaProcessService.NcoaUpdateResult(); var errorListOne = new List() { "errorOne", "errorTwo", "ErrorThree" }; var persAddrLineList = new List(); var persAddrLineOne = new PersonAddrLine() { AddressLine1 = "1234 Some Address", AddressLineTypeCode1 = "ST" }; var persAddrLineTwo = new PersonAddrLine() { AddressLine1 = "5678 Some Address", AddressLineTypeCode1 = "ST" }; persAddrLineList.Add(persAddrLineOne); persAddrLineList.Add(persAddrLineTwo); resultOne.ErrorList = errorListOne; resultOne.UpdateList = persAddrLineList; resultOne.TotalRecordsFound = 5; updateResults.Add(resultOne); // Act var result = _updateNcoaProcessService.BuildTotalBatchSummary(updateResults, true); // Assert Assert.AreEqual(5, result.TotalRecordsFound); Assert.AreEqual(3, result.TotalErrorRecords); Assert.AreEqual(2, result.TotalRecordsUpdated); Assert.True(result.ErrorFileCreated); } [Test] public async Task BuildTotalBatchSummary_Ok_MultipleResults() { // Arrange var updateResults = new List(); var resultOne = new UpdateNcoaProcessService.NcoaUpdateResult(); var errorListOne = new List() { "errorOne", "errorTwo", "ErrorThree" }; var persAddrLineListOne = new List(); var persAddrLineOne = new PersonAddrLine() { AddressLine1 = "1234 Some Address", AddressLineTypeCode1 = "ST" }; var persAddrLineTwo = new PersonAddrLine() { AddressLine1 = "5678 Some Address", AddressLineTypeCode1 = "ST" }; persAddrLineListOne.Add(persAddrLineOne); persAddrLineListOne.Add(persAddrLineTwo); resultOne.ErrorList = errorListOne; resultOne.UpdateList = persAddrLineListOne; resultOne.TotalRecordsFound = 5; var resultTwo = new UpdateNcoaProcessService.NcoaUpdateResult(); var errorListTwo = new List() { "errorOne", "errorTwo", }; var persAddrLineThree = new PersonAddrLine() { AddressLine1 = "Updated Address", AddressLineTypeCode1 = "ST" }; var persAddrLineListTwo = new List(); persAddrLineListTwo.Add(persAddrLineThree); resultTwo.ErrorList = errorListTwo; resultTwo.UpdateList = persAddrLineListTwo; resultTwo.TotalRecordsFound = 3; updateResults.Add(resultOne); updateResults.Add(resultTwo); // Act var result = _updateNcoaProcessService.BuildTotalBatchSummary(updateResults, false); // Assert Assert.AreEqual(8, result.TotalRecordsFound); Assert.AreEqual(5, result.TotalErrorRecords); Assert.AreEqual(3, result.TotalRecordsUpdated); Assert.False(result.ErrorFileCreated); } [Test] public async Task BuildTotalBatchSummary_Ok_NoResults() { // Arrange var updateResults = new List(); // Act var result = _updateNcoaProcessService.BuildTotalBatchSummary(updateResults, false); // Assert Assert.AreEqual(0, result.TotalRecordsFound); Assert.AreEqual(0, result.TotalErrorRecords); Assert.AreEqual(0, result.TotalRecordsUpdated); Assert.False(result.ErrorFileCreated); } [Test] public async Task CreateTotalBatchSummaryString_OneResult_WithLocation() { // Arrange var updateResults = new List(); var resultOne = new UpdateNcoaProcessService.NcoaUpdateResult(); var errorListOne = new List() { "errorOne", "errorTwo", "ErrorThree" }; var persAddrLineList = new List(); var persAddrLineOne = new PersonAddrLine() { AddressLine1 = "1234 Some Address", AddressLineTypeCode1 = "ST" }; var persAddrLineTwo = new PersonAddrLine() { AddressLine1 = "5678 Some Address", AddressLineTypeCode1 = "ST" }; persAddrLineList.Add(persAddrLineOne); persAddrLineList.Add(persAddrLineTwo); resultOne.ErrorList = errorListOne; resultOne.UpdateList = persAddrLineList; resultOne.TotalRecordsFound = 5; updateResults.Add(resultOne); var batchSummary = new UpdateNcoaProcessService.NcoaTotalBatchSummary(updateResults, true); batchSummary.TotalRecordsFound = 5; batchSummary.TotalErrorRecords = 3; batchSummary.TotalRecordsUpdated = 2; var expectedResult = $"NCOA Update Total Batch Summary:

Total Files in Batch: 1

Total Records Received: " + $"5

Total Records Updated: 2

Total Error Records: " + $"3

Total Records Processed: 5

" + $"Error File Created: True

Error File Location: Test Location

"; // Act var result = _updateNcoaProcessService.CreateTotalBatchSummaryString(batchSummary, "Test Location"); // Assert Assert.AreEqual(expectedResult, result); } [Test] public async Task CreateTotalBatchSummaryString_TwoResults_NoLocation() { // Arrange var updateResults = new List(); var resultOne = new UpdateNcoaProcessService.NcoaUpdateResult(); var errorListOne = new List() { "errorOne", "errorTwo", "ErrorThree" }; var persAddrLineList = new List(); var persAddrLineOne = new PersonAddrLine() { AddressLine1 = "1234 Some Address", AddressLineTypeCode1 = "ST" }; var persAddrLineTwo = new PersonAddrLine() { AddressLine1 = "5678 Some Address", AddressLineTypeCode1 = "ST" }; persAddrLineList.Add(persAddrLineOne); persAddrLineList.Add(persAddrLineTwo); var resultTwo = new UpdateNcoaProcessService.NcoaUpdateResult(); var errorListTwo = new List() { "errorOne", "errorTwo", }; var persAddrLineThree = new PersonAddrLine() { AddressLine1 = "Updated Address", AddressLineTypeCode1 = "ST" }; var persAddrLineListTwo = new List(); persAddrLineListTwo.Add(persAddrLineThree); resultTwo.ErrorList = errorListTwo; resultTwo.UpdateList = persAddrLineListTwo; resultTwo.TotalRecordsFound = 3; resultOne.ErrorList = errorListOne; resultOne.UpdateList = persAddrLineList; resultOne.TotalRecordsFound = 5; updateResults.Add(resultOne); updateResults.Add(resultTwo); var batchSummary = new UpdateNcoaProcessService.NcoaTotalBatchSummary(updateResults, false); batchSummary.TotalRecordsFound = 8; batchSummary.TotalErrorRecords = 5; batchSummary.TotalRecordsUpdated = 3; var expectedResult = $"NCOA Update Total Batch Summary:

Total Files in Batch: 2

Total Records Received: " + $"8

Total Records Updated: 3

Total Error Records: " + $"5

Total Records Processed: 8

" + $"Error File Created: False

"; // Act var result = _updateNcoaProcessService.CreateTotalBatchSummaryString(batchSummary, "Test Location"); // Assert Assert.AreEqual(expectedResult, result); } [Test] public async Task BuildFileUpdateSummary() { // Arrange var updateResult = new UpdateNcoaProcessService.NcoaUpdateResult("Test File Name"); var errorListOne = new List() { "errorOne", "errorTwo", "ErrorThree" }; var persAddrLineList = new List(); var persAddrLineOne = new PersonAddrLine() { AddressLine1 = "1234 Some Address", AddressLineTypeCode1 = "ST" }; var persAddrLineTwo = new PersonAddrLine() { AddressLine1 = "5678 Some Address", AddressLineTypeCode1 = "ST" }; persAddrLineList.Add(persAddrLineOne); persAddrLineList.Add(persAddrLineTwo); updateResult.ErrorList = errorListOne; updateResult.UpdateList = persAddrLineList; updateResult.TotalRecordsFound = 5; var expectedResult = $"--------------

NCOA File In Batch Summary:

Filename: Test File Name" + $"

Total Records Received: 5

Total Records Updated: 2" + $"

Total Error Records: 3

Total Records Processed: " + $"5

"; // Act var result = _updateNcoaProcessService.BuildFileUpdateSummary(updateResult); // Assert Assert.AreEqual(expectedResult, result); } }