Files
monorepo/LCU.API.Operations.IncentiveAPI/LCU.API.Internal.Operations.IncentiveApi.UnitTests/Services/Action/ActionCreditCardImportServiceTest.cs
T
2026-03-17 09:53:09 -05:00

383 lines
17 KiB
C#

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)));
}
}
}