using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Threading.Tasks; using LCU.API.Internal.Operations.IncentiveApiLib.Repositories; using LCU.API.Internal.Operations.IncentiveApi.Services; using CsvHelper; using CsvHelper.Configuration; using LCU.Library.Internal.IncentiveApiModels.Entities; using LCU.Library.Internal.IncentiveApiModels.Enums; using LCU.Library.Internal.Exceptions; using LCU.Library.Internal.IncentiveApiModels.Requests; using Moq; using NUnit.Framework; using LCU.API.Internal.Operations.IncentiveApi.Services.MicroApiServices; using LCU.API.Internal.Operations.IncentiveApi.Services.Temenos; using LCU.API.Internal.Operations.IncentiveApi.Models.Temenos; using LCU.API.Internal.Operations.IncentiveApi.Models.Constants; using LCU.Library.Internal.FileOperationsModels.Models; namespace Application.UnitTests.Services.Temenos { public class ImportCreditCardSalesServiceTest { private ImportCreditCardSalesService _importCreditCardSalesService; private Mock _mockUserRepository; private Mock _mockActivityService; private Mock _mockFileOperationsApiService; private Mock _mockDeadActivityService; [SetUp] public void Setup() { _mockUserRepository = new Mock(); _mockActivityService = new Mock(); _mockFileOperationsApiService = new Mock(); _mockDeadActivityService = new Mock(); _importCreditCardSalesService = new ImportCreditCardSalesService(_mockActivityService.Object, _mockUserRepository.Object, _mockFileOperationsApiService.Object, _mockDeadActivityService.Object); } [Test] public async Task HandleImportCreditCardSales_BusinessPersonalAndDeadActivities_OK() { string fileContents = GetFileContent(); var fileResponse = new string[] { "filename" }; _mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny())).ReturnsAsync(fileResponse); _mockFileOperationsApiService.Setup(x => x.GetFileContent(It.IsAny())).ReturnsAsync(fileContents); AppUser user = GetAppUser(); _mockUserRepository.Setup(x => x.FindUserByAdEmailAsync(It.IsAny())).ReturnsAsync(user); _mockActivityService.Setup(x => x.SaveActivityRangeAsync(It.IsAny>())); _mockDeadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny>())); var request = new ImportCreditCardSalesRequest() { FilePath = "path", DynamicFileName = "filename" }; await _importCreditCardSalesService.HandleImportCreditCardSales(request); _mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny()), Times.Once); _mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny()), Times.Once); _mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny()), Times.Exactly(3)); _mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny>()), Times.Once); _mockDeadActivityService.Verify(x => x.SaveDeadActivityRange(It.IsAny>()), Times.Once); } [Test] public async Task HandleImportCreditCardSales_UserRepositoryFails_ActivitesSavedAsDead() { string fileContents = GetFileContent(); var fileResponse = new string[] { "filename" }; _mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny())).ReturnsAsync(fileResponse); _mockFileOperationsApiService.Setup(x => x.GetFileContent(It.IsAny())).ReturnsAsync(fileContents); _mockUserRepository.Setup(x => x.FindUserByAdEmailAsync(It.IsAny())).ThrowsAsync(new Exception("Failure")); _mockDeadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny>())); var request = new ImportCreditCardSalesRequest() { FilePath = "path", DynamicFileName = "filename" }; await _importCreditCardSalesService.HandleImportCreditCardSales(request); _mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny()), Times.Once); _mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny()), Times.Once); _mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny()), Times.Exactly(3)); _mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny>()), Times.Never); _mockDeadActivityService.Verify(x => x.SaveDeadActivityRange(It.IsAny>()), Times.Once); } [Test] public async Task HandleImportCreditCardSales_UserHomeDeptIsNull_ActivitesSavedAsDead() { string fileContents = GetFileContent(); var fileResponse = new string[] { "filename" }; _mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny())).ReturnsAsync(fileResponse); _mockFileOperationsApiService.Setup(x => x.GetFileContent(It.IsAny())).ReturnsAsync(fileContents); AppUser user = GetAppUser(false); _mockUserRepository.Setup(x => x.FindUserByAdEmailAsync(It.IsAny())).ReturnsAsync(user); _mockDeadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny>())); var request = new ImportCreditCardSalesRequest() { FilePath = "path", DynamicFileName = "filename" }; await _importCreditCardSalesService.HandleImportCreditCardSales(request); _mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny()), Times.Once); _mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny()), Times.Once); _mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny()), Times.Exactly(3)); _mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny>()), Times.Never); _mockDeadActivityService.Verify(x => x.SaveDeadActivityRange(It.IsAny>()), Times.Once); } [Test] public async Task HandleImportCreditCardSales_DeadActivityServiceFails_OtherActivitiesSave() { string fileContents = GetFileContent(); var fileResponse = new string[] { "filename" }; _mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny())).ReturnsAsync(fileResponse); _mockFileOperationsApiService.Setup(x => x.GetFileContent(It.IsAny())).ReturnsAsync(fileContents); AppUser user = GetAppUser(); _mockUserRepository.Setup(x => x.FindUserByAdEmailAsync(It.IsAny())).ReturnsAsync(user); _mockActivityService.Setup(x => x.SaveActivityRangeAsync(It.IsAny>())); _mockDeadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny>())).ThrowsAsync(new Exception("Failure")); var request = new ImportCreditCardSalesRequest() { FilePath = "path", DynamicFileName = "filename" }; await _importCreditCardSalesService.HandleImportCreditCardSales(request); _mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny()), Times.Once); _mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny()), Times.Once); _mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny()), Times.Exactly(3)); _mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny>()), Times.Once); _mockDeadActivityService.Verify(x => x.SaveDeadActivityRange(It.IsAny>()), Times.Once); } [Test] public void HandleImportCreditCardSales_FileOperationsFindFilesFails_ExceptionThrown() { string fileContents = GetFileContent(); var fileResponse = new string[] { "filename" }; _mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny())).ThrowsAsync(new Exception("Failure")); var request = new ImportCreditCardSalesRequest() { FilePath = "path", DynamicFileName = "filename" }; Assert.ThrowsAsync(() => _importCreditCardSalesService.HandleImportCreditCardSales(request)); _mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny()), Times.Once); _mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny()), Times.Never); _mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny()), Times.Never); _mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny>()), Times.Never); } [Test] public void HandleImportCreditCardSales_FileOperationsGetFileContentFails_ExceptionThrown() { string fileContents = GetFileContent(); var fileResponse = new string[] { "filename" }; _mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny())).ReturnsAsync(fileResponse); _mockFileOperationsApiService.Setup(x => x.GetFileContent("path\\filename")).ThrowsAsync(new Exception("Failure")); var request = new ImportCreditCardSalesRequest() { FilePath = "path", DynamicFileName = "filename" }; Assert.ThrowsAsync(() => _importCreditCardSalesService.HandleImportCreditCardSales(request)); _mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny()), Times.Once); _mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny()), Times.Once); _mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny()), Times.Never); _mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny>()), Times.Never); } private static AppUser GetAppUser(bool assignHomeDepartment = true) { var department = new Department { DepartmentName = "Dept1", Id = 55, State = DepartmentState.Active }; var user = new AppUser { AdEmail = "johndoe@test.com", EmployeeId = "11771", FullName = "John Doe", Departments = new List() }; var assignment = new UserDepartment { Id = 99, Department = department, Employee = user, Role = Role.BM, IsHome = true, StartDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1), EndDate = null }; if (assignHomeDepartment) { user.Departments.Add(assignment); } return user; } private static string GetFileContent() { var fileContent = new List() { new() { ApplicationID = "123", SubProduct = TemenosImportConstants.PersonalCardSubProduct, FinalLoanAmount = "$1000.00", DisbursedDate = DateTime.Now.AddDays(-1).ToString("MM/dd/yyyy"), ApplicantFirstName = "FName", ApplicantLastName = "LName", OrganizationName = string.Empty, LOResponsibleEmployeeEmail = string.Empty, LODirectLoanOfficer = string.Empty, ReferringEmployeeEmail = "tester@mail.com", }, new() { ApplicationID = "456", SubProduct = TemenosImportConstants.PersonalCardSubProduct, FinalLoanAmount = "$1000.00", DisbursedDate = DateTime.Now.AddDays(-1).ToString("MM/dd/yyyy"), ApplicantFirstName = "FName", ApplicantLastName = "LName", OrganizationName = string.Empty, LOResponsibleEmployeeEmail = string.Empty, LODirectLoanOfficer = "LastName, FirstName", ReferringEmployeeEmail = string.Empty, }, new() { ApplicationID = "789", SubProduct = "BusinessCard", FinalLoanAmount = "$1000.00", DisbursedDate = DateTime.Now.AddDays(-1).ToString("MM/dd/yyyy"), ApplicantFirstName = string.Empty, ApplicantLastName = string.Empty, OrganizationName = "Business Name", LOResponsibleEmployeeEmail = "tester@mail.com", LODirectLoanOfficer = string.Empty, ReferringEmployeeEmail = string.Empty, }, new() { ApplicationID = "987", SubProduct = "BusinessCard", FinalLoanAmount = "$1000.00", DisbursedDate = DateTime.Now.AddDays(-1).ToString("MM/dd/yyyy"), ApplicantFirstName = "Dead", ApplicantLastName = "Activity", OrganizationName = string.Empty, LOResponsibleEmployeeEmail = string.Empty, LODirectLoanOfficer = string.Empty, ReferringEmployeeEmail = string.Empty, }, new() { ApplicationID = "654", SubProduct = string.Empty, FinalLoanAmount = "$1000.00", DisbursedDate = DateTime.Now.AddDays(-1).ToString("MM/dd/yyyy"), ApplicantFirstName = "Record", ApplicantLastName = "Ignored", OrganizationName = string.Empty, LOResponsibleEmployeeEmail = string.Empty, LODirectLoanOfficer = string.Empty, ReferringEmployeeEmail = string.Empty, } }; var writer = new StringWriter(); var config = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = "|", HasHeaderRecord = false }; using (var csv = new CsvWriter(writer, config)) { csv.WriteRecords(fileContent); } return writer.ToString(); } } }