Files
2026-03-17 09:53:09 -05:00

324 lines
15 KiB
C#

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<IUserRepository> _mockUserRepository;
private Mock<IActivityService> _mockActivityService;
private Mock<IFileOperationsApiService> _mockFileOperationsApiService;
private Mock<IDeadActivityService> _mockDeadActivityService;
[SetUp]
public void Setup()
{
_mockUserRepository = new Mock<IUserRepository>();
_mockActivityService = new Mock<IActivityService>();
_mockFileOperationsApiService = new Mock<IFileOperationsApiService>();
_mockDeadActivityService = new Mock<IDeadActivityService>();
_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<DynamicFileListRequest>())).ReturnsAsync(fileResponse);
_mockFileOperationsApiService.Setup(x => x.GetFileContent(It.IsAny<string>())).ReturnsAsync(fileContents);
AppUser user = GetAppUser();
_mockUserRepository.Setup(x => x.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
_mockActivityService.Setup(x => x.SaveActivityRangeAsync(It.IsAny<List<Activity>>()));
_mockDeadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>()));
var request = new ImportCreditCardSalesRequest()
{
FilePath = "path",
DynamicFileName = "filename"
};
await _importCreditCardSalesService.HandleImportCreditCardSales(request);
_mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Once);
_mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny<string>()), Times.Exactly(3));
_mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny<List<Activity>>()), Times.Once);
_mockDeadActivityService.Verify(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>()), Times.Once);
}
[Test]
public async Task HandleImportCreditCardSales_UserRepositoryFails_ActivitesSavedAsDead()
{
string fileContents = GetFileContent();
var fileResponse = new string[] { "filename" };
_mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>())).ReturnsAsync(fileResponse);
_mockFileOperationsApiService.Setup(x => x.GetFileContent(It.IsAny<string>())).ReturnsAsync(fileContents);
_mockUserRepository.Setup(x => x.FindUserByAdEmailAsync(It.IsAny<string>())).ThrowsAsync(new Exception("Failure"));
_mockDeadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>()));
var request = new ImportCreditCardSalesRequest()
{
FilePath = "path",
DynamicFileName = "filename"
};
await _importCreditCardSalesService.HandleImportCreditCardSales(request);
_mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Once);
_mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny<string>()), Times.Exactly(3));
_mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny<List<Activity>>()), Times.Never);
_mockDeadActivityService.Verify(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>()), Times.Once);
}
[Test]
public async Task HandleImportCreditCardSales_UserHomeDeptIsNull_ActivitesSavedAsDead()
{
string fileContents = GetFileContent();
var fileResponse = new string[] { "filename" };
_mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>())).ReturnsAsync(fileResponse);
_mockFileOperationsApiService.Setup(x => x.GetFileContent(It.IsAny<string>())).ReturnsAsync(fileContents);
AppUser user = GetAppUser(false);
_mockUserRepository.Setup(x => x.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
_mockDeadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>()));
var request = new ImportCreditCardSalesRequest()
{
FilePath = "path",
DynamicFileName = "filename"
};
await _importCreditCardSalesService.HandleImportCreditCardSales(request);
_mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Once);
_mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny<string>()), Times.Exactly(3));
_mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny<List<Activity>>()), Times.Never);
_mockDeadActivityService.Verify(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>()), Times.Once);
}
[Test]
public async Task HandleImportCreditCardSales_DeadActivityServiceFails_OtherActivitiesSave()
{
string fileContents = GetFileContent();
var fileResponse = new string[] { "filename" };
_mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>())).ReturnsAsync(fileResponse);
_mockFileOperationsApiService.Setup(x => x.GetFileContent(It.IsAny<string>())).ReturnsAsync(fileContents);
AppUser user = GetAppUser();
_mockUserRepository.Setup(x => x.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
_mockActivityService.Setup(x => x.SaveActivityRangeAsync(It.IsAny<List<Activity>>()));
_mockDeadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>())).ThrowsAsync(new Exception("Failure"));
var request = new ImportCreditCardSalesRequest()
{
FilePath = "path",
DynamicFileName = "filename"
};
await _importCreditCardSalesService.HandleImportCreditCardSales(request);
_mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Once);
_mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny<string>()), Times.Exactly(3));
_mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny<List<Activity>>()), Times.Once);
_mockDeadActivityService.Verify(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>()), Times.Once);
}
[Test]
public void HandleImportCreditCardSales_FileOperationsFindFilesFails_ExceptionThrown()
{
string fileContents = GetFileContent();
var fileResponse = new string[] { "filename" };
_mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>())).ThrowsAsync(new Exception("Failure"));
var request = new ImportCreditCardSalesRequest()
{
FilePath = "path",
DynamicFileName = "filename"
};
Assert.ThrowsAsync<ServiceException>(() => _importCreditCardSalesService.HandleImportCreditCardSales(request));
_mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Never);
_mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny<string>()), Times.Never);
_mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny<List<Activity>>()), Times.Never);
}
[Test]
public void HandleImportCreditCardSales_FileOperationsGetFileContentFails_ExceptionThrown()
{
string fileContents = GetFileContent();
var fileResponse = new string[] { "filename" };
_mockFileOperationsApiService.Setup(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>())).ReturnsAsync(fileResponse);
_mockFileOperationsApiService.Setup(x => x.GetFileContent("path\\filename")).ThrowsAsync(new Exception("Failure"));
var request = new ImportCreditCardSalesRequest()
{
FilePath = "path",
DynamicFileName = "filename"
};
Assert.ThrowsAsync<ServiceException>(() => _importCreditCardSalesService.HandleImportCreditCardSales(request));
_mockFileOperationsApiService.Verify(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>()), Times.Once);
_mockFileOperationsApiService.Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Once);
_mockUserRepository.Verify(x => x.FindUserByAdEmailAsync(It.IsAny<string>()), Times.Never);
_mockActivityService.Verify(x => x.SaveActivityRangeAsync(It.IsAny<List<Activity>>()), 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 = "[email protected]",
EmployeeId = "11771",
FullName = "John Doe",
Departments = new List<UserDepartment>()
};
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<TemenosCreditCardSale>()
{
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 = "[email protected]",
},
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 = "[email protected]",
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();
}
}
}