using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using LCU.API.Internal.Operations.IncentiveApiLib.Persistence; using LCU.API.Internal.Operations.IncentiveApiLib.Repositories; using LCU.Library.Internal.IncentiveApiModels.Entities; using LCU.Library.Internal.IncentiveApiModels.Enums; using Microsoft.EntityFrameworkCore; using Moq; using NUnit.Framework; using LCU.Library.Internal.IncentiveApiModels.Common; namespace Application.UnitTests.Repository { public class DeadActivityRepositoryTest { private ApplicationDbContext _context; private DeadActivityRepository _repository; [SetUp] public void Setup() { var mockDateTime = new DateTimeService(); var mockCurrentUserService = Mock.Of(); Mock.Get(mockCurrentUserService).Setup(s => s.GetCurrentUser()).Returns(new ApplicationUser { Email = "JohnTest@test.com", }); var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .EnableSensitiveDataLogging() .Options; _context = new ApplicationDbContext(options, mockCurrentUserService, mockDateTime); _repository = new DeadActivityRepository(_context); } [Test] public async Task GetActivitiesAsync_Paginated_OK() { var activity1 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "1", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Accepted, Created = DateTime.Today.Subtract(TimeSpan.FromDays(7)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity1); var activity2 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 56, EmployeeId = "2", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Accepted, Created = DateTime.Today.Subtract(TimeSpan.FromDays(6)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity2); var activity3 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "3", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Rejected, Created = DateTime.Today.Subtract(TimeSpan.FromDays(6)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity3); var activity4 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "4", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Created, Created = DateTime.Today.Subtract(TimeSpan.FromDays(5)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity4); await _context.SaveChangesAsync(); var found = await _repository.GetPagedDeadActivities(1, 3); Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(3, found.Items.Count()); Assert.AreEqual(4, found.Total); Assert.True(found.Items.Any(x => x.EmployeeId == "4")); Assert.False(found.Items.Any(x => x.EmployeeId == "1")); Assert.True(found.Items.Any(x => x.EmployeeId == "2")); Assert.True(found.Items.Any(x => x.EmployeeId == "3")); found = await _repository.GetPagedDeadActivities(2, 3); Assert.AreEqual(1, found.Items.Count()); Assert.AreEqual(4, found.Total); Assert.False(found.Items.Any(x => x.EmployeeId == "4")); Assert.True(found.Items.Any(x => x.EmployeeId == "1")); Assert.False(found.Items.Any(x => x.EmployeeId == "2")); Assert.False(found.Items.Any(x => x.EmployeeId == "3")); found = await _repository.GetPagedDeadActivities(100, 3); Assert.AreEqual(4, found.Total); Assert.IsEmpty(found.Items); } [Test] public async Task GetDeadActivitiesByActivityProductAsync_OK() { var activity1 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "1", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-3), State = ActivityState.Accepted, LastUpdated = new DateTime(2021, 1, 4) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity1); var activity2 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 56, EmployeeId = "2", Type = ActivityType.Sale, Product = Product.NewChecking, Accepted = DateTime.Today.AddMinutes(-2), State = ActivityState.Accepted, LastUpdated = new DateTime(2021, 1, 3) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity2); var activity3 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "3", Type = ActivityType.Sale, Product = Product.NewChecking, Accepted = DateTime.Today.AddMinutes(-1), State = ActivityState.Rejected, LastUpdated = new DateTime(2021, 1, 2) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity3); var activity4 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "4", Type = ActivityType.Sale, Product = Product.NewChecking, Accepted = DateTime.Today, State = ActivityState.Accepted, LastUpdated = new DateTime(2021, 1, 1) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity4); await _context.SaveChangesAsync(); var filter = new DeadActivityFilter { Page = 1, Limit = 2, Product = new List { Product.CheckCard } }; var found = await _repository.GetFilteredDeadActivities(filter); Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(1, found.Items.Count()); Assert.AreEqual(1, found.Total); Assert.True(found.Items.Any(x => x.EmployeeId == "1")); } [Test] public async Task GetDeadActivitiesByActivityTypeAsync_OK() { var activity1 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "1", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-3), State = ActivityState.Accepted, LastUpdated = new DateTime(2021, 1, 4) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity1); var activity2 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 56, EmployeeId = "2", Type = ActivityType.Referral, Product = Product.NewChecking, Accepted = DateTime.Today.AddMinutes(-2), State = ActivityState.Accepted, LastUpdated = new DateTime(2021, 1, 3) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity2); var activity3 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "3", Type = ActivityType.Referral, Product = Product.NewChecking, Accepted = DateTime.Today.AddMinutes(-1), State = ActivityState.Rejected, LastUpdated = new DateTime(2021, 1, 2) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity3); var activity4 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "4", Type = ActivityType.Referral, Product = Product.NewChecking, Accepted = DateTime.Today, State = ActivityState.Accepted, LastUpdated = new DateTime(2021, 1, 1) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity4); await _context.SaveChangesAsync(); var filter = new DeadActivityFilter { Page = 1, Limit = 2, Type = new List { ActivityType.Sale } }; var found = await _repository.GetFilteredDeadActivities(filter); Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(1, found.Items.Count()); Assert.AreEqual(1, found.Total); Assert.True(found.Items.Any(x => x.EmployeeId == "1")); } [Test] public async Task GetFilteredDeadActivities_OK() { // You can't set last updated. So you'll get these back in reverse order you saved them. var activity1 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "1", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-5), State = ActivityState.Accepted, Created = DateTime.Today.Subtract(TimeSpan.FromDays(7)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity1); var activity2 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 56, EmployeeId = "2", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-4), State = ActivityState.Rejected, Created = DateTime.Today.Subtract(TimeSpan.FromDays(6)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity2); var activity3 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "3", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-3), State = ActivityState.Accepted, Created = DateTime.Today.Subtract(TimeSpan.FromDays(6)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity3); var activity4 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "4", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-2), State = ActivityState.Created, Created = DateTime.Today.Subtract(TimeSpan.FromDays(5)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity4); //null state var activity5 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 55, EmployeeId = "5", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-1), Created = DateTime.Today.Subtract(TimeSpan.FromDays(6)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity5); var activity6 = new DeadActivity(new Activity { Detail = new ActivityDetail(), DepartmentId = 56, EmployeeId = "6", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Accepted, Created = DateTime.Today.Subtract(TimeSpan.FromDays(6)) }, DeadActivityReason.MissingRequiredField, "Test"); await _repository.SaveDeadActivity(activity6); await _context.SaveChangesAsync(); var filter = new DeadActivityFilter { Page = 1, Limit = 2, State = new List { ActivityState.Accepted } }; var found = await _repository.GetFilteredDeadActivities(filter); Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(2, found.Items.Count()); Assert.AreEqual(3, found.Total); Assert.True(found.Items.Any(x => x.EmployeeId == "3")); Assert.False(found.Items.Any(x => x.EmployeeId == "4")); // not accepted Assert.False(found.Items.Any(x => x.EmployeeId == "1")); // not on this page Assert.False(found.Items.Any(x => x.EmployeeId == "5")); // not accepted Assert.True(found.Items.Any(x => x.EmployeeId == "6")); Assert.False(found.Items.Any(x => x.EmployeeId == "2")); // not accepted filter.Page = 2; found = await _repository.GetFilteredDeadActivities(filter); Assert.AreEqual(1, found.Items.Count()); Assert.AreEqual(3, found.Total); Assert.False(found.Items.Any(x => x.EmployeeId == "3")); Assert.False(found.Items.Any(x => x.EmployeeId == "2")); Assert.True(found.Items.Any(x => x.EmployeeId == "1")); Assert.False(found.Items.Any(x => x.EmployeeId == "4")); var filter2 = new DeadActivityFilter { Page = 1, Limit = 100, State = new List { ActivityState.ManualReview } }; found = await _repository.GetFilteredDeadActivities(filter2); Assert.AreEqual(0, found.Total); Assert.IsEmpty(found.Items); filter2.Page = 20; found = await _repository.GetFilteredDeadActivities(filter2); Assert.AreEqual(0, found.Total); Assert.IsEmpty(found.Items); } [Test] public async Task GetFilteredDeadActivities_More() { // You can't set last updated. So you'll get these back in reverse order you saved them. var activity1 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "1", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-4), State = ActivityState.Accepted, Detail = new ActivityDetail { MemberName = "John Doe" } }, DeadActivityReason.Other, "Test1"); await _repository.SaveDeadActivity(activity1); var activity2 = new DeadActivity(new Activity { DepartmentId = 56, EmployeeId = "2", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-3), State = ActivityState.Accepted, Detail = new ActivityDetail { SubjectPersonNbr = "1Jane3Doe" } }, DeadActivityReason.Other, "Test2"); await _repository.SaveDeadActivity(activity2); var activity3 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "3", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-2), State = ActivityState.Rejected, Detail = new ActivityDetail { AccountNumber = "1234" } }, DeadActivityReason.Other, "Test3"); await _repository.SaveDeadActivity(activity3); var activity4 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "4", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-1), State = ActivityState.Accepted, Detail = new ActivityDetail { AccountNumber = "12DOE35" } }, DeadActivityReason.Other, "Test4"); await _repository.SaveDeadActivity(activity4); //Everything in Query is null. should not match, should not error var activity5 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "4", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Accepted, Detail = new ActivityDetail() }, DeadActivityReason.Other, "Test4"); await _repository.SaveDeadActivity(activity5); await _context.SaveChangesAsync(); var filter = new DeadActivityFilter { Page = 1, Limit = 2, Query = "DoE" }; var found = await _repository.GetFilteredDeadActivities(filter); Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(2, found.Items.Count()); Assert.AreEqual(3, found.Total); Assert.False(found.Items.Any(x => x.EmployeeId == "3")); Assert.True(found.Items.Any(x => x.EmployeeId == "4")); Assert.False(found.Items.Any(x => x.EmployeeId == "1")); // not on this page Assert.True(found.Items.Any(x => x.EmployeeId == "2")); filter.Page = 2; found = await _repository.GetFilteredDeadActivities(filter); Assert.AreEqual(1, found.Items.Count()); Assert.AreEqual(3, found.Total); Assert.False(found.Items.Any(x => x.EmployeeId == "3")); Assert.False(found.Items.Any(x => x.EmployeeId == "2")); Assert.True(found.Items.Any(x => x.EmployeeId == "1")); Assert.False(found.Items.Any(x => x.EmployeeId == "4")); } [Test] public async Task GetActivitiesByFilter_Employee_Department() { var activity1 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "1", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-4), State = ActivityState.Accepted, Detail = new ActivityDetail { MemberName = "John Doe" } }, DeadActivityReason.Other, "Test1"); await _repository.SaveDeadActivity(activity1); var activity2 = new DeadActivity(new Activity { DepartmentId = 56, EmployeeId = "2", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-3), State = ActivityState.Accepted, Detail = new ActivityDetail { SubjectPersonNbr = "1Jane3Doe" } }, DeadActivityReason.Other, "Test2"); await _repository.SaveDeadActivity(activity2); var activity3 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "3", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-2), State = ActivityState.Rejected, Detail = new ActivityDetail { AccountNumber = "1234" } }, DeadActivityReason.Other, "Test3"); await _repository.SaveDeadActivity(activity3); var activity4 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "4", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-1), State = ActivityState.Accepted, Detail = new ActivityDetail { AccountNumber = "12DOE35" } }, DeadActivityReason.Other, "Test4"); await _repository.SaveDeadActivity(activity4); //Everything in Query is null. should not match, should not error var activity5 = new DeadActivity(new Activity { EmployeeId = "4", DepartmentId = -1, Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Accepted, Detail = new ActivityDetail() }, DeadActivityReason.Other, "Test5"); await _repository.SaveDeadActivity(activity5); await _context.SaveChangesAsync(); var filter = new DeadActivityFilter { Page = 1, Limit = 2, DepartmentId = 55 }; var found = await _repository.GetFilteredDeadActivities(filter); Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(2, found.Items.Count()); Assert.AreEqual(3, found.Total); Assert.True(found.Items.Any(x => x.EmployeeId == "3")); Assert.True(found.Items.Any(x => x.EmployeeId == "4")); Assert.False(found.Items.Any(x => x.EmployeeId == "1")); // not on this page Assert.False(found.Items.Any(x => x.EmployeeId == "2")); filter.EmployeeId = "4"; found = await _repository.GetFilteredDeadActivities(filter); Assert.AreEqual(1, found.Items.Count()); Assert.AreEqual(1, found.Total); Assert.False(found.Items.Any(x => x.EmployeeId == "3")); Assert.False(found.Items.Any(x => x.EmployeeId == "2")); Assert.False(found.Items.Any(x => x.EmployeeId == "1")); Assert.True(found.Items.Any(x => x.EmployeeId == "4")); filter.DepartmentId = 99; found = await _repository.GetFilteredDeadActivities(filter); Assert.AreEqual(0, found.Items.Count()); Assert.AreEqual(0, found.Total); } [Test] public async Task GetActivitiesByFilter_Sort() { var activity1 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "1", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-4), State = ActivityState.Accepted, Detail = new ActivityDetail { MemberName = "John Doe" } }, DeadActivityReason.Other, "Test1"); await _repository.SaveDeadActivity(activity1); var activity2 = new DeadActivity(new Activity { DepartmentId = 56, EmployeeId = "2", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-3), State = ActivityState.Accepted, Detail = new ActivityDetail { SubjectPersonNbr = "1Jane3Doe" } }, DeadActivityReason.Other, "Test2"); await _repository.SaveDeadActivity(activity2); var activity3 = new DeadActivity(new Activity { DepartmentId = 55, Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-2), State = ActivityState.Rejected, Detail = new ActivityDetail { AccountNumber = "1234" } }, DeadActivityReason.Other, "Test3"); await _repository.SaveDeadActivity(activity3); var activity4 = new DeadActivity(new Activity { DepartmentId = 55, EmployeeId = "4", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today.AddMinutes(-1), State = ActivityState.Accepted, Detail = new ActivityDetail { AccountNumber = "12DOE35" } }, DeadActivityReason.Other, "Test4"); await _repository.SaveDeadActivity(activity4); //Everything in Query is null. should not match, should not error var activity5 = new DeadActivity(new Activity { DepartmentId = -1, Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Accepted, Detail = new ActivityDetail() }, DeadActivityReason.Other, "Test5"); await _repository.SaveDeadActivity(activity5); await _context.SaveChangesAsync(); //Everything in Query is null. should not match, should not error var activity6 = new DeadActivity(new Activity { DepartmentId = -1, EmployeeId = "6", Type = ActivityType.Sale, Product = Product.CheckCard, Accepted = DateTime.Today, State = ActivityState.Accepted, Detail = new ActivityDetail() }, DeadActivityReason.Other, "Test6"); await _repository.SaveDeadActivity(activity6); var filter = new DeadActivityFilter { Page = 1, Limit = 99, DepartmentId = 55, SortBy = "EmployeeId" }; //NOTE: Null EmployeeId first var found = await _repository.GetFilteredDeadActivities(filter); var expected = new[] { "Test3", "Test1", "Test4" }; Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(3, found.Items.Count()); Assert.AreEqual(3, found.Total); var ordered = found.Items.Select(x => x.ReasonNote).ToArray(); Assert.AreEqual(expected, ordered); //NOTE: Null EmployeeId Last filter.SortDescending = true; found = await _repository.GetFilteredDeadActivities(filter); expected = new[] { "Test4", "Test1", "Test3" }; Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(3, found.Items.Count()); Assert.AreEqual(3, found.Total); ordered = found.Items.Select(x => x.ReasonNote).ToArray(); Assert.AreEqual(expected, ordered); filter.SortDescending = false; filter.SortBy = null; found = await _repository.GetFilteredDeadActivities(filter); expected = new[] { "Test4", "Test3", "Test1" }; Assert.NotNull(found); Assert.IsNotEmpty(found.Items); Assert.AreEqual(3, found.Items.Count()); Assert.AreEqual(3, found.Total); ordered = found.Items.Select(x => x.ReasonNote).ToArray(); Assert.AreEqual(expected, ordered); } } }