Files
2026-03-17 09:53:09 -05:00

2952 lines
122 KiB
C#

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.API.Internal.Operations.IncentiveApi.Services;
using LCU.Library.Internal.IncentiveApiModels.Entities;
using LCU.Library.Internal.IncentiveApiModels.Enums;
using LCU.API.Internal.Operations.IncentiveApiLib.Extensions;
using Microsoft.EntityFrameworkCore;
using Moq;
using NUnit.Framework;
using NewLoanSaleActivity = LCU.API.Internal.Operations.IncentiveApi.Models.ExternalActivities.NewLoanSaleActivity;
using LCU.API.Internal.Operations.IncentiveApi.Exceptions;
using LCU.API.Internal.Operations.IncentiveApiLib.Services;
using LCU.Library.Internal.IncentiveApiModels.Common;
using LCU.API.Internal.Operations.IncentiveApi.Models.DataTransfer;
using LCU.API.Internal.Operations.IncentiveApi.Services.DuplicateDetection;
using LCU.API.Internal.Operations.IncentiveApi.Models.ExternalActivities;
using LCU.API.Internal.Operations.IncentiveApi.Services.MicroApiServices;
using LCU.Library.Internal.IncentiveApiModels.Requests;
namespace Application.UnitTests.Services
{
public class ActivityServiceTest
{
private ActivityService _activityService;
private IActivityRepository _activityRepository;
private IActivityChangeRepository _activityChangeRepository;
private IActivityTransferActionRepository _activityTransferActionRepository;
private ActivityService _mockedActivityService;
private Mock<IActivityRepository> _mockActivityRepository;
private Mock<IUnitOfWork> _mockUnitOfWork;
private Mock<IActivityChangeRepository> _mockActivityChangeRepository;
private Mock<IActivityTransferActionRepository> _mockActivityTransferActionRepository;
private Mock<IUserService> _mockUserService;
private Mock<INotificationApiService> _mockNotificationService;
private Mock<IDuplicateDetectionService> _mockDuplicateDetector;
private Mock<IAuthorizationService> _mockAuthorizationService;
[SetUp]
public void Setup()
{
var mockDateTime = new DateTimeService();
var mockCurrentUserService = Mock.Of<ICurrentUserService>();
Mock.Get(mockCurrentUserService).Setup(s => s.GetCurrentUser()).Returns(new ApplicationUser()
{
Email = "[email protected]",
});
var options = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.EnableSensitiveDataLogging(true)
.Options;
var context = new ApplicationDbContext(options, mockCurrentUserService, mockDateTime);
_activityRepository = new ActivityRepository(context);
_activityChangeRepository = new ActivityChangeRepository(context);
_activityTransferActionRepository = new ActivityTransferActionRepository(context);
_mockUserService = new Mock<IUserService>();
_mockNotificationService = new Mock<INotificationApiService>();
_mockDuplicateDetector = new Mock<IDuplicateDetectionService>();
_mockAuthorizationService = new Mock<IAuthorizationService>();
_activityService =
new ActivityService(_activityRepository, _activityChangeRepository, _activityTransferActionRepository,
_mockUserService.Object, _mockNotificationService.Object, _mockDuplicateDetector.Object,
_mockAuthorizationService.Object, new UnitOfWork(context));
//Create Fully Mocked Activity Service for Conditional Testing
_mockActivityRepository = new Mock<IActivityRepository>();
_mockActivityChangeRepository = new Mock<IActivityChangeRepository>();
_mockActivityTransferActionRepository = new Mock<IActivityTransferActionRepository>();
_mockUnitOfWork = new Mock<IUnitOfWork>();
_mockedActivityService = new ActivityService(_mockActivityRepository.Object,
_mockActivityChangeRepository.Object, _mockActivityTransferActionRepository.Object,
_mockUserService.Object, _mockNotificationService.Object, _mockDuplicateDetector.Object,
_mockAuthorizationService.Object, _mockUnitOfWork.Object);
}
[Test]
public async Task Basic_Flow()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
var saved = await _activityService.GetActivitiesAsync();
Assert.NotNull(saved);
Assert.IsEmpty(saved);
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activity = new Activity()
{
Id = 1,
SourceId = "1",
DepartmentId = 10,
EmployeeId = "113322"
};
var result = await _activityService.SaveActivityAsync(activity);
Assert.NotNull(result);
saved = await _activityService.GetActivitiesAsync();
Assert.NotNull(saved);
Assert.IsNotEmpty(saved);
_mockDuplicateDetector.Verify(x =>
x.TryFindDuplicates(It.IsAny<Activity>()), Times.Once);
}
[Test]
public async Task BasicSaveWithGapLogging_Flow()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
var saved = await _activityService.GetActivitiesAsync();
Assert.NotNull(saved);
Assert.IsEmpty(saved);
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activity = new Activity()
{
Id = 1,
SourceId = "1",
SourceSystem = SystemType.Dna,
DepartmentId = 10,
EmployeeId = "113322",
Product = Product.Vehicle,
Detail = new()
{
MemberName = "No company",
AccountBalance = 100000,
IsGapInsuranceEligible = false,
}
};
var result = await _activityService.SaveActivityAsync(activity);
Assert.NotNull(result);
saved = await _activityService.GetActivitiesAsync();
Assert.NotNull(saved);
Assert.IsNotEmpty(saved);
_mockDuplicateDetector.Verify(x =>
x.TryFindDuplicates(It.IsAny<Activity>()), Times.Once);
}
[Test]
public async Task BasicSaveWithNoGapLogging_Flow()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
var saved = await _activityService.GetActivitiesAsync();
Assert.NotNull(saved);
Assert.IsEmpty(saved);
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activity = new Activity()
{
Id = 1,
SourceId = "1",
SourceSystem = SystemType.Dna,
DepartmentId = 10,
EmployeeId = "113322",
Product = Product.Vehicle,
Detail = new()
{
MemberName = "company LLC",
AccountBalance = 100000,
IsGapInsuranceEligible = false,
}
};
var result = await _activityService.SaveActivityAsync(activity);
Assert.NotNull(result);
saved = await _activityService.GetActivitiesAsync();
Assert.NotNull(saved);
Assert.IsNotEmpty(saved);
_mockDuplicateDetector.Verify(x =>
x.TryFindDuplicates(It.IsAny<Activity>()), Times.Once);
}
[Test]
public void LogGapInformationFalseWithLLC()
{
var activity = new Activity()
{
Id = 1,
SourceId = "1",
SourceSystem = SystemType.Dna,
DepartmentId = 10,
EmployeeId = "113322",
Product = Product.Vehicle,
Detail = new()
{
MemberName = " llc",
AccountBalance = 100000,
IsGapInsuranceEligible = false,
}
};
var result = ActivityService.LogGapInformation(activity);
Assert.False(result);
}
[Test]
public void LogGapInformationTrueWithoutLLC()
{
var activity = new Activity()
{
Id = 1,
SourceId = "1",
SourceSystem = SystemType.Dna,
DepartmentId = 10,
EmployeeId = "113322",
Product = Product.Vehicle,
Detail = new()
{
MemberName = "Normal Member",
AccountBalance = 100000,
IsGapInsuranceEligible = false,
}
};
var result = ActivityService.LogGapInformation(activity);
Assert.True(result);
}
[Test]
public void LogGapInformationFalseWithInc()
{
var activity = new Activity()
{
Id = 1,
SourceId = "1",
SourceSystem = SystemType.Dna,
DepartmentId = 10,
EmployeeId = "113322",
Product = Product.Vehicle,
Detail = new()
{
MemberName = " Inc",
AccountBalance = 100000,
IsGapInsuranceEligible = false,
}
};
var result = ActivityService.LogGapInformation(activity);
Assert.False(result);
}
[Test]
public void LogGapInformationFalseWithoutSourceDna()
{
var activity = new Activity()
{
Id = 1,
SourceId = "1",
SourceSystem = SystemType.Allied,
DepartmentId = 10,
EmployeeId = "113322",
Product = Product.Vehicle,
Detail = new()
{
MemberName = "Normal",
AccountBalance = 100000,
IsGapInsuranceEligible = false,
}
};
var result = ActivityService.LogGapInformation(activity);
Assert.False(result);
}
[Test]
public void LogGapInformationFalseWithoutBalanceAmount()
{
var activity = new Activity()
{
Id = 1,
SourceId = "1",
SourceSystem = SystemType.Allied,
DepartmentId = 10,
EmployeeId = "113322",
Product = Product.Vehicle,
Detail = new()
{
MemberName = "Normal",
AccountBalance = 100001,
IsGapInsuranceEligible = false,
}
};
var result = ActivityService.LogGapInformation(activity);
Assert.False(result);
}
[Test]
public async Task Save_RequiresValues_OK()
{
var saved = await _activityService.GetActivitiesAsync();
Assert.NotNull(saved);
Assert.IsEmpty(saved);
var activity = new Activity() { };
Assert.ThrowsAsync<DeadActivityException>(async () => await _activityService.SaveActivityAsync(activity));
activity = new Activity()
{
EmployeeId = "Test",
DepartmentId = -1,
};
Assert.ThrowsAsync<DeadActivityException>(async () => await _activityService.SaveActivityAsync(activity));
activity = new Activity()
{
DepartmentId = 5,
EmployeeId = null,
};
Assert.ThrowsAsync<DeadActivityException>(async () => await _activityService.SaveActivityAsync(activity));
}
[Test]
public async Task DuplicateActivity_BasicFlow()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activity1 = new Activity()
{
DepartmentId = 55,
EmployeeId = "1",
Type = ActivityType.Referral,
Product = Product.CheckCard,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceId = "2",
State = ActivityState.PendingReferral,
Detail = new ActivityDetail()
{
MemberName = "John Doe",
SubjectPersonNbr = "12345",
SubjectOrgNbr = "123"
}
};
await _activityService.SaveActivityAsync(activity1);
_mockDuplicateDetector.Verify(x =>
x.TryFindDuplicates(It.IsAny<Activity>()), Times.Once);
var found = await _activityService.GetActivitiesAsync();
Assert.NotNull(found);
Assert.IsNotEmpty(found);
Assert.AreEqual(1, found.Count());
Assert.AreEqual(0, found.Count(x => x.State == ActivityState.Rejected));
var changes = await _activityChangeRepository.GetActivityChangesByActivityId(found.First().Id);
Assert.NotNull(changes);
Assert.IsEmpty(changes);
_mockDuplicateDetector.Reset();
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>() { activity1 });
var activity2 = new Activity()
{
DepartmentId = 55,
EmployeeId = "1",
Type = ActivityType.Referral,
Product = Product.CheckCard,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceId = "1",
State = ActivityState.PendingReferral,
Detail = new ActivityDetail()
{
MemberName = "John Doe",
SubjectPersonNbr = "12345",
SubjectOrgNbr = "123"
}
};
await _activityService.SaveActivityAsync(activity2);
found = await _activityService.GetActivitiesAsync();
Assert.NotNull(found);
Assert.IsNotEmpty(found);
Assert.AreEqual(2, found.Count());
Assert.AreEqual(1, found.Count(x => x.State == ActivityState.Rejected));
var rejected = found.First(x => x.State == ActivityState.Rejected);
changes = await _activityChangeRepository.GetActivityChangesByActivityId(rejected.Id);
Assert.NotNull(changes);
Assert.IsNotEmpty(changes);
Assert.AreEqual(changes.First().ActivityId, rejected.Id);
Assert.AreEqual(changes.First().State, ActivityState.Rejected);
_mockDuplicateDetector.Verify(x =>
x.TryFindDuplicates(It.IsAny<Activity>()), Times.Once);
}
[Test]
public async Task Basic_State_Change_Flow()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activityAccepted = DateTime.Today.AddDays(-2);
var activity = new Activity()
{
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = activityAccepted,
SourceId = "2",
State = ActivityState.Created
};
var activityId = await _activityService.SaveActivityAsync(activity);
var stateChange1 = new ActivityStateChange()
{
ActivityId = activityId,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.Rejected
};
var updatedActivity = await _activityService.ApplyStateChange(stateChange1);
Assert.NotNull(updatedActivity);
Assert.AreEqual(ActivityState.Rejected, updatedActivity.State);
Assert.AreEqual(0, updatedActivity.MatchingActivityId);
// It was rejected, so the accepted date should change...
Assert.AreNotEqual(activityAccepted, updatedActivity.Accepted);
var stateChange2 = new ActivityStateChange()
{
ActivityId = activityId,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.ManualReview
};
activity.Accepted = activityAccepted;
updatedActivity = await _activityService.ApplyStateChange(stateChange2);
Assert.NotNull(updatedActivity);
Assert.AreEqual(ActivityState.ManualReview, updatedActivity.State);
// don't change the date, it wasn't accepted or rejected.
Assert.AreEqual(activityAccepted, updatedActivity.Accepted);
var result = await _activityChangeRepository.GetActivityChangesByActivityId(activityId);
Assert.NotNull(result);
Assert.AreEqual(2, result.Count);
Assert.AreNotEqual(activity.Created, activity.LastUpdated);
updatedActivity = await _activityRepository.GetActivityById(activityId);
Assert.AreEqual(ActivityState.ManualReview, updatedActivity.State);
var stateChange3 = new ActivityStateChange()
{
ActivityId = activityId,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.Accepted,
AcceptedDate = DateTime.Parse("2/8/2022")
};
activity.Accepted = activityAccepted;
updatedActivity = await _activityService.ApplyStateChange(stateChange3);
Assert.NotNull(updatedActivity);
Assert.AreEqual(ActivityState.Accepted, updatedActivity.State);
// date is changed and set to +12 of StateChange AcceptedDate
Assert.AreEqual(DateTime.Parse("2/8/2022").Date.AddHours(12), updatedActivity.Accepted);
var result2 = await _activityChangeRepository.GetActivityChangesByActivityId(activityId);
Assert.NotNull(result2);
Assert.AreEqual(3, result2.Count);
Assert.AreNotEqual(activity.Created, activity.LastUpdated);
updatedActivity = await _activityRepository.GetActivityById(activityId);
Assert.AreEqual(ActivityState.Accepted, updatedActivity.State);
}
[Test]
public async Task Exception_State_Change()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activityAccepted = DateTime.Today.AddDays(-2);
var activity = new Activity()
{
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = activityAccepted,
SourceId = "2",
State = ActivityState.Accepted
};
var activityId = await _activityService.SaveActivityAsync(activity);
var stateChange1 = new ActivityStateChange()
{
ActivityId = 9999999,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.Rejected
};
Assert.ThrowsAsync<NotFoundException>(async () => { await _activityService.ApplyStateChange(stateChange1); });
var stateChange2 = new ActivityStateChange()
{
ActivityId = activityId,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.Rejected,
ActivityMatchId = activityId
};
Assert.ThrowsAsync<Exception>(async () => { await _activityService.ApplyStateChange(stateChange2); });
}
[Test]
public async Task Basic_State_Change_Duplicate_Reject()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activityAccepted = DateTime.Today.AddDays(-2);
var activity = new Activity()
{
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = activityAccepted,
SourceId = "1",
State = ActivityState.Accepted
};
var activityId = await _activityService.SaveActivityAsync(activity);
var duplicate = new Activity()
{
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = activityAccepted,
SourceId = "2",
State = ActivityState.Accepted
};
var duplicateId = await _activityService.SaveActivityAsync(duplicate);
activity = await _activityService.GetActivity(activityId);
duplicate = await _activityService.GetActivity(duplicateId);
Assert.AreEqual(ActivityState.Accepted, activity.State);
Assert.AreEqual(0, activity.MatchingActivityId);
Assert.AreEqual(ActivityState.Accepted, duplicate.State);
Assert.AreEqual(0, duplicate.MatchingActivityId);
var stateChange1 = new ActivityStateChange()
{
ActivityId = duplicateId,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.Rejected,
ActivityMatchId = activityId
};
var updatedActivity = await _activityService.ApplyStateChange(stateChange1);
activity = await _activityService.GetActivity(activityId);
duplicate = await _activityService.GetActivity(duplicateId);
Assert.NotNull(activity);
Assert.NotNull(duplicate);
Assert.AreEqual(ActivityState.Rejected, duplicate.State);
Assert.AreEqual(activityId, duplicate.MatchingActivityId);
Assert.AreEqual(0, activity.MatchingActivityId);
// It was rejected, so the accepted date should change...
Assert.AreNotEqual(activityAccepted, duplicate.Accepted);
}
[Test]
public async Task Basic_State_Change_Manual_Review()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activityAccepted = DateTime.Today.AddDays(-2).AddHours(12);
var activity = new Activity()
{
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = activityAccepted,
SourceId = "2",
State = ActivityState.Accepted
};
var activityId = await _activityService.SaveActivityAsync(activity);
activity = await _activityService.GetActivity(activityId);
Assert.AreEqual(ActivityState.Accepted, activity.State);
Assert.AreEqual(0, activity.MatchingActivityId);
var stateChange1 = new ActivityStateChange()
{
ActivityId = activityId,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.ManualReview
};
var updatedActivity = await _activityService.ApplyStateChange(stateChange1);
activity = await _activityService.GetActivity(activityId);
Assert.NotNull(activity);
Assert.AreEqual(ActivityState.ManualReview, activity.State);
Assert.AreEqual(0, activity.MatchingActivityId);
// accepted date should not change...
Assert.AreEqual(activityAccepted, activity.Accepted);
}
[Test]
public async Task ApplyStateChange_Exception_No_Existing_Activity()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activity = new Activity()
{
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today,
SourceId = "2",
State = ActivityState.Created
};
var activityId = await _activityService.SaveActivityAsync(activity);
var stateChange1 = new ActivityStateChange()
{
ActivityId = 1155151511,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.Rejected
};
Assert.ThrowsAsync<NotFoundException>(async () => { await _activityService.ApplyStateChange(stateChange1); });
var result = await _activityChangeRepository.GetActivityChangesByActivityId(1155151511);
Assert.NotNull(result);
Assert.AreEqual(0, result.Count);
}
[Test]
public async Task ApplyStateChange_No_Change()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activity = new Activity()
{
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
LastUpdated = DateTime.Parse("1999/12/31"),
Accepted = DateTime.Now,
SourceId = "1",
State = ActivityState.Created
};
var activityId = await _activityService.SaveActivityAsync(activity);
var stateChange1 = new ActivityStateChange()
{
ActivityId = activityId,
Created = DateTime.Today,
CreatedBy = "DNA",
CreatedByType = UserType.System,
State = ActivityState.Created
};
System.Threading.Thread.Sleep(100);
//Assert that no change has been made to the existing activity for duplicate state
activity = await _activityService.ApplyStateChange(stateChange1);
Assert.AreNotEqual(activity.Created, activity.LastUpdated);
var result = await _activityChangeRepository.GetActivityChangesByActivityId(activityId);
Assert.NotNull(result);
Assert.AreEqual(1, result.Count);
}
[Test]
public async Task GetActivityForStateUpdate_Exception_No_Existing_Activity()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
var existingActivity = new Activity
{
Id = 1,
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.GAPInsurance,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
State = ActivityState.Accepted,
SourceId = "1",
Detail = new ActivityDetail()
{
AccountNumber = "867530986",
MemberName = "ORLANDO TESTCUSTOMER10"
}
};
var activityId = await _activityService.SaveActivityAsync(existingActivity);
var updateActivity = new Activity
{
DepartmentId = existingActivity.DepartmentId,
EmployeeId = existingActivity.EmployeeId,
Type = existingActivity.Type,
Product = existingActivity.Product,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceId = existingActivity.SourceId,
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
State = existingActivity.State,
Detail = existingActivity.Detail
};
Assert.DoesNotThrowAsync(async () => { await _activityService.GetActivityForStateUpdate(existingActivity); });
Assert.DoesNotThrowAsync(async () => { await _activityService.GetActivityForStateUpdate(updateActivity); });
}
[Test]
public async Task GetActivityForStateUpdate_Ok()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
var existingActivity = new Activity
{
Id = 1,
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.GAPInsurance,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceId = "2",
State = ActivityState.Accepted,
Detail = new ActivityDetail()
{
AccountNumber = "867530986",
MemberName = "ORLANDO TESTCUSTOMER10"
}
};
var activityId = await _activityService.SaveActivityAsync(existingActivity);
var updateActivity = new Activity
{
DepartmentId = existingActivity.DepartmentId,
EmployeeId = existingActivity.EmployeeId,
Type = existingActivity.Type,
Product = existingActivity.Product,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceId = existingActivity.SourceId,
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
State = ActivityState.Rejected,
Detail = existingActivity.Detail
};
System.Threading.Thread.Sleep(100);
var returnedActivity = await _activityService.GetActivityForStateUpdate(updateActivity);
Assert.AreNotEqual(existingActivity, updateActivity);
Assert.AreEqual(existingActivity, returnedActivity);
}
[Test]
public async Task ListByFilterAsync_JustPage_Ok()
{
_mockActivityRepository.Setup(x =>
x.GetPagedFilteredActivities(It.IsAny<ActivityFilter>()))
.ReturnsAsync(new PagedResult<Activity>() { Items = new List<Activity>(), Total = 1000 });
_mockActivityRepository.Setup(x => x.GetActivitiesAsync(It.IsAny<int>(), It.IsAny<int>()))
.Verifiable();
var result = await _mockedActivityService.ListByFilterAsync(new ActivityFilter() { Page = 1, Limit = 100 });
Assert.NotNull(result);
Assert.AreEqual(1000, result.Total);
//When states null, calls GetActivityAsync
_mockActivityRepository.Verify(
x => x.GetPagedFilteredActivities(It.IsAny<ActivityFilter>()),
Times.Once);
_mockActivityRepository.Verify(x => x.GetActivitiesAsync(It.IsAny<int>(), It.IsAny<int>()), Times.Never);
}
[Test]
public async Task ListByFilterAsync_NoResults_Ok()
{
_mockActivityRepository.Setup(x =>
x.GetPagedFilteredActivities(It.IsAny<ActivityFilter>()))
.ReturnsAsync(new PagedResult<Activity>() { Items = new List<Activity>(), Total = 0 });
_mockActivityRepository.Setup(x => x.GetActivitiesAsync(It.IsAny<int>(), It.IsAny<int>()))
.Verifiable();
var result = await _mockedActivityService.ListByFilterAsync(new ActivityFilter() { Page = 1, Limit = 100 });
Assert.NotNull(result);
Assert.AreEqual(0, result.Total);
_mockActivityRepository.Verify(
x => x.GetPagedFilteredActivities(It.IsAny<ActivityFilter>()),
Times.Once);
_mockActivityRepository.Verify(x => x.GetActivitiesAsync(It.IsAny<int>(), It.IsAny<int>()), Times.Never);
}
[Test]
public async Task GetDepartmentActivityForMonthRangeAsync_BasicFlow()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
_mockDuplicateDetector.Setup(x =>
x.TryFindDuplicates(It.IsAny<Activity>()))
.ReturnsAsync(new List<Activity>());
var activity1 = new Activity()
{
DepartmentId = 55,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
SourceId = "1",
Accepted = DateTime.Today
};
await _activityService.SaveActivityAsync(activity1);
var activity2 = new Activity()
{
DepartmentId = 56,
EmployeeId = "11771",
Type = ActivityType.Sale,
Product = Product.CheckCard,
SourceId = "2",
Accepted = DateTime.Today
};
await _activityService.SaveActivityAsync(activity2);
var activity3 = new Activity()
{
DepartmentId = 55,
EmployeeId = "11772",
Type = ActivityType.Sale,
Product = Product.CheckCard,
SourceId = "3",
Accepted = DateTime.Today.AddMonths(-1)
};
await _activityService.SaveActivityAsync(activity3);
var user = new AppUser()
{
Role = Role.Admin,
AdEmail = "[email protected]",
BaseRole = "Tester",
EmployeeId = "11771",
FullName = "Test McTester",
HomeDepartment = "HOME",
PersonId = 11771,
Departments = new List<UserDepartment>()
{
new UserDepartment()
{
DepartmentId = 55,
Department = new Department()
{
Id = 55,
State = DepartmentState.Active,
DepartmentName = "Test",
BusinessLineCode = BusinessLine.Operations.Code
}
}
}
};
var range = new MonthRange
(
DateTime.Today.Year,
DateTime.Today.Month,
DateTime.Today.Year,
DateTime.Today.Month
);
var found = await _activityService.GetDepartmentActivityForMonthRangeAsync(user.Departments, range);
Assert.NotNull(found);
Assert.IsNotEmpty(found.First().Progress.ProductActivity);
Assert.IsNotEmpty(found.First().ActivityAudit);
Assert.AreEqual(1, found.First().ActivityAudit.Count());
}
[Test]
public async Task GetDepartmentActivityForMonthRangeAsync_NoAssignmentInMonthRange_ReturnsEmpty()
{
var userDepartments = new List<UserDepartment>
{
new UserDepartment()
{
DepartmentId = 55,
Department = new Department()
{
Id = 55,
State = DepartmentState.Active,
DepartmentName = "Test",
BusinessLineCode = BusinessLine.Operations.Code
},
StartDate = DateTime.Today,
EndDate = DateTime.Today
}
};
var range = new MonthRange(
2021,
11,
2021,
12
);
var found = await _activityService.GetDepartmentActivityForMonthRangeAsync(userDepartments, range);
Assert.IsEmpty(found);
}
[Test]
public async Task GetActivity_ReturnsActivity()
{
var activityFromRepo = new Activity
{
Id = 3,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today,
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(3))
.ReturnsAsync(activityFromRepo);
var result = await _mockedActivityService.GetActivity(3);
Assert.NotNull(result);
Assert.AreEqual(3, result.Id);
}
[Test]
public async Task MatchOrExpireReferrals_Match_OnPersonId()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
});
var activityOne = new Activity
{
Id = 67260,
DepartmentId = 53,
EmployeeId = "9585",
Type = ActivityType.Sale,
Product = Product.NewChecking,
Accepted = DateTime.Today,
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceId = "255557196",
State = ActivityState.Accepted,
Detail = new ActivityDetail
{
IsDebtProtectionEligible = false,
SubjectPersonNbr = "80542"
}
};
var activityTwo = new Activity
{
Id = 67247,
DepartmentId = 53,
EmployeeId = "12133",
Type = ActivityType.Referral,
Product = Product.NewChecking,
Accepted = DateTime.Today,
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceId = "4977",
State = ActivityState.PendingReferral,
Detail = new ActivityDetail
{
IsDebtProtectionEligible = false,
SubjectPersonNbr = "80542"
}
};
await _activityService.SaveActivityAsync(activityOne);
await _activityService.SaveActivityAsync(activityTwo);
await _activityService.MatchOrExpireReferrals();
var activityOneStateChanges = await _activityService.GetActivityStateChanges(activityOne.Id);
var activityTwoStateChanges = await _activityService.GetActivityStateChanges(activityTwo.Id);
Assert.NotNull(activityOneStateChanges);
Assert.NotNull(activityTwoStateChanges);
Assert.IsEmpty(activityOneStateChanges);
Assert.IsNotEmpty(activityTwoStateChanges);
Assert.AreEqual(activityOne.Id, activityTwoStateChanges.FirstOrDefault().ActivityMatchId);
_mockUserService.Verify(mock => mock.GetUserByEmployeeIdAsync(It.IsAny<string>()), Times.Never);
}
[Test]
public async Task MatchOrExpireReferrals_NoMatch_NoExpire()
{
var referral1 = new Activity
{
Id = 1,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today,
Detail = new ActivityDetail(),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var referral2 = new Activity
{
Id = 2,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today,
Detail = new ActivityDetail(),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var basicList = new List<Activity>()
{
referral1, referral2
};
_mockActivityRepository.Setup(mock => mock.FindUnmatchedReferrals())
.ReturnsAsync(basicList);
_mockActivityRepository.Setup(mock => mock.FindUnmatchedSaleForReferral(referral1))
.ReturnsAsync((Activity)null);
_mockActivityRepository.Setup(mock => mock.FindUnmatchedSaleForReferral(referral2))
.ReturnsAsync((Activity)null);
_mockActivityRepository.Setup(mock => mock.GetActivityById(1))
.ReturnsAsync(referral1);
_mockActivityRepository.Setup(mock => mock.GetActivityById(2))
.ReturnsAsync(referral2);
_mockActivityChangeRepository.Setup(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()))
.Verifiable();
_mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Verifiable();
var results = await _mockedActivityService.MatchOrExpireReferrals();
Assert.NotNull(results);
Assert.IsEmpty(results);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedReferrals(), Times.Once);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedSaleForReferral(referral1), Times.Once);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedSaleForReferral(referral2), Times.Once);
_mockActivityRepository.Verify(mock => mock.GetActivityById(1), Times.Never);
_mockActivityRepository.Verify(mock => mock.GetActivityById(2), Times.Never);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()),
Times.Never);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
_mockUserService.Verify(mock => mock.GetUserByEmployeeIdAsync(It.IsAny<string>()), Times.Never);
}
[Test]
public async Task MatchOrExpireReferrals_Match_NoExpire()
{
var referral1 = new Activity
{
Id = 1,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today,
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var referral2 = new Activity
{
Id = 2,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today,
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var sale1 = new Activity
{
Id = 3,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today,
SourceCreated = DateTime.Today,
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var basicList = new List<Activity>()
{
referral1, referral2
};
_mockActivityRepository.Setup(mock => mock.FindUnmatchedReferrals())
.ReturnsAsync(basicList);
_mockActivityRepository.Setup(mock => mock.FindUnmatchedSaleForReferral(referral1))
.ReturnsAsync((Activity)sale1);
_mockActivityRepository.Setup(mock => mock.FindUnmatchedSaleForReferral(referral2))
.ReturnsAsync((Activity)null);
_mockActivityRepository.Setup(mock => mock.GetActivityById(1))
.ReturnsAsync(referral1);
_mockActivityRepository.Setup(mock => mock.GetActivityById(2))
.ReturnsAsync(referral2);
_mockActivityRepository.Setup(mock => mock.GetActivityById(3))
.ReturnsAsync(sale1);
_mockActivityChangeRepository.Setup(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()))
.Verifiable();
_mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Verifiable();
var results = await _mockedActivityService.MatchOrExpireReferrals();
Assert.NotNull(results);
Assert.IsNotEmpty(results);
Assert.AreEqual(ActivityState.Accepted, results.First().State);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedReferrals(), Times.Once);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedSaleForReferral(referral1), Times.Once);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedSaleForReferral(referral2), Times.Once);
_mockActivityRepository.Verify(mock => mock.GetActivityById(1), Times.Once);
_mockActivityRepository.Verify(mock => mock.GetActivityById(2), Times.Never);
// They matched! so they should be linked together.
Assert.AreEqual(sale1.Id, referral1.MatchingActivityId);
Assert.AreEqual(referral1.Id, sale1.MatchingActivityId);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()),
Times.Once);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Once);
_mockUserService.Verify(mock => mock.GetUserByEmployeeIdAsync(It.IsAny<string>()), Times.Never);
}
[Test]
public async Task MatchOrExpireReferrals_NoMatch_Expire()
{
var referral1 = new Activity
{
Id = 1,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(61)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(61)),
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var referral2 = new Activity
{
Id = 2,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.CheckCard,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var referral3 = new Activity
{
Id = 3,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.FirstMortgageReferral,
Accepted = DateTime.Today.Subtract(TimeSpan.FromDays(121)),
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(121)),
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var basicList = new List<Activity>()
{
referral1, referral2, referral3
};
_mockActivityRepository.Setup(mock => mock.FindUnmatchedReferrals())
.ReturnsAsync(basicList);
_mockActivityRepository.Setup(mock => mock.FindUnmatchedSaleForReferral(referral1))
.ReturnsAsync((Activity)null);
_mockActivityRepository.Setup(mock => mock.FindUnmatchedSaleForReferral(referral2))
.ReturnsAsync((Activity)null);
_mockActivityRepository.Setup(mock => mock.FindUnmatchedSaleForReferral(referral3))
.ReturnsAsync((Activity)null);
_mockActivityRepository.Setup(mock => mock.GetActivityById(1))
.ReturnsAsync(referral1);
_mockActivityRepository.Setup(mock => mock.GetActivityById(2))
.ReturnsAsync(referral2);
_mockActivityRepository.Setup(mock => mock.GetActivityById(3))
.ReturnsAsync(referral3);
_mockActivityChangeRepository.Setup(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()))
.Verifiable();
_mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Verifiable();
var results = await _mockedActivityService.MatchOrExpireReferrals();
Assert.NotNull(results);
Assert.IsNotEmpty(results);
Assert.AreEqual(ActivityState.Rejected, results.Single(r => r.ActivityId == 1).State);
Assert.AreEqual(ActivityState.Rejected, results.Single(r => r.ActivityId == 3).State);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedReferrals(), Times.Once);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedSaleForReferral(referral1), Times.Once);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedSaleForReferral(referral2), Times.Once);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedSaleForReferral(referral3), Times.Once);
_mockActivityRepository.Verify(mock => mock.GetActivityById(1), Times.Once);
_mockActivityRepository.Verify(mock => mock.GetActivityById(2), Times.Never);
_mockActivityRepository.Verify(mock => mock.GetActivityById(3), Times.Once);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()),
Times.Exactly(2));
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Exactly(2));
}
[Test]
public async Task MatchOrExpireReferrals_SameEmployeeOnMatchedActivities_RejectReferral()
{
var referral = new Activity
{
Id = 1,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Referral,
Product = Product.NewChecking, // Only NewChecking referrals are rejected in this scenario
Accepted = DateTime.Today,
SourceCreated = DateTime.Today.Subtract(TimeSpan.FromDays(7)),
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var sale = new Activity
{
Id = 3,
DepartmentId = 32,
EmployeeId = "1",
Type = ActivityType.Sale,
Product = Product.NewChecking,
Accepted = DateTime.Today,
SourceCreated = DateTime.Today,
Detail = new ActivityDetail(),
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
var creditedEmployee = new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "1",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
};
_mockActivityRepository.Setup(mock => mock.FindUnmatchedReferrals())
.ReturnsAsync(new List<Activity>() { referral });
_mockActivityRepository.Setup(mock => mock.FindUnmatchedSaleForReferral(referral))
.ReturnsAsync((Activity)sale);
_mockActivityRepository.Setup(mock => mock.GetActivityById(referral.Id))
.ReturnsAsync(referral);
_mockActivityRepository.Setup(mock => mock.GetActivityById(sale.Id))
.ReturnsAsync(sale);
_mockUserService.Setup(mock => mock.GetUserByEmployeeIdAsync(sale.EmployeeId))
.ReturnsAsync(creditedEmployee);
_mockActivityChangeRepository.Setup(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()))
.Verifiable();
_mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Verifiable();
var results = await _mockedActivityService.MatchOrExpireReferrals();
Assert.NotNull(results);
Assert.IsNotEmpty(results);
//There are two state changes, one for accepted and the other for rejected
Assert.IsTrue(results.Count == 2);
Assert.AreEqual(ActivityState.Accepted, results.ElementAt(0).State);
Assert.AreEqual(ActivityState.Rejected, results.ElementAt(1).State);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedReferrals(), Times.Once);
_mockActivityRepository.Verify(mock => mock.FindUnmatchedSaleForReferral(referral), Times.Once);
_mockActivityRepository.Verify(mock => mock.GetActivityById(1), Times.Exactly(2));
// They matched! so they should be linked together.
Assert.AreEqual(sale.Id, referral.MatchingActivityId);
Assert.AreEqual(referral.Id, sale.MatchingActivityId);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()),
Times.Exactly(2));
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Exactly(2));
_mockUserService.Verify(mock => mock.GetUserByEmployeeIdAsync(sale.EmployeeId), Times.Once());
}
[Test]
public void GetActivityAuthorizedCommands_ActivityIsNull_ThrowsNotFoundException()
{
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(1))
.ReturnsAsync((Activity)null);
var exception = Assert.ThrowsAsync<NotFoundException>(async () =>
{
await _mockedActivityService.GetActivityAuthorizedCommands(new AppUser(), 1);
});
Assert.NotNull(exception);
Assert.IsInstanceOf<NotFoundException>(exception);
Assert.AreEqual("No activity with Id 1 could be found", exception.Message);
}
[Test]
public async Task GetActivityAuthorizedCommands_PendingTransferActivity_ReturnsAuthCommands()
{
var inThePast = DateTime.Now.AddDays(-90);
var targetDepartmentId = 2;
var user = new AppUser
{
Departments = new List<UserDepartment>()
{
new UserDepartment()
{
DepartmentId = targetDepartmentId,
StartDate = inThePast,
EndDate = null,
Role = Role.BOM
}
}
};
var activity = new Activity()
{
Id = 1,
State = ActivityState.PendingTransfer,
DepartmentId = 1
};
var activityTransferAction = new ActivityTransferAction() { NewActivityDepartmentId = targetDepartmentId };
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(1))
.ReturnsAsync(activity);
_mockAuthorizationService.Setup(mock => mock.ValidateHierarchicalDepartmentPermission(user, Role.DepartmentManagerRoles, activity.DepartmentId))
.ReturnsAsync(false);
_mockAuthorizationService.Setup(mock => mock.AppUserCanMakeStateChange(user, activity, It.IsAny<ActivityState>(), It.IsAny<int>()))
.ReturnsAsync(true);
_mockActivityTransferActionRepository.Setup(mock => mock.GetRequestedTransferActionByActivityId(activity.Id))
.ReturnsAsync(activity.State == ActivityState.PendingTransfer ? activityTransferAction : null);
var authorizedCommands = await _mockedActivityService.GetActivityAuthorizedCommands(user, activity.Id);
Assert.IsTrue(authorizedCommands.AllowedChanges.Contains(ActivityState.Transferred));
Assert.IsTrue(authorizedCommands.AllowedChanges.Contains(ActivityState.Accepted));
Assert.IsTrue(authorizedCommands.CanApproveTransferFrom);
Assert.IsTrue(authorizedCommands.CanApproveTransferTo);
}
[Test]
public void GetActivity_NotFound()
{
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(3))
.ReturnsAsync((Activity)null);
var exception = Assert.ThrowsAsync<NotFoundException>(async () => { await _mockedActivityService.GetActivity(3); });
Assert.NotNull(exception);
Assert.IsInstanceOf<NotFoundException>(exception);
Assert.AreEqual("No activity with Id 3 could be found", exception.Message);
}
[Test]
public void ValidateCanApplyActivityStateChange_NotFound()
{
var user = new AppUser();
var stateChange = new ActivityStateChange
{
ActivityId = 11,
Note = "Change",
State = ActivityState.Accepted
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync((Activity)null);
var exception = Assert.ThrowsAsync<NotFoundException>(async () =>
{
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
});
Assert.NotNull(exception);
Assert.IsInstanceOf<NotFoundException>(exception);
Assert.AreEqual("No activity with Id 11 could be found", exception.Message);
}
[Test]
public void ValidateCanApplyActivityStateChange_HasPayouts()
{
var user = new AppUser();
var stateChange = new ActivityStateChange
{
ActivityId = 11,
Note = "Change",
State = ActivityState.Accepted
};
var activityWithPayouts = new Activity
{
ActivityPayouts = new List<ActivityPayoutLineItem> { new ActivityPayoutLineItem() }
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activityWithPayouts);
var exception = Assert.ThrowsAsync<BadActivityStateChangeException>(async () =>
{
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
});
Assert.NotNull(exception);
Assert.IsInstanceOf<BadActivityStateChangeException>(exception);
Assert.AreEqual("Cannot change the state of an activity that has a payout.", exception.Message);
}
[Test]
public void ValidateCanApplyActivityStateChange_AcceptedDateToFarInThePast()
{
var user = new AppUser();
var stateChange = new ActivityStateChange
{
ActivityId = 11,
AcceptedDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1).AddDays(-1),
Note = "Change",
State = ActivityState.Accepted
};
var activity = new Activity();
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>())).ReturnsAsync(activity);
var exception = Assert.ThrowsAsync<BadActivityStateChangeException>(async () =>
{
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
});
Assert.NotNull(exception);
Assert.IsInstanceOf<BadActivityStateChangeException>(exception);
Assert.AreEqual("Cannot change the accepted date of an activity to a date that's already paid out, or is greater than 1 month from now.",
exception.Message);
}
[Test]
public void ValidateCanApplyActivityStateChange_AcceptedDateToFarInTheFuture()
{
var user = new AppUser();
var stateChange = new ActivityStateChange
{
ActivityId = 11,
AcceptedDate = DateTime.Now.AddMonths(1).AddDays(1),
Note = "Change",
State = ActivityState.Accepted
};
var activity = new Activity();
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>())).ReturnsAsync(activity);
var exception = Assert.ThrowsAsync<BadActivityStateChangeException>(async () =>
{
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
});
Assert.NotNull(exception);
Assert.IsInstanceOf<BadActivityStateChangeException>(exception);
Assert.AreEqual("Cannot change the accepted date of an activity to a date that's already paid out, or is greater than 1 month from now.",
exception.Message);
}
[Test]
public void ValidateCanApplyActivityStateChange_NotAuthorized()
{
var user = new AppUser
{
Role = Role.UNKNOWN_ROLE,
AdditionalPermissions = new List<UserPermission>()
};
var stateChange = new ActivityStateChange
{
ActivityId = 11,
Note = "Change",
State = ActivityState.Accepted
};
var activityFromRepo = new Activity
{
State = ActivityState.ManualReview,
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activityFromRepo);
Assert.AreEqual(StateChangeRequirement.AdminOrPermission,
activityFromRepo.RequiredToChangeState(stateChange.State));
var exception = Assert.ThrowsAsync<NotAuthorizedException>(async () =>
{
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
});
Assert.NotNull(exception);
Assert.IsInstanceOf<NotAuthorizedException>(exception);
Assert.AreEqual("User does not have the permission to change the activity state.",
exception.Message);
}
[Test]
public async Task ValidateCanApplyActivityStateChange_ApproveSalesAsync()
{
var userDepartment = new UserDepartment()
{
DepartmentId = 55,
Department = new Department()
{
Id = 55,
State = DepartmentState.Active,
DepartmentName = "Test",
BusinessLineCode = BusinessLine.Operations.Code
},
StartDate = DateTime.Today,
Role = Role.Admin
};
var user = new AppUser
{
AdditionalPermissions = new List<UserPermission>(),
Departments = new List<UserDepartment>
{
userDepartment
}
};
var stateChange = new ActivityStateChange
{
ActivityId = 11,
Note = "Change",
State = ActivityState.Accepted,
AcceptedDate = DateTime.Now.AddDays(-1)
};
var activityFromRepo = new Activity
{
ActivityPayouts = new List<ActivityPayoutLineItem>(),
Type = ActivityType.Sale,
State = ActivityState.ManualReview
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activityFromRepo);
_mockAuthorizationService.Setup(mock =>
mock.ValidateHierarchicalDepartmentPermission(user, It.IsAny<List<Role>>(), It.IsAny<int>()))
.ReturnsAsync(true);
// Type = Sale, State = ManualReview
activityFromRepo.Type = ActivityType.Sale;
activityFromRepo.State = ActivityState.ManualReview;
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activityFromRepo);
Assert.AreEqual(StateChangeRequirement.AdminOrPermission,
activityFromRepo.RequiredToChangeState(stateChange.State));
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
// Type = Sale, State = PendingReverral
activityFromRepo.Type = ActivityType.Sale;
activityFromRepo.State = ActivityState.PendingReferral;
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activityFromRepo);
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
// Type = Referral, State = ManualReview
activityFromRepo.Type = ActivityType.Referral;
activityFromRepo.State = ActivityState.ManualReview;
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activityFromRepo);
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
// Type = Referral, State = PendingReferral
activityFromRepo.Type = ActivityType.Referral;
activityFromRepo.State = ActivityState.PendingReferral;
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activityFromRepo);
await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange);
}
[Test]
public async Task ValidateCanApplyActivityStateChange_ApproveReferralsAsync()
{
var userDepartment = new UserDepartment()
{
DepartmentId = 55,
Department = new Department()
{
Id = 55,
State = DepartmentState.Active,
DepartmentName = "Test",
BusinessLineCode = BusinessLine.Operations.Code
},
StartDate = DateTime.Parse("2021-11-02"),
Role = Role.DepartmentManagerRoles.First()
};
var user = new AppUser
{
AdditionalPermissions = new List<UserPermission>(),
Departments = new List<UserDepartment>
{
userDepartment
}
};
var stateChange = new ActivityStateChange
{
ActivityId = 11,
Note = "Change",
State = ActivityState.Accepted
};
var activityFromRepo = new Activity
{
ActivityPayouts = new List<ActivityPayoutLineItem>(),
Type = ActivityType.Referral,
State = ActivityState.ManualReview
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activityFromRepo);
_mockAuthorizationService.Setup(mock =>
mock.ValidateHierarchicalDepartmentPermission(user, It.IsAny<List<Role>>(), It.IsAny<int>()))
.ReturnsAsync(true);
// Type = Referral, State = ManualReview
activityFromRepo.Type = ActivityType.Referral;
activityFromRepo.State = ActivityState.ManualReview;
Assert.AreEqual(StateChangeRequirement.AdminOrPermission,
activityFromRepo.RequiredToChangeState(stateChange.State));
Assert.ThrowsAsync<NotAuthorizedException>(async () => { await _mockedActivityService.ValidateCanApplyActivityStateChange(user, stateChange); });
// Type = Referral, Accepted => Manual Review
activityFromRepo.Type = ActivityType.Referral;
activityFromRepo.State = ActivityState.Accepted;
userDepartment.Role = Role.Admin;
stateChange.State = ActivityState.ManualReview;
Assert.AreEqual(StateChangeRequirement.AdminOrPermission, activityFromRepo.RequiredToChangeState(stateChange.State));
}
[Test]
public async Task RequestTransfer_Ok()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 2,
NewEmployeeId = "C0000"
};
var activtyFromRepo = new Activity
{
Id = 1,
State = ActivityState.Accepted,
ActivityPayouts = new List<ActivityPayoutLineItem>(),
DepartmentId = 1,
Accepted = DateTime.Today
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activtyFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(It.IsAny<int>()))
.ReturnsAsync(activtyFromRepo);
var user1 = new List<AppUser> { new AppUser { AdEmail = "[email protected]" } };
var user2 = new List<AppUser> { new AppUser { AdEmail = "[email protected]" } };
_mockUserService.Setup(mock => mock.FindDepartmentManagers(1))
.ReturnsAsync(user1);
_mockUserService.Setup(mock => mock.FindDepartmentManagers(2))
.ReturnsAsync(user2);
var user3 = new AppUser { Id = Guid.NewGuid(), AdEmail = "[email protected]" };
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(user3);
_mockActivityTransferActionRepository
.Setup(mock => mock.SaveTransferAsync(It.IsAny<ActivityTransferAction>()))
.Callback<ActivityTransferAction>(transfer => transfer.RequestedActivity = activtyFromRepo);
var result = await _mockedActivityService.RequestTransfer(request);
Assert.NotNull(result);
Assert.AreEqual(ActivityState.Accepted, result.ActivityStateBeforeTransfer);
Assert.AreEqual(1, result.RequestedActivityId);
Assert.AreEqual(ActivityTransferState.Requested, result.State);
Assert.AreEqual(2, result.NewActivityDepartmentId);
Assert.AreEqual("C0000", result.NewActivityEmployeeId);
Assert.AreEqual(activtyFromRepo.State, ActivityState.PendingTransfer);
Assert.AreEqual(DateTime.Today, activtyFromRepo.Accepted);
// Verify transfer action and state change is saved
_mockActivityTransferActionRepository.Verify(mock =>
mock.SaveTransferAsync(It.Is<ActivityTransferAction>(action => action.Id == 0)),
Times.Once);
_mockActivityChangeRepository.Verify(mock =>
mock.SaveActivityStateChange(It.Is<ActivityStateChange>(change =>
change.ActivityId == 1 &&
change.Note == "" &&
change.State == ActivityState.PendingTransfer
)));
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Once);
// Verify notification sent
_mockNotificationService.Verify(mock =>
mock.SendTransferRequestInitiatedNotification(
It.IsAny<ActivityTransferAction>(),
It.Is<List<string>>(recipients =>
recipients.Count == 2 &&
recipients.Contains("[email protected]") &&
recipients.Contains("[email protected]"))
), Times.Once);
}
[Test]
public async Task RequestTransfer_DuplicateEmailAddresses()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 2,
NewEmployeeId = "C0000"
};
var activtyFromRepo = new Activity
{
Id = 1,
State = ActivityState.Accepted,
ActivityPayouts = new List<ActivityPayoutLineItem>(),
DepartmentId = 1
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activtyFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(It.IsAny<int>()))
.ReturnsAsync(activtyFromRepo);
var user1 = new List<AppUser> { new AppUser { AdEmail = "[email protected]" } };
var user2 = new List<AppUser> { new AppUser { AdEmail = "[email protected]" } };
var user3 = new AppUser { Id = Guid.NewGuid(), AdEmail = "[email protected]" };
_mockUserService.Setup(mock => mock.FindDepartmentManagers(1))
.ReturnsAsync(user1);
_mockUserService.Setup(mock => mock.FindDepartmentManagers(2))
.ReturnsAsync(user2);
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(user3);
_mockActivityTransferActionRepository
.Setup(mock => mock.SaveTransferAsync(It.IsAny<ActivityTransferAction>()))
.Callback<ActivityTransferAction>(transfer => transfer.RequestedActivity = activtyFromRepo);
var result = await _mockedActivityService.RequestTransfer(request);
Assert.NotNull(result);
_mockNotificationService.Verify(mock =>
mock.SendTransferRequestInitiatedNotification(
It.IsAny<ActivityTransferAction>(),
It.Is<List<string>>(recipients =>
recipients.Count == 1 &&
recipients.Contains("[email protected]"))
), Times.Once);
}
[Test]
public void RequestTransfer_NotFoundException()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 2,
NewEmployeeId = "C0000"
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync((Activity)null);
var exception = Assert.ThrowsAsync<NotFoundException>(async () => { await _mockedActivityService.RequestTransfer(request); });
Assert.NotNull(exception);
Assert.IsInstanceOf<NotFoundException>(exception);
Assert.AreEqual("No activity with Id 1 could be found", exception.Message);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
_mockNotificationService.Verify(mock =>
mock.SendTransferRequestInitiatedNotification(It.IsAny<ActivityTransferAction>(),
It.IsAny<List<string>>()),
Times.Never);
}
[Test]
public void RequestTransfer_HasPayout_BadActivityTransferRequestException()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 2,
NewEmployeeId = "C0000"
};
var activtyFromRepo = new Activity
{
Id = 1,
State = ActivityState.Accepted,
ActivityPayouts = new List<ActivityPayoutLineItem>
{
new ActivityPayoutLineItem()
}
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activtyFromRepo);
var exception = Assert.ThrowsAsync<BadActivityTransferActionException>(async () => { await _mockedActivityService.RequestTransfer(request); });
Assert.NotNull(exception);
Assert.IsInstanceOf<BadActivityTransferActionException>(exception);
Assert.AreEqual("Cannot request a transfer of an activity that has a payout.", exception.Message);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
_mockNotificationService.Verify(mock =>
mock.SendTransferRequestInitiatedNotification(It.IsAny<ActivityTransferAction>(),
It.IsAny<List<string>>()),
Times.Never);
}
[Test]
public void RequestTransfer_IneligibleActivityState_BadActivityTransferRequestException()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 2,
NewEmployeeId = "C0000"
};
var activtyFromRepo = new Activity
{
Id = 1,
State = ActivityState.Created,
ActivityPayouts = new List<ActivityPayoutLineItem>()
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(It.IsAny<int>()))
.ReturnsAsync(activtyFromRepo);
var exception = Assert.ThrowsAsync<BadActivityTransferActionException>(async () => { await _mockedActivityService.RequestTransfer(request); });
Assert.NotNull(exception);
Assert.IsInstanceOf<BadActivityTransferActionException>(exception);
Assert.AreEqual("Cannot request a transfer that isn't pending or approved.", exception.Message);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
_mockNotificationService.Verify(mock =>
mock.SendTransferRequestInitiatedNotification(It.IsAny<ActivityTransferAction>(),
It.IsAny<List<string>>()),
Times.Never);
}
[Test]
public async Task RequestTransferToOwnDepartment_Ok()
{
var employee = new AppUser
{
Id = Guid.NewGuid(),
AdEmail = "[email protected]",
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
};
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 1,
NewEmployeeId = employee.EmployeeId
};
var activityFromRepo = new Activity
{
Id = 1,
State = ActivityState.Accepted,
ActivityPayouts = new List<ActivityPayoutLineItem>(),
DepartmentId = 2,
EmployeeId = employee.EmployeeId,
Detail = new ActivityDetail()
};
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>()))
.ReturnsAsync(employee);
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(1)).ReturnsAsync(activityFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(It.IsAny<int>())).ReturnsAsync(activityFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(It.IsAny<int>())).ReturnsAsync(activityFromRepo);
_mockActivityTransferActionRepository.Setup(mock => mock.SaveTransferAsync(It.Is<ActivityTransferAction>(x =>
x.Id == 0 &&
x.ActivityStateBeforeTransfer == ActivityState.Accepted &&
x.RequestedActivityId == 1 &&
x.State == ActivityTransferState.Accepted &&
x.NewActivityDepartmentId == 1 &&
x.NewActivityEmployeeId == "C0000"
)))
.ReturnsAsync(1);
var result = await _mockedActivityService.TransferToOwnDepartment(request, employee);
Assert.NotNull(result);
Assert.AreEqual(ActivityState.Accepted, result.ActivityStateBeforeTransfer);
Assert.AreEqual(1, result.RequestedActivityId);
Assert.AreEqual(1, result.NewActivityDepartmentId);
Assert.AreEqual("C0000", result.NewActivityEmployeeId);
Assert.AreEqual(ActivityTransferState.Accepted, result.State);
// Verify transfer action and state change is saved
_mockActivityTransferActionRepository.Verify();
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()), Times.Exactly(2));
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Exactly(3));
}
[Test]
public void RequestTransferToOwnDepartment_ActivityNotFound_NotFoundExceptionThrown()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 1,
NewEmployeeId = "C0000"
};
var employee = new AppUser
{
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(1)).ReturnsAsync((Activity)null);
Assert.ThrowsAsync<NotFoundException>(() => _mockedActivityService.TransferToOwnDepartment(request, employee));
// Verify transfer action and state change is saved
_mockActivityTransferActionRepository.Verify();
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()), Times.Never);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
}
[Test]
public void RequestTransferToOwnDepartment_DoesNotBelongToCaller_AuthorizationExceptionThrown()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 1,
NewEmployeeId = "C0000"
};
var employee = new AppUser
{
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
};
var activityFromRepo = new Activity
{
Id = 1,
State = ActivityState.Accepted,
ActivityPayouts = new List<ActivityPayoutLineItem>(),
DepartmentId = 2,
EmployeeId = "C0001",
Detail = new ActivityDetail()
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(1)).ReturnsAsync(activityFromRepo);
Assert.ThrowsAsync<NotAuthorizedException>(() => _mockedActivityService.TransferToOwnDepartment(request, employee));
// Verify transfer action and state change is saved
_mockActivityTransferActionRepository.Verify();
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()), Times.Never);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
}
[Test]
public void RequestTransferToOwnDepartment_EmployeeDoesNotHaveDepartment_BadActivityTransferActionExceptionThrown()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 1,
NewEmployeeId = "C0000"
};
var employee = new AppUser
{
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 2
}
}
};
var activityFromRepo = new Activity
{
Id = 1,
State = ActivityState.Accepted,
ActivityPayouts = new List<ActivityPayoutLineItem>(),
DepartmentId = 2,
EmployeeId = "C0000",
Detail = new ActivityDetail()
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(1)).ReturnsAsync(activityFromRepo);
Assert.ThrowsAsync<BadActivityTransferActionException>(() => _mockedActivityService.TransferToOwnDepartment(request, employee));
// Verify transfer action and state change is saved
_mockActivityTransferActionRepository.Verify();
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()), Times.Never);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
}
[Test]
public void RequestTransferToOwnDepartment_HasPayouts_BadActivityTransferActionExceptionThrown()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 1,
NewEmployeeId = "C0000"
};
var employee = new AppUser
{
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
};
var activityFromRepo = new Activity
{
Id = 1,
State = ActivityState.Accepted,
ActivityPayouts = new List<ActivityPayoutLineItem>
{
new ActivityPayoutLineItem
{
ActivityId = 1
}
},
DepartmentId = 2,
EmployeeId = "C0000",
Detail = new ActivityDetail()
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(1)).ReturnsAsync(activityFromRepo);
Assert.ThrowsAsync<BadActivityTransferActionException>(() => _mockedActivityService.TransferToOwnDepartment(request, employee));
// Verify transfer action and state change is saved
_mockActivityTransferActionRepository.Verify();
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()), Times.Never);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
}
[Test]
public void RequestTransferToOwnDepartment_NotAcceptedState_BadActivityTransferActionExceptionThrown()
{
var request = new ActivityTransferRequest
{
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
NewDepartmentId = 1,
NewEmployeeId = "C0000"
};
var employee = new AppUser
{
EmployeeId = "C0000",
Departments =
{
new UserDepartment
{
DepartmentId = 1
}
}
};
var activityFromRepo = new Activity
{
Id = 1,
State = ActivityState.PendingReferral,
ActivityPayouts = new List<ActivityPayoutLineItem>(),
DepartmentId = 2,
EmployeeId = "C0000",
Detail = new ActivityDetail()
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(1)).ReturnsAsync(activityFromRepo);
Assert.ThrowsAsync<BadActivityTransferActionException>(() => _mockedActivityService.TransferToOwnDepartment(request, employee));
// Verify transfer action and state change is saved
_mockActivityTransferActionRepository.Verify();
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(It.IsAny<ActivityStateChange>()), Times.Never);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Never);
}
[Test]
public async Task ApproveTransfer_Reject()
{
var approver = new AppUser { AdEmail = "[email protected]", EmployeeId = "M0000" };
var approval = new ActivityTransferApprovalRequest
{
Id = 1,
ApprovalState = ActivityTransferState.Rejected
};
var transferActionFromRepo = new ActivityTransferAction
{
State = ActivityTransferState.Requested,
RequestedActivity = new Activity { DepartmentId = 2 },
NewActivityDepartmentId = 3,
ActivityStateBeforeTransfer = ActivityState.ManualReview,
RequestedActivityId = 4
};
var activityFromRepo = new Activity
{
State = ActivityState.PendingTransfer
};
_mockActivityTransferActionRepository.Setup(mock => mock.GetTransferActionById(1))
.ReturnsAsync(transferActionFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(4))
.ReturnsAsync(activityFromRepo);
_mockAuthorizationService
.Setup(mock =>
mock.AppUserCanMakeStateChange(approver, It.IsAny<Activity>(), It.IsAny<ActivityState>(), It.IsAny<int>()))
.ReturnsAsync(true);
var result = await _mockedActivityService.ApproveTransfer(approver, approval);
Assert.NotNull(result);
Assert.AreEqual(ActivityTransferState.Rejected, result.State);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(
It.Is<ActivityStateChange>(x =>
x.ActivityId == 4 &&
x.Note.Equals("Activity transfer has been rejected.") &&
x.State == ActivityState.ManualReview)
), Times.Once);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Once);
}
[Test]
public async Task ApproveTransfer_Approve_ReturnsUpdatedTransferAction()
{
var approver = new AppUser
{
AdEmail = "[email protected]",
EmployeeId = "M0000",
FullName = "Manager, Approving"
};
var approval = new ActivityTransferApprovalRequest
{
Id = 1,
ApprovalState = ActivityTransferState.Accepted
};
var transferActionFromRepo = new ActivityTransferAction
{
Id = 6,
State = ActivityTransferState.Requested,
RequestedActivity = new Activity { DepartmentId = 2 },
NewActivityDepartmentId = 3,
NewActivityEmployeeId = "N0000",
ActivityStateBeforeTransfer = ActivityState.ManualReview,
RequestedActivityId = 4
};
var activityFromRepo = new Activity
{
State = ActivityState.PendingTransfer
};
_mockActivityTransferActionRepository.Setup(mock => mock.GetTransferActionById(1))
.ReturnsAsync(transferActionFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(4))
.ReturnsAsync(activityFromRepo);
var mockActivityToTransfer = new Activity
{
Accepted = new DateTime(2021, 9, 22),
DepartmentId = 2,
Detail = new ActivityDetail
{
AccountBalance = 100.00,
AccountNewBalance = 99.00,
AccountNumber = "888888",
AccountStatus = "Open",
AgreementNumber = "999",
BranchOrgName = "Org Name",
BranchOrgNbr = "Org Number",
DnaPersonNbr = "DNA number",
MemberName = "Member Name",
StationName = "Station Name",
SubjectOrgNbr = "Subject Org Number",
SubjectPersonNbr = "Subject Person Number"
},
EmployeeEmail = "[email protected]",
EmployeeId = "E0000",
Id = 4,
MatchingActivityId = 0,
Product = Product.CheckCard,
SourceCreated = new DateTime(2021, 9, 22),
SourceId = "Source ID",
SourceSystem = SystemType.Dna,
State = ActivityState.PendingTransfer,
Type = ActivityType.Sale
};
var mockActivityAfterTransfer = new Activity
{
Accepted = new DateTime(2021, 9, 22),
DepartmentId = 3,
Detail = new ActivityDetail
{
AccountBalance = 100.00,
AccountNewBalance = 99.00,
AccountNumber = "888888",
AccountStatus = "Open",
AgreementNumber = "999",
BranchOrgName = "Org Name",
BranchOrgNbr = "Org Number",
DnaPersonNbr = "DNA number",
MemberName = "Member Name",
StationName = "Station Name",
SubjectOrgNbr = "Subject Org Number",
SubjectPersonNbr = "Subject Person Number"
},
EmployeeEmail = "[email protected]",
EmployeeId = "E0000",
Id = 50,
MatchingActivityId = 0,
Product = Product.CheckCard,
SourceCreated = new DateTime(2021, 9, 22),
SourceId = "Source ID",
SourceSystem = SystemType.Dna,
State = ActivityState.PendingTransfer,
Type = ActivityType.Sale
};
var newUser = new AppUser
{
AdEmail = "[email protected]"
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(4))
.ReturnsAsync(mockActivityToTransfer);
_mockUserService.Setup(mock => mock.GetUserByEmployeeIdAsync("N0000"))
.ReturnsAsync(newUser);
_mockActivityRepository.Setup(mock => mock.GetActivityById(4))
.ReturnsAsync(mockActivityToTransfer);
_mockActivityRepository.Setup(mock => mock.GetActivityById(50))
.ReturnsAsync(mockActivityAfterTransfer);
// simulate repo assigning a ID to newly save activity
_mockUnitOfWork.Setup(mock => mock.CompleteAsync())
.Callback(() => transferActionFromRepo.NewActivity.Id = 50);
_mockAuthorizationService
.Setup(mock =>
mock.AppUserCanMakeStateChange(approver, It.IsAny<Activity>(), It.IsAny<ActivityState>(), It.IsAny<int>()))
.ReturnsAsync(true);
var result = await _mockedActivityService.ApproveTransfer(approver, approval);
// Assert transfer action is updated
Assert.AreEqual(6, result.Id);
Assert.AreEqual("Manager, Approving", result.NewDepartmentApprover);
Assert.AreEqual(DateTime.Today.Date, result.NewDepartmentApproved.Value.Date);
Assert.AreEqual("Manager, Approving", result.RequestedDepartmentApprover);
Assert.AreEqual(DateTime.Today.Date, result.RequestedDepartmentApproved.Value.Date);
Assert.AreEqual(ActivityTransferState.Accepted, result.State);
// Assert new department, employee, and state before transfer are all updated on the new activity
Assert.AreEqual(50, result.NewActivity.Id);
Assert.AreEqual(3, result.NewActivity.DepartmentId);
Assert.AreEqual("[email protected]", result.NewActivity.EmployeeEmail);
Assert.AreEqual("N0000", result.NewActivity.EmployeeId);
Assert.AreEqual(ActivityState.ManualReview, result.NewActivity.State);
}
[Test]
public async Task ApproveTransfer_Approve_AddsActivityStateChanges()
{
var approver = new AppUser
{
AdEmail = "[email protected]",
EmployeeId = "M0000",
FullName = "Manager, Approving"
};
var approval = new ActivityTransferApprovalRequest
{
Id = 1,
ApprovalState = ActivityTransferState.Accepted
};
var transferActionFromRepo = new ActivityTransferAction
{
Id = 6,
State = ActivityTransferState.Requested,
RequestedActivity = new Activity { DepartmentId = 2 },
NewActivityDepartmentId = 3,
NewActivityEmployeeId = "N0000",
ActivityStateBeforeTransfer = ActivityState.ManualReview,
RequestedActivityId = 4
};
var activityFromRepo = new Activity
{
Id = 50,
State = ActivityState.PendingTransfer
};
_mockActivityTransferActionRepository.Setup(mock => mock.GetTransferActionById(1))
.ReturnsAsync(transferActionFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(4))
.ReturnsAsync(activityFromRepo);
_mockAuthorizationService
.Setup(mock =>
mock.AppUserCanMakeStateChange(approver, It.IsAny<Activity>(), It.IsAny<ActivityState>(), It.IsAny<int>()))
.ReturnsAsync(true);
var mockActivityToTransfer = new Activity
{
Accepted = new DateTime(2021, 9, 22),
DepartmentId = 2,
Detail = new ActivityDetail(),
EmployeeEmail = "[email protected]",
EmployeeId = "E0000",
Id = 4,
MatchingActivityId = 0,
State = ActivityState.PendingTransfer,
};
var newUser = new AppUser
{
AdEmail = "[email protected]"
};
_mockActivityRepository.Setup(mock => mock.GetActivityIncludingPayouts(4))
.ReturnsAsync(mockActivityToTransfer);
_mockUserService.Setup(mock => mock.GetUserByEmployeeIdAsync("N0000"))
.ReturnsAsync(newUser);
_mockActivityRepository.Setup(mock => mock.GetActivityById(50))
.ReturnsAsync(mockActivityToTransfer);
// simulate repo assigning a ID to newly save activity
_mockUnitOfWork.Setup(mock => mock.CompleteAsync())
.Callback(() => transferActionFromRepo.NewActivity.Id = 50);
var result = await _mockedActivityService.ApproveTransfer(approver, approval);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(
It.Is<ActivityStateChange>(x =>
x.ActivityId == 50 &&
x.Note.Equals("Activity has been transferred from Activity ID: 4") &&
x.State == ActivityState.ManualReview)
), Times.Once);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(
It.Is<ActivityStateChange>(x =>
x.ActivityId == 4 &&
x.Note.Equals("Activity has been transferred to Activity ID: 50") &&
x.State == ActivityState.Transferred)
), Times.Once);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Exactly(3));
}
[Test]
public void ApproveTransfer_Manager_NotFoundException()
{
var approval = new ActivityTransferApprovalRequest
{
Id = 1,
ApprovalState = ActivityTransferState.Accepted
};
_mockActivityTransferActionRepository.Setup(mock => mock.GetTransferActionById(3))
.ReturnsAsync((ActivityTransferAction)null);
var exception = Assert.ThrowsAsync<NotFoundException>(async () =>
await _mockedActivityService.ApproveTransfer(new AppUser(), approval));
Assert.NotNull(exception);
Assert.IsInstanceOf<NotFoundException>(exception);
Assert.AreEqual("No activity transfer action with Id 1 could be found", exception.Message);
}
[Test]
public void ApproveTransfer_Manager_BadActivityTransferActionException()
{
var approval = new ActivityTransferApprovalRequest
{
Id = 1,
ApprovalState = ActivityTransferState.Accepted
};
var transferActionFromRepo = new ActivityTransferAction
{
State = ActivityTransferState.Accepted
};
_mockActivityTransferActionRepository.Setup(mock => mock.GetTransferActionById(1))
.ReturnsAsync(transferActionFromRepo);
var exception = Assert.ThrowsAsync<BadActivityTransferActionException>(async () =>
await _mockedActivityService.ApproveTransfer(new AppUser(), approval));
Assert.NotNull(exception);
Assert.IsInstanceOf<BadActivityTransferActionException>(exception);
Assert.AreEqual("Approval has already been decided for this activity", exception.Message);
transferActionFromRepo.State = ActivityTransferState.Rejected;
var exception2 = Assert.ThrowsAsync<BadActivityTransferActionException>(async () =>
await _mockedActivityService.ApproveTransfer(new AppUser(), approval));
Assert.NotNull(exception2);
Assert.IsInstanceOf<BadActivityTransferActionException>(exception2);
Assert.AreEqual("Approval has already been decided for this activity", exception.Message);
}
[Test]
public void ApproveTransfer_Manager_NotAuthorizedException()
{
var nonManagerUser = new AppUser { AdEmail = "[email protected]", EmployeeId = "C0000" };
var managerUser = new AppUser { AdEmail = "[email protected]", EmployeeId = "M0000" };
var approval = new ActivityTransferApprovalRequest
{
Id = 1,
ApprovalState = ActivityTransferState.Accepted
};
var transferActionFromRepo = new ActivityTransferAction
{
State = ActivityTransferState.Requested,
RequestedActivity = new Activity { DepartmentId = 2 },
NewActivityDepartmentId = 3
};
_mockActivityTransferActionRepository.Setup(mock => mock.GetTransferActionById(1))
.ReturnsAsync(transferActionFromRepo);
_mockUserService.Setup(mock => mock.FindDepartmentManagers(It.IsAny<int>()))
.ReturnsAsync(new List<AppUser> { managerUser });
var exception = Assert.ThrowsAsync<NotAuthorizedException>(async () =>
await _mockedActivityService.ApproveTransfer(nonManagerUser, approval));
Assert.NotNull(exception);
Assert.IsInstanceOf<NotAuthorizedException>(exception);
}
[Test]
public async Task GetRequestedTransfer_ReturnsAction()
{
var actionFromRepo = new ActivityTransferAction
{
Id = 1,
NewActivityEmployeeId = "C0000",
NewActivityDepartmentId = 88
};
_mockActivityTransferActionRepository
.Setup(mock => mock.GetRequestedTransferActionByActivityId(It.IsAny<int>()))
.ReturnsAsync(actionFromRepo);
var result = await _mockedActivityService.GetRequestedTransfer(1);
Assert.AreEqual(1, result.Id);
Assert.AreEqual("C0000", result.NewActivityEmployeeId);
Assert.AreEqual(88, result.NewActivityDepartmentId);
}
[Test]
public async Task RejectPendingTransfers_Ok()
{
var range = new MonthRange
(
DateTime.Today.Year,
DateTime.Today.Month,
DateTime.Today.Year,
DateTime.Today.Month
);
var activityFromRepo = new Activity
{
Id = 1,
State = ActivityState.PendingTransfer,
Accepted = DateTime.Today.Date
};
var transferActionFromRepo = new ActivityTransferAction
{
State = ActivityTransferState.Requested,
RequestedActivity = activityFromRepo,
NewActivityDepartmentId = 3,
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
};
var transfers = new List<ActivityTransferAction>();
transfers.Add(transferActionFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(1))
.ReturnsAsync(activityFromRepo);
_mockActivityTransferActionRepository
.Setup(mock => mock.GetActiveTransfersForStateAsync(ActivityState.Accepted))
.ReturnsAsync(transfers);
_mockActivityChangeRepository.Setup(mock => mock.SaveActivityStateChange(
It.Is<ActivityStateChange>(x =>
x.ActivityId == 1 &&
x.Note.Equals("Activity transfer has been rejected.") &&
x.State == ActivityState.Accepted)
)).Verifiable();
await _mockedActivityService.CancelPendingTransfersBetween(range);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(
It.Is<ActivityStateChange>(x =>
x.ActivityId == 1 &&
x.Note.Equals("Activity transfer has been rejected.") &&
x.State == ActivityState.Accepted)
), Times.Once);
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Once);
}
[TestCase("07-01-2021", 1)]
[TestCase("07-31-2021", 1)]
[TestCase("08-01-2021", 1)]
[TestCase("08-31-2021", 1)]
[TestCase("09-01-2021", 0)]
public async Task RejectPendingTransfers_Ok_MonthBorders(string dateString, int timesCalled)
{
var range = new MonthRange(2021, 7, 2021, 8);
var activityFromRepo = new Activity
{
Id = 1,
State = ActivityState.PendingTransfer,
Accepted = DateTime.Parse(dateString)
};
var transferActionFromRepo = new ActivityTransferAction
{
State = ActivityTransferState.Requested,
RequestedActivity = activityFromRepo,
NewActivityDepartmentId = 3,
ActivityStateBeforeTransfer = ActivityState.Accepted,
RequestedActivityId = 1,
};
var transfers = new List<ActivityTransferAction>();
transfers.Add(transferActionFromRepo);
_mockActivityRepository.Setup(mock => mock.GetActivityById(1))
.ReturnsAsync(activityFromRepo);
_mockActivityTransferActionRepository
.Setup(mock => mock.GetActiveTransfersForStateAsync(ActivityState.Accepted))
.ReturnsAsync(transfers);
_mockActivityChangeRepository.Setup(mock => mock.SaveActivityStateChange(
It.Is<ActivityStateChange>(x =>
x.ActivityId == 1 &&
x.Note.Equals("Activity transfer has been rejected.") &&
x.State == ActivityState.Accepted)
)).Verifiable();
await _mockedActivityService.CancelPendingTransfersBetween(range);
_mockActivityChangeRepository.Verify(mock => mock.SaveActivityStateChange(
It.Is<ActivityStateChange>(x =>
x.ActivityId == 1 &&
x.Note.Equals("Activity transfer has been rejected.") &&
x.State == ActivityState.Accepted)
), Times.Exactly(timesCalled));
_mockUnitOfWork.Verify(mock => mock.CompleteAsync(), Times.Exactly(timesCalled));
}
[Test]
public async Task FilterExternalActivitiesByExistingSourceId_OK()
{
_mockActivityRepository.Setup(x => x.GetActivitiesBySourceId(It.IsAny<List<string>>())).ReturnsAsync(
new List<Activity>()
{
new Activity()
{
SourceId = "1",
Type = ActivityType.Sale,
Product = Product.Mortgage
},
new Activity()
{
SourceId = "2",
Type = ActivityType.Sale,
Product = Product.Mortgage
},
new Activity()
{
SourceId = "3",
Type = ActivityType.Sale,
Product = Product.Mortgage
},
new Activity()
{
SourceId = "4",
Type = ActivityType.Sale,
Product = Product.Vehicle
},
new Activity()
{
SourceId = "5",
Type = ActivityType.Sale,
Product = Product.Vehicle
},
new Activity()
{
SourceId = "6",
Type = ActivityType.Referral,
Product = Product.Vehicle
}
});
var results = await _mockedActivityService.FilterExternalActivitiesByExistingSourceId(
new List<IExternalActivity>()
{
new NewLoanSaleActivity()
{
ActivityNbr = 1,
MinorAccountType = "FE01",
},
new NewLoanSaleActivity()
{
ActivityNbr = 5,
MinorAccountType = "FE01",
},
new NewLoanSaleActivity()
{
ActivityNbr = 5,
MinorAccountType = "DV01"
},
new NewLoanSaleActivity()
{
ActivityNbr = 6,
MinorAccountType = "DV01"
},
new NewLoanSaleActivity()
{
ActivityNbr = 7,
MinorAccountType = "DV01"
}
});
Assert.NotNull(results);
Assert.AreEqual(3, results.Count);
Assert.False(results.Any(x => x.GetSourceId() == "1" && x.GetProductType() == Product.Mortgage));
Assert.True(results.Any(x => x.GetSourceId() == "5" && x.GetProductType() == Product.Mortgage));
Assert.False(results.Any(x => x.GetSourceId() == "5" && x.GetProductType() == Product.Vehicle));
Assert.True(results.Any(x => x.GetSourceId() == "6" && x.GetProductType() == Product.Vehicle));
Assert.True(results.Any(x => x.GetSourceId() == "7" && x.GetProductType() == Product.Vehicle));
}
[Test]
public async Task NoEmployeeFoundWhenSavingNewActivityThrowsNotFoundException()
{
_mockUserService.Setup(mock => mock.GetActiveUserByEmployeeIdAsync(It.IsAny<string>())).ReturnsAsync((AppUser)null);
_mockUserService.Setup(mock => mock.GetUserByEmployeeIdAsync(It.IsAny<string>())).ReturnsAsync((AppUser)null);
var activity = new Activity()
{
Id = 1,
SourceId = "1",
DepartmentId = 10,
EmployeeId = "113322"
};
//Assert
Assert.ThrowsAsync<NotFoundException>(async () => await _activityService.SaveActivityAsync(activity));
}
}
}