Adding
This commit is contained in:
+382
@@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
+374
@@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
+16
@@ -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
|
||||
|
+10
@@ -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
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user