using System; using System.Threading.Tasks; using LCU.API.Internal.Operations.IncentiveApiLib.Repositories; using LCU.Library.Internal.IncentiveApiModels.Entities; using LCU.Library.Internal.IncentiveApiModels.Enums; using LCU.API.Internal.Operations.IncentiveApi.Extensions; using LCU.API.Internal.Operations.IncentiveApi.Models.ExternalActivities; using Moq; using NUnit.Framework; using LCU.API.Internal.Operations.IncentiveApiLib.Services; using LCU.API.Internal.Operations.IncentiveApi.Services.ExternalActivity; using LCU.API.Internal.Operations.IncentiveApi.Models.DataTransfer; namespace Application.UnitTests.Services.ExternalActivity { public class NewActivityManagerActivityStrategyTest { private Mock _mockUserService; private Mock _mockDepartmentRepository; private NewIncentiveManagerActivityStrategy _externalActivityService; [SetUp] public void Setup() { _mockUserService = new Mock(); _mockDepartmentRepository = new Mock(); _externalActivityService = new NewIncentiveManagerActivityStrategy(_mockUserService.Object, _mockDepartmentRepository.Object); } [TestCase("Atm Card", Product.ATMCard)] [TestCase("Check Card Referral", Product.CheckCard)] [TestCase("Checking Referral", Product.NewChecking)] [TestCase("Mortgage Referral", Product.Mortgage)] [TestCase("Direct Deposit", Product.DirectDeposit)] [TestCase("CC Balance Transfer", Product.CreditCardBalanceTransfer)] [TestCase("LIC Referral", Product.LIC)] public async Task NewIncentiveManagerActivityStrategy_Ok(string campaign, Product product) { var externalActivity = new NewActivityManagerReferral() { OriginatingBranchName = "MEQUON", OriginatorPersNbr = 5, OriginatorUserId = "JSMITHB", ReferredPersonNbr = "1234", ReferredPersOrgNbr = null, ReferralStation= "Submitted", StationDateTime = DateTime.Today.StartOfMonth(), Campaign = campaign, OriginationDateTime = DateTime.Parse("2021-03-10"), OriginatorFirstName = "John", OriginatorLastName = "Smith", OriginatorMiddleInitial = "B", EmployeeEmail = "JohnnySmith@landmarkcu.com" }; _mockUserService.Setup(x => x.GetUserByAdEmailAsync(It.IsAny())).ReturnsAsync(new AppUser() { AdEmail = "JohnnySmith@landmarkcu.com", EmployeeId = "7624" }); _mockDepartmentRepository.Setup(x => x.FindDepartmentByBranchName(It.IsAny())).ReturnsAsync( new Department() { Id = 10 } ); var activity = await _externalActivityService.MapToActivityManagerActivity(externalActivity); Assert.True(activity.Product == product); Assert.True(activity.Type == ActivityType.Referral); Assert.AreEqual(10, activity.DepartmentId); Assert.AreEqual("7624", activity.EmployeeId); _mockUserService.Verify(x => x.GetUserByAdEmailAsync(It.Is(x => x == "JohnnySmith@landmarkcu.com")), Times.Once); _mockDepartmentRepository.Verify(x => x.FindDepartmentByBranchName(It.Is(x => x == "MEQUON")), Times.Once); } [Test] public async Task NewIncentiveManagerActivityStrategy_NoEmail_Ok() { var externalActivity = new NewActivityManagerReferral() { OriginatingBranchName = "WEST BEND MAIN", OriginatorPersNbr = 5, OriginatorUserId = "JSMITHB", ReferredPersonNbr = "1234", ReferredPersOrgNbr = null, ReferralStation= "Submitted", StationDateTime = DateTime.Today.StartOfMonth(), Campaign = "ATM Card", OriginationDateTime = DateTime.Parse("2021-03-10"), OriginatorFirstName = "John", OriginatorLastName = "Smith", OriginatorMiddleInitial = "B", }; _mockUserService.Setup(x => x.GetUserByAdEmailAsync(It.IsAny())).ReturnsAsync((AppUser)null); _mockDepartmentRepository.Setup(x => x.FindDepartmentByBranchName(It.IsAny())).ReturnsAsync( new Department() { Id = 10 } ); var activity = await _externalActivityService.MapToActivityManagerActivity(externalActivity); Assert.True(activity.Product == Product.ATMCard); Assert.True(activity.Type == ActivityType.Referral); Assert.AreEqual(10, activity.DepartmentId); Assert.AreEqual(null, activity.EmployeeId); _mockUserService.Verify(x => x.TryFindSingleUserByName(It.IsAny()), Times.Once); _mockUserService.Verify(x => x.GetUserByAdEmailAsync(It.IsAny()), Times.Never); _mockDepartmentRepository.Verify(x => x.FindDepartmentByBranchName(It.Is(x => x == "WEST BEND MAIN")), Times.Once); } [Test] public async Task Throws_WhenUnknownProduct_OK() { var externalActivity = new NewActivityManagerReferral() { OriginatingBranchName = "WEST BEND MAIN", OriginatorPersNbr = 5, OriginatorUserId = "JSMITHB", ReferredPersonNbr = "1234", ReferredPersOrgNbr = null, ReferralStation= "Submitted", StationDateTime = DateTime.Today.StartOfMonth(), Campaign = "THIS PRODUCT DOES NOT EXIST", OriginationDateTime = DateTime.Parse("2021-03-10"), OriginatorFirstName = "John", OriginatorLastName = "Smith", OriginatorMiddleInitial = "B", }; _mockUserService.Setup(x => x.GetUserByAdEmailAsync(It.IsAny())).ReturnsAsync(new AppUser() { AdEmail = "JohnnySmith@landmarkcu.com", EmployeeId = "7624" }); _mockDepartmentRepository.Setup(x => x.FindUserHomeDepartment(It.IsAny())).ReturnsAsync( new Department() { Id = 10 } ); Assert.ThrowsAsync(async () => await _externalActivityService.MapToActivityManagerActivity(externalActivity)); _mockUserService.Verify(x => x.GetUserByAdEmailAsync(It.IsAny()), Times.Exactly(0)); _mockDepartmentRepository.Verify(x => x.FindDepartmentByBranchName(It.Is(x => x == "WEST BEND MAIN")), Times.Once); } [Test] public async Task NewIncentiveManagerActivityStrategy_NoDepartment_Ok() { var externalActivity = new NewActivityManagerReferral() { OriginatingBranchName = "WEST BEND MAIN", OriginatorPersNbr = 5, OriginatorUserId = "JSMITHB", ReferredPersonNbr = "1234", ReferredPersOrgNbr = null, ReferralStation= "Submitted", StationDateTime = DateTime.Today.StartOfMonth(), Campaign = "ATM Card", OriginationDateTime = DateTime.Parse("2021-03-10"), OriginatorFirstName = "John", OriginatorLastName = "Smith", OriginatorMiddleInitial = "B", EmployeeEmail = "JohnnySmith@landmarkcu.com" }; _mockUserService.Setup(x => x.GetUserByAdEmailAsync(It.IsAny())).ReturnsAsync(new AppUser() { AdEmail = "JohnnySmith@landmarkcu.com", EmployeeId = "7624" }); _mockDepartmentRepository.Setup(x => x.FindDepartmentByBranchName(It.IsAny())).ReturnsAsync((Department) null); var activity = await _externalActivityService.MapToActivityManagerActivity(externalActivity); Assert.True(activity.Product == Product.ATMCard); Assert.True(activity.Type == ActivityType.Referral); Assert.AreEqual(-1, activity.DepartmentId); Assert.AreEqual("7624", activity.EmployeeId); _mockUserService.Verify(x => x.GetUserByAdEmailAsync(It.Is(x => x == "JohnnySmith@landmarkcu.com")), Times.Once); _mockUserService.Verify(x => x.TryFindSingleUserByName(It.IsAny()), Times.Never); _mockDepartmentRepository.Verify(x => x.FindDepartmentByBranchName(It.Is(x => x == "WEST BEND MAIN")), Times.Once); } [Test] public async Task NewIncentiveManagerActivityStrategy_ExceptionReturnsBasic() { var externalActivity = new NewActivityManagerReferral() { OriginatingBranchName = "WEST BEND MAIN", OriginatorPersNbr = 5, OriginatorUserId = "JSMITHB", ReferredPersonNbr = "1234", ReferredPersOrgNbr = null, ReferralStation= "Submitted", StationDateTime = DateTime.Today.StartOfMonth(), Campaign = "ATM Card", OriginationDateTime = DateTime.Parse("2021-03-10"), OriginatorFirstName = "John", OriginatorLastName = "Smith", OriginatorMiddleInitial = "B", EmployeeEmail = "JohnnySmith@landmarkcu.com" }; _mockUserService.Setup(x => x.GetUserByAdEmailAsync(It.IsAny())).ReturnsAsync(new AppUser() { AdEmail = "JohnnySmith@landmarkcu.com", EmployeeId = "7624" }); _mockDepartmentRepository.Setup(x => x.FindDepartmentByBranchName(It.IsAny())) .ThrowsAsync(new Exception("OOPS")); var activity = await _externalActivityService.MapToActivityManagerActivity(externalActivity); Assert.True(activity.Product == Product.ATMCard); Assert.True(activity.Type == ActivityType.Referral); //we search for user before department, if department fails, we can still save user Assert.AreEqual(-1, activity.DepartmentId); Assert.AreEqual("7624", activity.EmployeeId); _mockUserService.Verify(x => x.GetUserByAdEmailAsync(It.Is(x => x == "JohnnySmith@landmarkcu.com")), Times.Once); _mockUserService.Verify(x => x.TryFindSingleUserByName(It.IsAny()), Times.Never); _mockDepartmentRepository.Verify(x => x.FindDepartmentByBranchName(It.Is(x => x == "WEST BEND MAIN")), Times.Once); } } }