324 lines
15 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|