This commit is contained in:
Zeeshaun
2026-03-17 09:53:09 -05:00
parent cdcba54aa4
commit 1a0702a79a
590 changed files with 62058 additions and 0 deletions
@@ -0,0 +1,945 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using LCU.API.Internal.Operations.IncentiveApiLib.Repositories;
using LCU.API.Internal.Operations.IncentiveApi.Services;
using CsvHelper;
using LCU.Library.Internal.IncentiveApiModels.Entities;
using LCU.Library.Internal.IncentiveApiModels.Enums;
using Moq;
using NUnit.Framework;
using LCU.API.Internal.Operations.IncentiveApi.Services.Allied;
using LCU.API.Internal.Operations.IncentiveApi.Services.AutoDecision;
using LCU.Library.Internal.IncentiveApiModels.Requests;
using LCU.API.Internal.Operations.IncentiveApi.Models.Allied;
using LCU.API.Internal.Operations.IncentiveApi.Models;
using LCU.API.Internal.Operations.IncentiveApi.Services.MicroApiServices;
using LCU.Library.Internal.FileOperationsModels.Models.NameSettings;
using LCU.Library.Internal.FileOperationsModels.Models;
namespace Application.UnitTests.Services.Allied
{
public class AlliedTransactionImportServiceTest
{
private IAlliedGapMbpTransactionImportService _service;
private IUserRepository _userRepository;
private IActivityService _activityService;
private IActivityDecisionService _activityDecisionService;
private IActivityDetailService _activityDetailService;
private DebtProtectionAccessoryService _debtProtectionAccessoryService;
private IDnaService _dnaService;
private IFileOperationsApiService _fileOperationsApiService;
private Mock<IDeadActivityService> _deadActivityService;
private IGapInsuranceActivityService _gapInsuranceActivityService;
private Mock<IActivityRepository> _activityRepository;
private Mock<IUnitOfWork> _unitOfWork;
private int _expectedRecordCount;
private string _testDataFilePath;
[SetUp]
public void Setup()
{
var strategies = new List<IDecisionStrategy>
{
new DebtProtectionEligibleLoanDecisionStrategy(),
new GapDecisionStrategy(),
new ManualDecisionStrategy(),
new MbpDecisionStrategy(),
new MortgageSaleDecisionStrategy(),
new NewCheckingDecisionStrategy(),
new ReferralDecisionStrategy(),
new VehicleDecisionStrategy()
};
_userRepository = Mock.Of<IUserRepository>();
_fileOperationsApiService = Mock.Of<IFileOperationsApiService>();
_activityService = Mock.Of<IActivityService>();
_activityDetailService = Mock.Of<IActivityDetailService>();
_debtProtectionAccessoryService = new DebtProtectionAccessoryService(_activityService, _activityDetailService);
_dnaService = Mock.Of<IDnaService>();
_activityDecisionService = new ActivityDecisionService(strategies, _activityService, _activityDetailService, _debtProtectionAccessoryService, _dnaService);
_deadActivityService = new Mock<IDeadActivityService>();
_activityRepository = new Mock<IActivityRepository>();
_unitOfWork = new Mock<IUnitOfWork>();
_gapInsuranceActivityService = new GapInsuranceActivityService(_activityDetailService, _activityRepository.Object, _activityService, _unitOfWork.Object);
_service = new AlliedGapMbpTransactionImportService(
_userRepository,
_gapInsuranceActivityService,
_fileOperationsApiService,
_activityService,
_activityDecisionService,
_activityDetailService,
_deadActivityService.Object
);
_expectedRecordCount = 12;
_testDataFilePath = @"Services/Allied/SalesWithCancellationsByEmployee.csv";
}
public StreamReader GetAlliedFile()
{
var path = _testDataFilePath;
var reader = new StreamReader(path);
return reader;
}
[Test]
public async Task ProcessFileNames_OK()
{
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
};
user.Departments.Add(assignment);
var request = new AlliedGapMbpRequest
{
DynamicFileName = "alliedgapmbp",
FilePath = "clean",
DynamicFileSettings = new DynamicNameSetting() { }
};
var files = new string[]
{
"x"
};
byte[] array = File.ReadAllBytes(_testDataFilePath);
//Setup
Mock.Get(_fileOperationsApiService).Setup(x => x.BuildDynamicFileList(It.IsAny<DynamicFileListRequest>())).ReturnsAsync(files);
Mock.Get(_fileOperationsApiService).Setup(x => x.GetFileContent(It.IsAny<string>())).ReturnsAsync(array.ToString());
Mock.Get(_userRepository).Setup(s => s.SearchUsersAsync(It.IsAny<UserSearchRequest>())).ReturnsAsync(new List<AppUser>() { user });
var results = await _service.ImportTransactions<AlliedSaleRow>(request);
var activities = await _service.CreateActivity(It.IsAny<IEnumerable<AlliedSaleRow>>());
Mock.Get(_fileOperationsApiService).Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Once);
Assert.AreEqual("alliedgapmbp", request.DynamicFileName);
}
[Test]
public async Task ProcessCsv_OK()
{
SetupTestUsers();
SetupTestActivities();
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
var alliedSaleRows = transactions.ToList();
Assert.IsNotEmpty(alliedSaleRows);
Assert.AreEqual(_expectedRecordCount, alliedSaleRows.Count());
var results = await _service.CreateActivity(alliedSaleRows);
Assert.NotNull(results);
Assert.AreEqual(_expectedRecordCount, results.Count);
Assert.AreEqual(_expectedRecordCount, results.Count(x => x.SourceSystem == SystemType.Allied));
}
public IEnumerable<AlliedSaleRow> ImportTestTransactions()
{
var input = GetAlliedFile();
var csvReader = new CsvReader(input, CultureInfo.InvariantCulture);
return csvReader.GetRecords<AlliedSaleRow>().ToList();
}
public void SetupTestUsers()
{
var department = new Department()
{
DepartmentName = "Dept1",
Id = 55,
State = DepartmentState.Active
};
var testUsers = new List<AppUser>
{
new()
{
AdEmail = "[email protected]",
EmployeeId = "11771",
FullName = "Abraham TestAssociate1",
Id = Guid.NewGuid(),
Departments = new List<UserDepartment>
{
new()
{
Id = 99,
Department = department,
Employee = null,
Role = Role.BM,
IsHome = true,
StartDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
EndDate = null
}
}
},
new()
{
AdEmail = "[email protected]",
EmployeeId = "11772",
FullName = "Franchelie TestAssociate2",
Id = Guid.NewGuid(),
Departments = new List<UserDepartment>
{
new()
{
Id = 100,
Department = department,
Employee = null,
Role = Role.BM,
IsHome = true,
StartDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
EndDate = null
}
}
},
new()
{
AdEmail = "[email protected]",
EmployeeId = "11773",
FullName = "Stefani TestAssociate3",
Id = Guid.NewGuid(),
Departments = new List<UserDepartment>
{
new()
{
Id = 101,
Department = department,
Employee = null,
Role = Role.BM,
IsHome = true,
StartDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
EndDate = null
}
}
},
new()
{
AdEmail = "[email protected]",
EmployeeId = "11774",
FullName = "Amarisa TestAssociate4",
Id = Guid.NewGuid(),
Departments = new List<UserDepartment>
{
new()
{
Id = 102,
Department = department,
Employee = null,
Role = Role.BM,
IsHome = true,
StartDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
EndDate = null
}
}
},
new()
{
AdEmail = "[email protected]",
EmployeeId = "11774",
FullName = "Amalia TestAssociate5",
Id = Guid.NewGuid(),
Departments = new List<UserDepartment>
{
new()
{
Id = 103,
Department = department,
Employee = null,
Role = Role.BM,
IsHome = true,
StartDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
EndDate = null
}
}
}
};
foreach (var user in testUsers)
{
user.Departments.First().Employee = user;
Mock.Get(_userRepository)
.Setup(r => r.SearchUsersAsync(It.Is<UserSearchRequest>(x => x.Query == user.FullName)))
.ReturnsAsync(new List<AppUser> { testUsers.First(x => x.FullName == user.FullName) });
}
}
public void SetupTestActivities()
{
var existingActivities = new List<Activity>
{
new()
{
Id = 1,
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.GAPInsurance,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceSystem = SystemType.Allied,
State = ActivityState.Accepted,
Detail = new ActivityDetail()
{
AccountNumber = "867530986",
MemberName = "ORLANDO TESTCUSTOMER10"
}
},
new()
{
Id = 2,
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.GAPInsurance,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceSystem = SystemType.Allied,
State = ActivityState.Accepted,
Detail = new ActivityDetail()
{
AccountNumber = "8675309861",
MemberName = "ORLANDO TESTCUSTOMER11"
}
},
new()
{
Id = 3,
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.GAPInsurance,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceSystem = SystemType.Allied,
State = ActivityState.Accepted,
Detail = new ActivityDetail()
{
AccountNumber = "8675309862",
MemberName = "ORLANDO TESTCUSTOMER12"
}
}
};
foreach (var queryActivity in existingActivities)
{
Mock.Get(_activityService)
.Setup(r => r
.GetActivityForStateUpdate(It.Is<Activity>(x => x.EmployeeId == queryActivity.EmployeeId
&& x.Product == queryActivity.Product
&& x.Detail.AccountNumber == queryActivity.Detail.AccountNumber
)))
.ReturnsAsync(existingActivities.First(x => x.EmployeeId == queryActivity.EmployeeId
&& x.Product == queryActivity.Product
&& x.Detail.AccountNumber == queryActivity.Detail.AccountNumber
));
Mock.Get(_activityService)
.Setup(r => r
.GetActivityForDetailUpdate(It.Is<Activity>(x => x.EmployeeId == queryActivity.EmployeeId
&& x.Product == queryActivity.Product
&& x.Detail.AccountNumber == queryActivity.Detail.AccountNumber
)))
.ReturnsAsync(existingActivities.First(x => x.EmployeeId == queryActivity.EmployeeId
&& x.Product == queryActivity.Product
&& x.Detail.AccountNumber == queryActivity.Detail.AccountNumber
));
Mock.Get(_activityService)
.Setup(r => r
.GetActivity(It.IsAny<int>()))
.ReturnsAsync(existingActivities.First(x => x.Id == queryActivity.Id
));
Mock.Get(_activityService)
.Setup(r => r
.CreateAndRetrieveActivity(It.Is<Activity>(x =>
x.AppUserId == queryActivity.AppUserId
&& x.EmployeeId == queryActivity.EmployeeId
&& x.Product == queryActivity.Product
&& x.Detail.AccountNumber == queryActivity.Detail.AccountNumber
&& x.Detail.SubAccountNumber == queryActivity.Detail.SubAccountNumber
)))
.ReturnsAsync(existingActivities.First(x =>
x.AppUserId == queryActivity.AppUserId
&& x.EmployeeId == queryActivity.EmployeeId
&& x.Product == queryActivity.Product
&& x.Detail.AccountNumber == queryActivity.Detail.AccountNumber
&& x.Detail.SubAccountNumber == queryActivity.Detail.SubAccountNumber
));
}
Mock.Get(_activityService)
.Setup(r => r
.CreateAndRetrieveActivity(It.IsAny<Activity>()))
.ReturnsAsync(new Activity()
{
AppUserId = Guid.NewGuid(),
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.GAPInsurance,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceSystem = SystemType.Allied,
State = ActivityState.Accepted,
Detail = new ActivityDetail()
{
AccountNumber = "8675309862",
MemberName = "ORLANDO TESTCUSTOMER12"
}
});
}
[Test]
public async Task SavesDeadActivity_WhenNoUserFound()
{
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync((AppUser)null);
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(_expectedRecordCount, transactions.Count());
var results = await _service.CreateActivity(transactions);
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count() == _expectedRecordCount &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("allied import, no user for")))));
}
[Test]
public async Task SavesDeadActivity_WhenFindingUserFails()
{
Mock.Get(_userRepository)
.Setup(s => s.FindUserByAdEmailAsync(It.IsAny<string>()))
.Throws(new Exception("OOops"));
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(_expectedRecordCount, transactions.Count());
var results = await _service.CreateActivity(transactions);
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count() == _expectedRecordCount &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("allied import, no user for")))));
}
[Test]
public async Task SavesDeadActivity_WhenTooManyUserFound()
{
Mock.Get(_userRepository)
.Setup(s => s.SearchUsersAsync(It.IsAny<UserSearchRequest>()))
.ReturnsAsync(new List<AppUser>()
{ new() { EmployeeId = "One" }, new() { EmployeeId = "Two" } });
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(_expectedRecordCount, transactions.Count());
var results = await _service.CreateActivity(transactions);
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count() == _expectedRecordCount &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("allied import, no user for")))));
}
[Test]
public async Task SavesDeadActivity_WhenNoHomeDepartmentFound()
{
//Use one user for all lines for simplicity
var user = new AppUser()
{
AdEmail = "[email protected]",
EmployeeId = "11771",
FullName = "John Doe",
Departments = new List<UserDepartment>()
};
Mock.Get(_userRepository).Setup(s => s.SearchUsersAsync(It.IsAny<UserSearchRequest>())).ReturnsAsync(new List<AppUser> { user });
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(_expectedRecordCount, transactions.Count());
var results = await _service.CreateActivity(transactions);
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count() == _expectedRecordCount &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("reliably determinable home")))));
}
[Test]
public async Task SavesDeadActivity_BothKinds()
{
var noHomeDepartmentUser = new AppUser()
{
AdEmail = "[email protected]",
EmployeeId = "11773",
FullName = "Stefani TestAssociate3",
Departments = new List<UserDepartment>()
};
Mock.Get(_userRepository)
.Setup(s => s.SearchUsersAsync(It.Is<UserSearchRequest>(x => x.Query == noHomeDepartmentUser.FullName)))
.ReturnsAsync(new List<AppUser> { noHomeDepartmentUser });
var transactions = ImportTestTransactions();
var expectedHomelessDeadRecordCount = transactions.Count(x => x.Quoter == noHomeDepartmentUser.FullName);
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(_expectedRecordCount, transactions.Count());
var results = await _service.CreateActivity(transactions);
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(y =>
y.Reason == DeadActivityReason.MissingRequiredField &&
y.ReasonNote.ToLowerInvariant().Contains("allied import, no user for")) ==
_expectedRecordCount - expectedHomelessDeadRecordCount)));
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(y =>
y.Reason == DeadActivityReason.MissingRequiredField &&
y.ReasonNote.ToLowerInvariant().Contains("reliably determinable home")) == expectedHomelessDeadRecordCount)));
}
[Test]
public async Task FailToSaveDeadActivity_DoesntThrow()
{
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync((AppUser)null);
_deadActivityService.Setup(x => x.SaveDeadActivityRange(It.IsAny<List<DeadActivity>>()))
.ThrowsAsync(new Exception("Oops"));
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(_expectedRecordCount, transactions.Count());
List<Activity> results = null;
Assert.DoesNotThrowAsync(async () =>
{
var res = await _service.CreateActivity(transactions);
results = res.ToList();
});
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count() == _expectedRecordCount &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("allied import, no user for")))));
}
[Test]
public async Task FilterAndOrderUpdates_DefaultWithNullExisting()
{
var sourceCreatedNewer = DateTime.Today.Subtract(TimeSpan.FromDays(3));
var sourceCreatedOlder = DateTime.Today.Subtract(TimeSpan.FromDays(7));
var activityProcessingOrder = new ActivityProcessingOrder
{
ExistingActivity = null,
ActivityUpdateItems = new List<Activity>()
{
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Cancelled",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Flagged",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedNewer,
SourceCreated = sourceCreatedNewer,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Sold",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Reinstated",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Sold",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new Activity()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Cancelled/Re-Quoted",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
}
}
};
activityProcessingOrder = _service.FilterAndOrderUpdates(activityProcessingOrder);
Assert.AreEqual(6, activityProcessingOrder.ActivityUpdateItems.Count);
Assert.AreEqual(0, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Flagged"));
Assert.AreEqual(1, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Sold" && x.SourceCreated == sourceCreatedOlder));
Assert.AreEqual(2, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Cancelled/Re-Quoted"));
Assert.AreEqual(3, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Cancelled"));
Assert.AreEqual(4, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Reinstated"));
Assert.AreEqual(5, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.SourceCreated == sourceCreatedNewer));
}
[Test]
public async Task FilterAndOrderUpdates_DefaultWithNonNullExisting()
{
var sourceCreatedNewer = DateTime.Today.Subtract(TimeSpan.FromDays(3));
var sourceCreatedOlder = DateTime.Today.Subtract(TimeSpan.FromDays(7));
var activityProcessingOrder = new ActivityProcessingOrder
{
ExistingActivity = new Activity
{
Id = 1,
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Cancelled/Re-Quoted",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
ActivityUpdateItems = new List<Activity>()
{
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Cancelled",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Flagged",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedNewer,
SourceCreated = sourceCreatedNewer,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Sold",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Reinstated",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Sold",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
},
new Activity()
{
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.MechanicalBreakdownProtection,
Accepted = sourceCreatedOlder,
SourceCreated = sourceCreatedOlder,
SourceId = "1",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
AccountNumber = "867530986",
AccountStatus = "Cancelled/Re-Quoted",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "8675309-AAG"
}
}
}
};
activityProcessingOrder = _service.FilterAndOrderUpdates(activityProcessingOrder);
Assert.AreEqual(4, activityProcessingOrder.ActivityUpdateItems.Count);
// These items should return an index of -1 since they should be removed in order to not run already run updates against the existing item
Assert.AreEqual(-1, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Flagged"));
Assert.AreEqual(-1, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Sold" && x.SourceCreated == sourceCreatedOlder));
Assert.AreEqual(0, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Cancelled/Re-Quoted"));
Assert.AreEqual(1, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Cancelled"));
Assert.AreEqual(2, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.Detail.AccountStatus == "Reinstated"));
Assert.AreEqual(3, activityProcessingOrder.ActivityUpdateItems.FindIndex(x => x.SourceCreated == sourceCreatedNewer));
}
[TestCase(ActivityState.PendingTransfer, 0, true)] // Activity exists, is pending transfer, and not updated
[TestCase(ActivityState.Rejected, 0, true)] // Activity exists, is pending transfer, and not updated
[TestCase(ActivityState.Transferred, 0, true)] // Activity exists, is pending transfer, and not updated
[TestCase(ActivityState.Accepted, 1, false)] // Activity does not exist and is created
[TestCase(ActivityState.Accepted, 0, true)] // Activity exists and is not created
[Test]
public async Task CreateActivity_ExistingActivityInVariousStates_ReturnsExpectedResultsCount(ActivityState activityState, int expectedResultCount, bool returnsActivity)
{
SetupTestUsers();
var transactions = new List<AlliedSaleRow>()
{
new AlliedSaleRow()
{
AccountNumber = "1234",
Origin = "LenderWebsite",
ProductType = "GAP",
Status = "Sold",
SaleDate = DateTime.Now.ToString(),
Buyer = "Buyer",
SalesContractNumber = "1",
Issuer = "Abraham TestAssociate1"
}
};
var existingActivity = new Activity()
{
Id = 1,
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.GAPInsurance,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceSystem = SystemType.Allied,
State = activityState,
Detail = new ActivityDetail()
{
AccountNumber = "867530986",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "1",
AccountStatus = "Sold"
}
};
var newlyCreatedActivity = new Activity()
{
Id = 1,
DepartmentId = 55,
EmployeeId = "11774",
Type = ActivityType.Sale,
Product = Product.GAPInsurance,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceSystem = SystemType.Allied,
State = returnsActivity == true ? activityState : ActivityState.Created, // if an activity does not exist, the new activity is initially in Created state
Detail = new ActivityDetail()
{
AccountNumber = "867530986",
MemberName = "ORLANDO TESTCUSTOMER10",
SubAccountNumber = "1",
AccountStatus = "Sold"
}
};
Mock.Get(_activityService)
.Setup(a => a.GetActivityForDetailUpdate(It.IsAny<Activity>()))
.ReturnsAsync(returnsActivity == true ? existingActivity : (Activity)null);
Mock.Get(_activityService)
.Setup(a => a.CreateAndRetrieveActivity(It.IsAny<Activity>()))
.ReturnsAsync(newlyCreatedActivity);
var resutls = await _service.CreateActivity(transactions);
Assert.IsNotNull(resutls);
Assert.AreEqual(expectedResultCount, resutls.Count);
}
}
}
@@ -0,0 +1,13 @@
Quoter,Issuer,Origin,Product_Type,Status,Sale_Date,Sale_Effective_Date,Cancellation_Date,Cancellation_Reason,Cancelled_By,Sales_Contract_Number,Buyer,Account_Number,LOS_LOAN_APP_ID_TX,Program_Type,Buyer_Cost,Flagged_Reasons
Abraham TestAssociate1,Abraham TestAssociate1,Lender Website,GAP,Sold,11/13/2021,11/13/2021,,,,,RENEE TESTCUSTOMER1,1234567,,Standard,395.00,
Franchelie TestAssociate2,Franchelie TestAssociate2,Lender Website,MBP,Sold,11/13/2021,11/13/2021,,,,86753619-AAG,MAYRIN TESTCUSTOMER2,9876543,,Standard,395.00,
Stefani TestAssociate3,Stefani TestAssociate3,Lender Website,GAP,Sold,11/13/2021,11/13/2021,,,,,JAMES TESTCUSTOMER3,11234567844,,Standard,395.00,
Franchelie TestAssociate2,Franchelie TestAssociate2,Lender Website,GAP,Sold,11/12/2021,11/12/2021,,,,,JOSE TESTCUSTOMER4,19618823214,,Standard,395.00,
Franchelie TestAssociate2,Franchelie TestAssociate2,Lender Website,GAP,Sold,11/12/2021,11/12/2021,,,,,GUSTAVO TESTCUSTOMER5,97456322603,,Standard,395.00,
Amarisa TestAssociate4,Amarisa TestAssociate4,Lender Website,MBP,Sold,11/12/2021,11/12/2021,,,,10253867-AAG,ALESSANDRO TESTCUSTOMER6,75315927194,,Standard,395.00,
Amarisa TestAssociate4,Amarisa TestAssociate4,Lender Website,GAP,Sold,11/12/2021,11/12/2021,,,,,JACOB TESTCUSTOMER7,19137958748,,Standard,395.00,
Amarisa TestAssociate4,Amarisa TestAssociate4,Lender Website,GAP,Sold,11/12/2021,11/15/2021,,,,,FRANK TESTCUSTOMER8,19852347569,,Standard,395.00,
Abraham TestAssociate1,Abraham TestAssociate1,Lender Website,GAP,Flagged,11/12/2021,11/12/2021,,,,,MARIA TESTCUSTOMER9,11103254770,,Standard,395.00,
Amalia TestAssociate5,Amalia TestAssociate5,Lender Website,GAP,Cancelled/Re-Quoted,10/25/2021,10/25/2021,10/26/2021,Buyer Changed Mind,[email protected],,ORLANDO TESTCUSTOMER10,867530986,,Standard,395.00,
Amalia TestAssociate5,Amalia TestAssociate5,Lender Website,GAP,Cancelled,10/23/2021,10/23/2021,,,,,ORLANDO TESTCUSTOMER11,8675309861,,Standard,395.00, Quoter Changed,
Amalia TestAssociate5,Amalia TestAssociate5,Lender Website,GAP,Cancelled,10/22/2021,10/22/2021,10/27/2021,Loan Did Not Close,[email protected],,ORLANDO TESTCUSTOMER12,8675309862,,Standard,395.00,
1 Quoter Issuer Origin Product_Type Status Sale_Date Sale_Effective_Date Cancellation_Date Cancellation_Reason Cancelled_By Sales_Contract_Number Buyer Account_Number LOS_LOAN_APP_ID_TX Program_Type Buyer_Cost Flagged_Reasons
2 Abraham TestAssociate1 Abraham TestAssociate1 Lender Website GAP Sold 11/13/2021 11/13/2021 RENEE TESTCUSTOMER1 1234567 Standard 395.00
3 Franchelie TestAssociate2 Franchelie TestAssociate2 Lender Website MBP Sold 11/13/2021 11/13/2021 86753619-AAG MAYRIN TESTCUSTOMER2 9876543 Standard 395.00
4 Stefani TestAssociate3 Stefani TestAssociate3 Lender Website GAP Sold 11/13/2021 11/13/2021 JAMES TESTCUSTOMER3 11234567844 Standard 395.00
5 Franchelie TestAssociate2 Franchelie TestAssociate2 Lender Website GAP Sold 11/12/2021 11/12/2021 JOSE TESTCUSTOMER4 19618823214 Standard 395.00
6 Franchelie TestAssociate2 Franchelie TestAssociate2 Lender Website GAP Sold 11/12/2021 11/12/2021 GUSTAVO TESTCUSTOMER5 97456322603 Standard 395.00
7 Amarisa TestAssociate4 Amarisa TestAssociate4 Lender Website MBP Sold 11/12/2021 11/12/2021 10253867-AAG ALESSANDRO TESTCUSTOMER6 75315927194 Standard 395.00
8 Amarisa TestAssociate4 Amarisa TestAssociate4 Lender Website GAP Sold 11/12/2021 11/12/2021 JACOB TESTCUSTOMER7 19137958748 Standard 395.00
9 Amarisa TestAssociate4 Amarisa TestAssociate4 Lender Website GAP Sold 11/12/2021 11/15/2021 FRANK TESTCUSTOMER8 19852347569 Standard 395.00
10 Abraham TestAssociate1 Abraham TestAssociate1 Lender Website GAP Flagged 11/12/2021 11/12/2021 MARIA TESTCUSTOMER9 11103254770 Standard 395.00
11 Amalia TestAssociate5 Amalia TestAssociate5 Lender Website GAP Cancelled/Re-Quoted 10/25/2021 10/25/2021 10/26/2021 Buyer Changed Mind [email protected] ORLANDO TESTCUSTOMER10 867530986 Standard 395.00
12 Amalia TestAssociate5 Amalia TestAssociate5 Lender Website GAP Cancelled 10/23/2021 10/23/2021 ORLANDO TESTCUSTOMER11 8675309861 Standard 395.00 Quoter Changed
13 Amalia TestAssociate5 Amalia TestAssociate5 Lender Website GAP Cancelled 10/22/2021 10/22/2021 10/27/2021 Loan Did Not Close [email protected] ORLANDO TESTCUSTOMER12 8675309862 Standard 395.00