using System.Collections.Generic; using System.Threading.Tasks; using LCU.API.Internal.Operations.IncentiveApi.Exceptions; using LCU.API.Internal.Operations.IncentiveApi.Services.DuplicateDetection; using LCU.API.Internal.Operations.IncentiveApiLib.Repositories; using LCU.Library.Internal.IncentiveApiModels.Entities; using LCU.Library.Internal.IncentiveApiModels.Enums; using Moq; using NUnit.Framework; namespace Application.UnitTests.Services.DuplicateDetection { public class DuplicateDetectionServiceTest { private IDuplicateDetectionService _service; IActivityRepository _activityRepository; private IDuplicateDetectionStrategy _strategy; [SetUp] public void Setup() { _activityRepository = Mock.Of(); _strategy = Mock.Of(); var strategies = new List() { _strategy }; _service = new DuplicateDetectionService(strategies, _activityRepository); } [Test] public async Task AllTypesCoveredOnce() { var activity = new Activity() { Id = 1, Type = ActivityType.Other, Product = Product.Mortgage, State = ActivityState.Accepted }; var duplicates = new List() { activity }; Mock.Get(_strategy).Setup(x => x.CanDecideActivity(It.IsAny())).Returns(true); Mock.Get(_strategy).Setup(x => x.FindDuplicates(It.IsAny())).ReturnsAsync(duplicates); var results = await _service.TryFindDuplicates(activity); Assert.NotNull(results); Assert.IsNotEmpty(results); Mock.Get(_strategy).Verify(x => x.CanDecideActivity(It.IsAny()), Times.Once); Mock.Get(_strategy).Verify(x => x.FindDuplicates(It.IsAny()), Times.Once); } [Test] public void ThrowsWithoutStrategy() { var activity = new Activity() { Id = 1, Type = ActivityType.Other, Product = Product.Mortgage, State = ActivityState.Accepted }; var strategies = new List(); var service = new DuplicateDetectionService(strategies, _activityRepository); Assert.ThrowsAsync(async () => { await service.TryFindDuplicates(activity); }); } } }