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,382 @@
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.Action;
using LCU.API.Internal.Operations.IncentiveApi.Models.Action;
using LCU.API.Internal.Operations.IncentiveApi.Services.MicroApiServices;
using LCU.Library.Internal.IncentiveApiModels.Requests;
using LCU.API.Internal.Operations.IncentiveApi.Configuration;
using LCU.Library.Internal.FileOperationsModels.Models.NameSettings;
using LCU.Library.Internal.FileOperationsModels.Models;
namespace Application.UnitTests.Services.Action
{
public class ActionCreditCardImportServiceTest
{
private IActionCreditCardImportService _actionCreditCardImportService;
private IUserRepository _userRepository;
private IActivityService _activityService;
private IFileOperationsApiService _fileOperationsApiService;
private Mock<IDeadActivityService> _deadActivityService;
[SetUp]
public void Setup()
{
_userRepository = Mock.Of<IUserRepository>();
_fileOperationsApiService = Mock.Of<IFileOperationsApiService>();
_activityService = Mock.Of<IActivityService>();
_deadActivityService = new Mock<IDeadActivityService>();
_actionCreditCardImportService = new ActionCreditCardImportService(_userRepository, _fileOperationsApiService, _activityService,_deadActivityService.Object);
}
private static StreamReader GetActionFile()
{
var path = @"Services/Action/Action_CreditCardPersonal.csv";
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 ActionCreditCardRequest
{
DynamicFileName = "credit",
FilePath = "clean",
DynamicFileSettings = new DynamicNameSetting() { }
};
var files = new[]
{
"x"
};
var array = await File.ReadAllBytesAsync( @"Services/Action/Action_CreditCardPersonal.csv");
//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.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
Mock.Get(_activityService).Setup(x => x.SaveActivityRangeAsync(It.IsAny<IReadOnlyCollection<Activity>>())).Verifiable();
await _actionCreditCardImportService.ImportTransactions<ActionCreditCardPersonalRow>("personal", request);
Mock.Get(_fileOperationsApiService).Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Once);
Mock.Get(_activityService).Verify(x => x.SaveActivityRangeAsync(It.IsAny<IReadOnlyCollection<Activity>>()), Times.Once);
}
[Test]
public async Task ProcessCsv_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);
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
var actionCreditCardPersonalRows = transactions.ToList();
Assert.IsNotEmpty(actionCreditCardPersonalRows);
Assert.AreEqual(15, actionCreditCardPersonalRows.Count);
// Should lose the duplicate.
var results = await _actionCreditCardImportService.CreateActivity(actionCreditCardPersonalRows);
Assert.NotNull(results);
Assert.AreEqual(14, results.Count);
}
private IEnumerable<ActionCreditCardPersonalRow> ImportTestTransactions()
{
var input = GetActionFile();
var csvReader = new CsvReader(input, CultureInfo.InvariantCulture);
return csvReader.GetRecords<ActionCreditCardPersonalRow>().ToList();
}
[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);
var actionCreditCardPersonalRows = transactions.ToList();
Assert.IsNotEmpty(actionCreditCardPersonalRows);
Assert.AreEqual(15, actionCreditCardPersonalRows.Count);
var results = await _actionCreditCardImportService.CreateActivity(actionCreditCardPersonalRows);
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count == 15 &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("action import, no user for")))));
//Our test CSV has email information for every row except 1
_deadActivityService.Verify(x =>x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(deadActivity => !string.IsNullOrWhiteSpace(deadActivity.EmployeeEmail)) == 14)));
}
[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);
var actionCreditCardPersonalRows = transactions.ToList();
Assert.IsNotEmpty(actionCreditCardPersonalRows);
Assert.AreEqual(15, actionCreditCardPersonalRows.Count);
var results = await _actionCreditCardImportService.CreateActivity(actionCreditCardPersonalRows);
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count == 15 &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("action import, no user for")))));
//Our test CSV has email information for every row except 1
_deadActivityService.Verify(x =>x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(deadActivity => !string.IsNullOrWhiteSpace(deadActivity.EmployeeEmail)) == 14)));
}
[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.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
var actionCreditCardPersonalRows = transactions.ToList();
Assert.IsNotEmpty(actionCreditCardPersonalRows);
Assert.AreEqual(15, actionCreditCardPersonalRows.Count);
var results = await _actionCreditCardImportService.CreateActivity(actionCreditCardPersonalRows);
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count == 15 &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("reliably determinable home")))));
}
[Test]
public async Task SavesDeadActivity_MissingEmployeeId_MissingDepartmentId()
{
var user = new AppUser
{
AdEmail = "[email protected]",
EmployeeId = "11771",
FullName = "John Doe",
Departments = new List<UserDepartment>()
};
//There are 2 entries with this email, they will have a user but no home department
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.Is<string>(x => x.ToLowerInvariant() == "[email protected]"))).ReturnsAsync(user);
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
var actionCreditCardPersonalRows = transactions.ToList();
Assert.IsNotEmpty(actionCreditCardPersonalRows);
Assert.AreEqual(15, actionCreditCardPersonalRows.Count);
var results = await _actionCreditCardImportService.CreateActivity(actionCreditCardPersonalRows);
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("action import, no user for")) == 13)));
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(y =>
y.Reason == DeadActivityReason.MissingRequiredField &&
y.ReasonNote.ToLowerInvariant().Contains("reliably determinable home")) == 2)));
}
[Test]
public async Task SomeActivitiesAreDeadJim_Ok()
{
var john = new AppUser
{
AdEmail = "[email protected]",
EmployeeId = "John",
FullName = "John Doe",
Departments = new List<UserDepartment>()
};
//There are 2 entries with this email, they will have a user but no home department
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.Is<string>(x => x.ToLowerInvariant() == "[email protected]"))).ReturnsAsync(john);
var department = new Department
{
DepartmentName = "Dept1",
Id = 55,
State = DepartmentState.Active
};
var mary = new AppUser
{
AdEmail = "[email protected]",
EmployeeId = "Mary",
FullName = "Mary Deer",
Departments = new List<UserDepartment>()
};
var assignment = new UserDepartment
{
Id = 99,
Department = department,
Employee = mary,
Role = Role.BM,
IsHome = true,
StartDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
EndDate = null
};
mary.Departments.Add(assignment);
//There are 2 entries with this email, they will not have a home department assigned
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.Is<string>(x => x.ToLowerInvariant() == "[email protected]"))).ReturnsAsync(john);
//There are 2 entries with this email, they will have a home department assigned
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.Is<string>(x => x.ToLowerInvariant() == "[email protected]"))).ReturnsAsync(mary);
//Everyone else won't exist
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
var actionCreditCardPersonalRows = transactions.ToList();
Assert.IsNotEmpty(actionCreditCardPersonalRows);
Assert.AreEqual(15, actionCreditCardPersonalRows.Count);
//Mary should have 2 successful results
var results = await _actionCreditCardImportService.CreateActivity(actionCreditCardPersonalRows);
Assert.NotNull(results);
Assert.AreEqual(2,results.Count);
Assert.True(results.All(x => x.EmployeeId == "Mary"));
//John should have 2 entries in dead activity for not having a home department
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(y =>
y.EmployeeId == john.EmployeeId &&
y.Reason == DeadActivityReason.MissingRequiredField &&
y.ReasonNote.ToLowerInvariant().Contains("reliably determinable home")) == 2)));
//Everyone else could not be identified
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(y =>
(y.EmployeeId != john.EmployeeId && y.EmployeeId != mary.EmployeeId) &&
y.Reason == DeadActivityReason.MissingRequiredField &&
y.ReasonNote.ToLowerInvariant().Contains("action import, no user for")) == 11)));
}
[Test]
public void 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);
var actionCreditCardPersonalRows = transactions.ToList();
Assert.IsNotEmpty(actionCreditCardPersonalRows);
Assert.AreEqual(15, actionCreditCardPersonalRows.Count);
List<Activity> results = null;
Assert.DoesNotThrowAsync(async () =>
{
var res = await _actionCreditCardImportService.CreateActivity(actionCreditCardPersonalRows);
results = res.ToList();
});
Assert.NotNull(results);
Assert.IsEmpty(results);
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count == 15 &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("action import, no user for")))));
//Our test CSV has email information for every row except 1
_deadActivityService.Verify(x =>x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(deadActivity => !string.IsNullOrWhiteSpace(deadActivity.EmployeeEmail)) == 14)));
}
}
}
@@ -0,0 +1,374 @@
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.Action;
using LCU.API.Internal.Operations.IncentiveApi.Models.Action;
using LCU.API.Internal.Operations.IncentiveApi.Services.MicroApiServices;
using LCU.Library.Internal.IncentiveApiModels.Requests;
using LCU.Library.Internal.FileOperationsModels.Models;
using LCU.Library.Internal.FileOperationsModels.Models.NameSettings;
namespace Application.UnitTests.Services.Action
{
public class ActionVehicleImportServiceTest
{
private IActionVehicleImportService _service;
private IUserRepository _userRepository;
private IActivityService _activityService;
private IFileOperationsApiService _fileOperationsApiService;
private Mock<IDeadActivityService> _deadActivityService;
[SetUp]
public void Setup()
{
_userRepository = Mock.Of<IUserRepository>();
_fileOperationsApiService = Mock.Of<IFileOperationsApiService>();
_activityService = Mock.Of<IActivityService>();
_deadActivityService = new Mock<IDeadActivityService>();
_service = new ActionVehicleImportService(_userRepository, _fileOperationsApiService, _activityService, _deadActivityService.Object);
}
public StreamReader GetActionFile()
{
var path = @"Services/Action/Action_IndirectVehicleLoanSales.csv";
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 ActionVehicleRequest
{
DynamicFileName = "vehiclesales",
FilePath = "clean",
DynamicFileSettings = new DynamicNameSetting() { }
};
var files = new string[]
{
"x"
};
byte[] array = File.ReadAllBytes( @"Services/Action/Action_IndirectVehicleLoanSales.csv");
//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.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
Mock.Get(_activityService).Setup(x => x.SaveActivityRangeAsync(It.IsAny<IReadOnlyCollection<Activity>>())).Verifiable();
await _service.ImportTransactions<ActionSaleRow>(request);
Mock.Get(_fileOperationsApiService).Verify(x => x.GetFileContent(It.IsAny<string>()), Times.Once);
Mock.Get(_activityService).Verify(x => x.SaveActivityRangeAsync(It.IsAny<IReadOnlyCollection<Activity>>()), Times.Once);
}
[Test]
public async Task ProcessCsv_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);
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(7, transactions.Count());
var results = await _service.CreateActivity(transactions);
Assert.NotNull(results);
Assert.AreEqual(7, results.Count());
}
public IEnumerable<ActionSaleRow> ImportTestTransactions()
{
var input = GetActionFile();
var csvReader = new CsvReader(input, CultureInfo.InvariantCulture);
return csvReader.GetRecords<ActionSaleRow>().ToList();
}
[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(7, 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() == 7 &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("action import, no user for")))));
//Our test CSV has email information for every row except 1
_deadActivityService.Verify(x =>x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(x => !string.IsNullOrWhiteSpace(x.EmployeeEmail)) == 6)));
}
[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(7, 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() == 7 &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("action import, no user for")))));
//Our test CSV has email information for every row except 1
_deadActivityService.Verify(x =>x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(x => !string.IsNullOrWhiteSpace(x.EmployeeEmail)) == 6)));
}
[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.FindUserByAdEmailAsync(It.IsAny<string>())).ReturnsAsync(user);
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(7, 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() == 7 &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("reliably determinable home"))))); }
[Test]
public async Task SavesDeadActivity_BothKinds()
{
var user = new AppUser()
{
AdEmail = "[email protected]",
EmployeeId = "11771",
FullName = "John Doe",
Departments = new List<UserDepartment>()
};
//There are 2 entries with this email, they will have a user but no home department
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.Is<string>(x => x.ToLowerInvariant() == "[email protected]"))).ReturnsAsync(user);
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(7, 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("action import, no user for")) == 5)));
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(y =>
y.Reason == DeadActivityReason.MissingRequiredField &&
y.ReasonNote.ToLowerInvariant().Contains("reliably determinable home")) == 2)));
}
[Test]
public async Task SomeActivitiesAreDeadJim_Ok()
{
var john = new AppUser()
{
AdEmail = "[email protected]",
EmployeeId = "John",
FullName = "John Doe",
Departments = new List<UserDepartment>()
};
//There are 2 entries with this email, they will have a user but no home department
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.Is<string>(x => x.ToLowerInvariant() == "[email protected]"))).ReturnsAsync(john);
var department = new Department()
{
DepartmentName = "Dept1",
Id = 55,
State = DepartmentState.Active
};
var mary = new AppUser()
{
AdEmail = "[email protected]",
EmployeeId = "Mary",
FullName = "Mary Deer",
Departments = new List<UserDepartment>()
};
var assignment = new UserDepartment()
{
Id = 99,
Department = department,
Employee = mary,
Role = Role.BM,
IsHome = true,
StartDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1),
EndDate = null
};
mary.Departments.Add(assignment);
//There are 2 entries with this email, they will not have a home department assigned
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.Is<string>(x => x.ToLowerInvariant() == "[email protected]"))).ReturnsAsync(john);
//There are 2 entries with this email, they will have a home department assigned
Mock.Get(_userRepository).Setup(s => s.FindUserByAdEmailAsync(It.Is<string>(x => x.ToLowerInvariant() == "[email protected]"))).ReturnsAsync(mary);
//Everyone else won't exist
var transactions = ImportTestTransactions();
Assert.NotNull(transactions);
Assert.IsNotEmpty(transactions);
Assert.AreEqual(7, transactions.Count());
//Mary should have 2 successful results
var results = await _service.CreateActivity(transactions);
Assert.NotNull(results);
Assert.AreEqual(2,results.Count);
Assert.True(results.All(x => x.EmployeeId == "Mary"));
//John should have 2 entries in dead activity for not having a home department
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(y =>
y.EmployeeId == john.EmployeeId &&
y.Reason == DeadActivityReason.MissingRequiredField &&
y.ReasonNote.ToLowerInvariant().Contains("reliably determinable home")) == 2)));
//Everyone else could not be identified
_deadActivityService.Verify(x => x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(y =>
(y.EmployeeId != john.EmployeeId && y.EmployeeId != mary.EmployeeId) &&
y.Reason == DeadActivityReason.MissingRequiredField &&
y.ReasonNote.ToLowerInvariant().Contains("action import, no user for")) == 3)));
}
[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(7, 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() == 7 &&
da.All(y => y.Reason == DeadActivityReason.MissingRequiredField) &&
da.All(y => y.ReasonNote.ToLowerInvariant().Contains("action import, no user for")))));
//Our test CSV has email information for every row except 1
_deadActivityService.Verify(x =>x.SaveDeadActivityRange(It.Is<List<DeadActivity>>(
da =>
da.Count(x => !string.IsNullOrWhiteSpace(x.EmployeeEmail)) == 6)));
}
}
}
@@ -0,0 +1,16 @@
BookedDate,MemberFirstName,MemberLastName,AppID,Principal,ProdDetailFirstName,ProdDetailLastName,ProdDetailEmail,ProdDetailEmployeeNum,IncentiveEarnedEmail,ProductShortName
11/4/2021 16:03,CHRISTOPHER,Doe,1721467,7800,Laurie,Doerson,[email protected],5306,,Rewards Credit Card
11/4/2021 15:52,Joseph,Doe,1721422,500,Michael,Doerson,[email protected],546,[email protected],Starter Credit Card
11/4/2021 15:27,Dalia,Doe,1721404,10000,Michael,Doerson,[email protected],546,[email protected],Qualifile CC
11/4/2021 15:50,Pablo,Doe,1721379,2000,Valerie,Doerson,[email protected],835,,Rewards Credit Card
11/4/2021 15:54,Antonio,Doe,1721245,500,Valerie,Doerson,[email protected],835,,Rewards Credit Card
11/4/2021 10:52,BARRY,Doe,1721090,5000,Alexandria,Doerson,[email protected],5313,,Rewards Credit Card
11/4/2021 9:31,SAMANTHA,Doe,1721022,500,Joseph,Doerson,[email protected],817,,Starter Credit Card
11/4/2021 10:08,EDWIN,Doe,1720844,500,Jeanfred,Doerson,[email protected],2455,,Rewards Credit Card
11/4/2021 10:49,DANIEL,Doe,1720766,500,Laurie,Doerson,[email protected],5306,,Student Rewards CC
11/4/2021 9:38,Traeci,Doe,1720546,12000,Monica,Doerson,[email protected],5503,,Rewards Credit Card
11/4/2021 11:00,CELINA,Doe,1720088,4500,Shannon,Doerson,[email protected],3723,[email protected],Rewards Credit Card
11/4/2021 13:34,CHAD,Doe,1719634,5000,Alexandria,Doerson,[email protected],5313,,Cash Back CC
11/4/2021 9:11,ELVIRA,Duplicate,1714817,1000,Daisy,Doerson,[email protected],822,,Rewards Credit Card
11/4/2021 9:11,Poppy,Doe,1714818,1000,Popeye,Doerson,,823,,Rewards Credit Card
11/4/2021 9:11,ELVIRA,Duplicate,1714817,1000,Daisy,,[email protected],822,,Rewards Credit Card
1 BookedDate MemberFirstName MemberLastName AppID Principal ProdDetailFirstName ProdDetailLastName ProdDetailEmail ProdDetailEmployeeNum IncentiveEarnedEmail ProductShortName
2 11/4/2021 16:03 CHRISTOPHER Doe 1721467 7800 Laurie Doerson [email protected] 5306 Rewards Credit Card
3 11/4/2021 15:52 Joseph Doe 1721422 500 Michael Doerson [email protected] 546 [email protected] Starter Credit Card
4 11/4/2021 15:27 Dalia Doe 1721404 10000 Michael Doerson [email protected] 546 [email protected] Qualifile CC
5 11/4/2021 15:50 Pablo Doe 1721379 2000 Valerie Doerson [email protected] 835 Rewards Credit Card
6 11/4/2021 15:54 Antonio Doe 1721245 500 Valerie Doerson [email protected] 835 Rewards Credit Card
7 11/4/2021 10:52 BARRY Doe 1721090 5000 Alexandria Doerson [email protected] 5313 Rewards Credit Card
8 11/4/2021 9:31 SAMANTHA Doe 1721022 500 Joseph Doerson [email protected] 817 Starter Credit Card
9 11/4/2021 10:08 EDWIN Doe 1720844 500 Jeanfred Doerson [email protected] 2455 Rewards Credit Card
10 11/4/2021 10:49 DANIEL Doe 1720766 500 Laurie Doerson [email protected] 5306 Student Rewards CC
11 11/4/2021 9:38 Traeci Doe 1720546 12000 Monica Doerson [email protected] 5503 Rewards Credit Card
12 11/4/2021 11:00 CELINA Doe 1720088 4500 Shannon Doerson [email protected] 3723 [email protected] Rewards Credit Card
13 11/4/2021 13:34 CHAD Doe 1719634 5000 Alexandria Doerson [email protected] 5313 Cash Back CC
14 11/4/2021 9:11 ELVIRA Duplicate 1714817 1000 Daisy Doerson [email protected] 822 Rewards Credit Card
15 11/4/2021 9:11 Poppy Doe 1714818 1000 Popeye Doerson 823 Rewards Credit Card
16 11/4/2021 9:11 ELVIRA Duplicate 1714817 1000 Daisy [email protected] 822 Rewards Credit Card
@@ -0,0 +1,10 @@
EmailAddress,Member_Number,Account_Number,Borrower_Name,APP_START_DATE,OPEN_DATE,PBorrowerSSN_Ind,CBorrowerName_Ind,CBorrowerSSN_Ind,SBorrowerName_Ind,SBorrowerSSN_Ind,IndAppID,IndProduct,IndAmtFinanced,IndCreationDate,IndAccountNumber,PBorrowerName_Veh,PBorrowerSSN_Veh,CBorrowerName_Veh,CBorrowerSSN_Veh,SBorrowerName_Veh,SBorrowerSSN_Veh,VehAppID,VehProduct,VehAmtFinanced,DistributionChannel,DistributionChannelCode
[email protected],69714,144,kenneth doerson,8/31/2021,9/8/2021,222334444,,,,,1692568,Ind Auto Truck,"$32,890.70",9/3/2021,69714-144,KENNETH doerson,222334444,,,,,1691319,Vehicle Pre-Approval,"47,000.00",New Berlin,2
[email protected],8091110,144,LOUIS DOE,9/1/2021,9/22/2021,333445555,JUNE DOE,111223333,,,1696816,Ind Prem Auto Truck,"$49,683.36",9/13/2021,8091110-144,LOUIS DOE,333445555,JUNE DOE,111223333,,,1691794,Vehicle,"45,147.36",Hartland,7
[email protected],8091110,144,LOUIS DOE,9/1/2021,9/22/2021,333445555,JUNE DOE,111223333,,,1696816,Ind Prem Auto Truck,"$49,683.36",9/13/2021,8091110-144,LOUIS DOE,333445555,JUNE DOE,111223333,,,1691794,Vehicle,"45,147.36",Hartland,7
[email protected],8091110,144,LOUIS DOE,9/1/2021,9/22/2021,333445555,JUNE DOE,111223333,,,1696816,Ind Prem Auto Truck,"$49,683.36",9/13/2021,8091110-144,LOUIS DOE,333445555,JUNE DOE,111223333,,,1691794,Vehicle,"45,147.36",Hartland,7
[email protected],8091110,144,LOUIS DOE,9/1/2021,9/22/2021,333445555,JUNE DOE,111223333,,,1696816,Ind Prem Auto Truck,"$49,683.36",9/13/2021,8091110-144,LOUIS DOE,333445555,JUNE DOE,111223333,,,1691794,Vehicle,"45,147.36",Hartland,7
[email protected],8091110,144,LOUIS DOE,9/1/2021,9/22/2021,333445555,JUNE DOE,111223333,,,1696816,Ind Prem Auto Truck,"$49,683.36",9/13/2021,8091110-144,LOUIS DOE,333445555,JUNE DOE,111223333,,,1691794,Vehicle,"45,147.36",Hartland,7
,8091110,144,LOUIS DOE,9/1/2021,9/22/2021,333445555,JUNE DOE,111223333,,,1696816,Ind Prem Auto Truck,"$49,683.36",9/13/2021,8091110-144,LOUIS DOE,333445555,JUNE DOE,111223333,,,1691794,Vehicle,"45,147.36",Hartland,7
1 EmailAddress Member_Number Account_Number Borrower_Name APP_START_DATE OPEN_DATE PBorrowerSSN_Ind CBorrowerName_Ind CBorrowerSSN_Ind SBorrowerName_Ind SBorrowerSSN_Ind IndAppID IndProduct IndAmtFinanced IndCreationDate IndAccountNumber PBorrowerName_Veh PBorrowerSSN_Veh CBorrowerName_Veh CBorrowerSSN_Veh SBorrowerName_Veh SBorrowerSSN_Veh VehAppID VehProduct VehAmtFinanced DistributionChannel DistributionChannelCode
2 [email protected] 69714 144 kenneth doerson 8/31/2021 9/8/2021 222334444 1692568 Ind Auto Truck $32,890.70 9/3/2021 69714-144 KENNETH doerson 222334444 1691319 Vehicle Pre-Approval 47,000.00 New Berlin 2
3 [email protected] 8091110 144 LOUIS DOE 9/1/2021 9/22/2021 333445555 JUNE DOE 111223333 1696816 Ind Prem Auto Truck $49,683.36 9/13/2021 8091110-144 LOUIS DOE 333445555 JUNE DOE 111223333 1691794 Vehicle 45,147.36 Hartland 7
4 [email protected] 8091110 144 LOUIS DOE 9/1/2021 9/22/2021 333445555 JUNE DOE 111223333 1696816 Ind Prem Auto Truck $49,683.36 9/13/2021 8091110-144 LOUIS DOE 333445555 JUNE DOE 111223333 1691794 Vehicle 45,147.36 Hartland 7
5 [email protected] 8091110 144 LOUIS DOE 9/1/2021 9/22/2021 333445555 JUNE DOE 111223333 1696816 Ind Prem Auto Truck $49,683.36 9/13/2021 8091110-144 LOUIS DOE 333445555 JUNE DOE 111223333 1691794 Vehicle 45,147.36 Hartland 7
6 [email protected] 8091110 144 LOUIS DOE 9/1/2021 9/22/2021 333445555 JUNE DOE 111223333 1696816 Ind Prem Auto Truck $49,683.36 9/13/2021 8091110-144 LOUIS DOE 333445555 JUNE DOE 111223333 1691794 Vehicle 45,147.36 Hartland 7
7 [email protected] 8091110 144 LOUIS DOE 9/1/2021 9/22/2021 333445555 JUNE DOE 111223333 1696816 Ind Prem Auto Truck $49,683.36 9/13/2021 8091110-144 LOUIS DOE 333445555 JUNE DOE 111223333 1691794 Vehicle 45,147.36 Hartland 7
8 8091110 144 LOUIS DOE 9/1/2021 9/22/2021 333445555 JUNE DOE 111223333 1696816 Ind Prem Auto Truck $49,683.36 9/13/2021 8091110-144 LOUIS DOE 333445555 JUNE DOE 111223333 1691794 Vehicle 45,147.36 Hartland 7