using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Castle.DynamicProxy.Generators; using LCU.API.Collections.RepoApi.Exceptions; using LCU.API.Collections.RepoApi.Models; using LCU.API.Collections.RepoApi.Services; using LCU.Shared.Collections.RepoApiLib.Exceptions; using LCU.Shared.Collections.RepoApiLib.Models; using LCU.Shared.Collections.RepoApiLib.Repositories; using Moq; using Xunit; using Xunit.Sdk; namespace LCU.API.Collections.RepoApiTests.Services { public class EventAlertServiceTest { [Fact] public async void ListAll_Ok() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListAllAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert(), new EventAlert() }); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.ListAll(); Assert.NotNull(res); Assert.Equal(3, res.Count()); } [Fact] public async void ListAll_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListAllAsync()).ThrowsAsync(new Exception("oops")); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.ListAll()); } [Fact] public async void ListUnread_Ok() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListUnreadAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert(), new EventAlert() }); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.ListUnread(); Assert.NotNull(res); Assert.Equal(3, res.Count()); } [Fact] public async void ListUnread_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListUnreadAsync()).ThrowsAsync(new Exception("oops")); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.ListUnread()); } [Fact] public async void ListWithinDateRange_OK() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListWithinDateRangeAsync(It.IsAny(), It.IsAny())).ReturnsAsync(new List() { new EventAlert(), new EventAlert(), new EventAlert() }); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.ListWithinDateRange(DateTime.Now, DateTime.Now.AddDays(5)); Assert.NotNull(res); Assert.Equal(3, res.Count()); } [Fact] public async void ListWithinDateRange_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListWithinDateRangeAsync(It.IsAny(), It.IsAny())).ThrowsAsync(new Exception("oops")); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.ListWithinDateRange(DateTime.Now, DateTime.Now.AddDays(5))); } [Fact] public async void ListActionNeeded_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListRepoNoAuctionAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListRepoNoCompanyAsync()).ReturnsAsync(new List() { new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListO4rNoCompanyAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListReadyForRetitleAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert(), new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListFloorUpdateFailedAsync()).ThrowsAsync(new Exception("oops")); mockEventAlertRepository.Setup(repo => repo.ListFloorNeedsSettingAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert(), new EventAlert() }); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.ListActionNeeded()); } [Fact] public async void ListActionNeeded_OK() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListRepoNoAuctionAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListRepoNoCompanyAsync()).ReturnsAsync(new List() { new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListO4rNoCompanyAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListReadyForRetitleAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert(), new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListFloorUpdateFailedAsync()).ReturnsAsync(new List() { new EventAlert() }); mockEventAlertRepository.Setup(repo => repo.ListFloorNeedsSettingAsync()).ReturnsAsync(new List() { new EventAlert(), new EventAlert(), new EventAlert() }); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.ListActionNeeded(); Assert.NotNull(res); Assert.Equal(12, res.Count()); } [Fact] public async void SaveAsync_OK() { EventAlert eventAlert = new EventAlert() { Id = 5, RepoId = 100 }; RepoAccount account = new RepoAccount() { RepoId = 100, Status = "O4R" }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.AddAsync(It.Is(param => param.Id == 5))).Returns(Task.CompletedTask); mockRepoRepository.Setup(repo => repo.FindByIdAsync(It.Is(param => param == 100))).Returns(Task.FromResult(account)); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.SaveAsync(eventAlert); Assert.NotNull(res); Assert.Equal(eventAlert, res); } [Fact] public async void SaveAsync_DuplicateResource_Exception() { EventAlert eventAlert = new EventAlert() { Id = 5, RepoId = 100, Message = "RTC Letter Not Found" }; RepoAccount account = new RepoAccount() { RepoId = 100, Status = "RTC Letter Not Found" }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.AddAsync(It.Is(param => param.Id == 5))).ThrowsAsync(new DuplicateResourceException("resource")); mockRepoRepository.Setup(repo => repo.FindByIdAsync(It.Is(param => param == 100))).Returns(Task.FromResult(account)); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.SaveAsync(eventAlert)); } [Fact] public async void SaveAsync_Exception() { EventAlert eventAlert = new EventAlert() { Id = 5 }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.AddAsync(It.Is(param => param.Id == 5))).ThrowsAsync(new Exception("oops")); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.SaveAsync(eventAlert)); } [Fact] public async void saveRangeAsync_Ok() { List range = new List() { new EventAlert(), new EventAlert(), new EventAlert() }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.AddRangeAsync(It.Is>(param => param.Count() == 3))).ReturnsAsync(new List() { new EventAlert(), new EventAlert() }); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.SaveRangeAsync(range); Assert.NotNull(res); Assert.Equal(2, res.Count()); } [Fact] public async void saveRangeAsync_Exception() { List range = new List() { new EventAlert(), new EventAlert(), new EventAlert() }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.AddRangeAsync(It.Is>(param => param.Count() == 3))).ThrowsAsync(new Exception("oops")); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.SaveRangeAsync(range); Assert.NotNull(res); Assert.Empty(res); } [Fact] public async void Get_Ok() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).ReturnsAsync(new EventAlert() { Id = 5 }); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.Get(5); Assert.NotNull(res); Assert.Equal(5, res.Id); } [Fact] public async void Get_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).ThrowsAsync(new Exception("Oops")); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.Get(5)); } [Fact] public async void Get_Null_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.Get(5)); } [Fact] public async void Update_Null() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); var eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var dummyAlert = new EventAlert { Message = "Message", DateMarkedRead = DateTime.Now, CreatedBy = "Some Guy" }; var dummyUser = new AppUser { FirstName = "John", LastName = "Doe" }; await Assert.ThrowsAsync(async () => await eventAlertService.UpdateAsync(dummyAlert, dummyUser)); } [Fact] public async void Update_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).ReturnsAsync(new EventAlert()); var eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var dummyAlert = new EventAlert { Message = "Message", DateMarkedRead = DateTime.Now, CreatedBy = "Some Guy" }; var dummyUser = new AppUser { FirstName = "John", LastName = "Doe" }; mockEventAlertRepository.Setup(repo => repo.Update(It.IsAny())).Throws(new Exception("oops")); await Assert.ThrowsAsync(async () => await eventAlertService.UpdateAsync(dummyAlert, dummyUser)); } [Fact] public async void Update_Ok() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).ReturnsAsync(new EventAlert()); var eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var dummyAlert = new EventAlert { Message = "Message", DateMarkedRead = DateTime.Now, CreatedBy = "Some Guy" }; var dummyUser = new AppUser { FirstName = "John", LastName = "Doe" }; var result = await eventAlertService.UpdateAsync(dummyAlert, dummyUser); Assert.NotNull(result); Assert.Equal(dummyAlert.DateMarkedRead, result.DateMarkedRead); Assert.Equal("Message", result.Message); Assert.Equal("John Doe", result.MarkedReadBy); Assert.Null(result.CreatedBy); } [Fact] public async void Update_Existing_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).Throws(new Exception("oops")); var eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var dummyAlert = new EventAlert { Message = "Message", DateMarkedRead = DateTime.Now, CreatedBy = "Some Guy" }; var dummyUser = new AppUser { FirstName = "John", LastName = "Doe" }; await Assert.ThrowsAsync(async () => await eventAlertService.UpdateAsync(dummyAlert, dummyUser)); } [Fact] public async void Duplicate_Add_Exception() { RepoAccount account = new RepoAccount() { RepoId = 100, Status = "RTC Letter Not Found" }; EventAlert eventAlert = new EventAlert() { Id = 5, RepoId = 100 }; // arrange var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.AddAsync(It.Is(param => param.Id == 5))).ThrowsAsync(new DuplicateResourceException("EventAlert")); mockRepoRepository.Setup(repo => repo.FindByIdAsync(It.Is(param => param == 100))).Returns(Task.FromResult(account)); var eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); // act / assert try { var result = await eventAlertService.SaveAsync(eventAlert); Assert.True(false, "An exception should have been thrown."); } catch (DuplicateResourceException ex) { Assert.Equal("Duplicate Resources of type EventAlert were found.", ex.Message); } catch (Exception) { Assert.True(false, "An exception other than DuplicateResourceException was thrown."); } } [Fact] public async void DeleteAsync_Ok() { var dummyAlert = new EventAlert { Message = "Message", DateMarkedRead = DateTime.Now, CreatedBy = "Some Guy" }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).ReturnsAsync(dummyAlert); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); mockEventAlertRepository.Setup(repo => repo.Remove(It.Is(param => param.Message == "message"))); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var res = await eventAlertService.DeleteAsync(5); } [Fact] public async void DeleteAsync_Null() { var dummyAlert = new EventAlert { Message = "Message", DateMarkedRead = DateTime.Now, CreatedBy = "Some Guy" }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); mockEventAlertRepository.Setup(repo => repo.Remove(It.Is(param => param.Message == "message"))); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.DeleteAsync(5)); } [Fact] public async void DeleteAsync_Remove_Exception() { var dummyAlert = new EventAlert { Message = "Message", DateMarkedRead = DateTime.Now, CreatedBy = "Some Guy" }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).ReturnsAsync(dummyAlert); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); mockEventAlertRepository.Setup(repo => repo.Remove(It.Is(param => param.Message == "Message"))).Throws(new Exception("oops")); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.DeleteAsync(5)); } [Fact] public async void DeleteAsync_Existing_Exception() { var dummyAlert = new EventAlert { Message = "Message", DateMarkedRead = DateTime.Now, CreatedBy = "Some Guy" }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.FindByIdAsync(It.IsAny())).Throws(new Exception("oops")); mockUnitOfWork.Setup(mock => mock.CompleteAsync()).Returns(Task.CompletedTask); mockEventAlertRepository.Setup(repo => repo.Remove(It.Is(param => param.Message == "message"))); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.DeleteAsync(5)); } [Fact] public async void MarkAllAsRead_OK() { var alertList = new List { new EventAlert { Id = 1, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" }, new EventAlert { Id = 2, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" }, new EventAlert { Id = 3, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" } }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListUnreadByAccountNoAsync(It.IsAny())).ReturnsAsync(alertList); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); var result = await eventAlertService.MarkAllAsRead("123-04566"); mockUnitOfWork.Verify(m => m.CompleteAsync(), Times.Once()); mockEventAlertRepository.Verify(m => m.Update(It.IsAny()), Times.Exactly(3)); Assert.NotNull(result); Assert.Equal(3, result.Count()); Assert.Equal(alertList, result); } [Fact] public async void MarkAllAsRead_NotFoundException() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListUnreadByAccountNoAsync(It.IsAny())).Returns(Task.FromResult>(null)); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.MarkAllAsRead("123-04566")); mockUnitOfWork.Verify(m => m.CompleteAsync(), Times.Never()); mockEventAlertRepository.Verify(m => m.Update(It.IsAny()), Times.Never); } [Fact] public async void MarkAllAsRead_Existing_Exception() { var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListUnreadByAccountNoAsync(It.IsAny())).ThrowsAsync(new Exception("oops")); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.MarkAllAsRead("123-04566")); mockUnitOfWork.Verify(m => m.CompleteAsync(), Times.Never()); mockEventAlertRepository.Verify(m => m.Update(It.IsAny()), Times.Never); } [Fact] public async void MarkAllAsRead_Update_Exception() { var alertList = new List { new EventAlert { Id = 1, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" }, new EventAlert { Id = 2, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" }, new EventAlert { Id = 3, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" } }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListUnreadByAccountNoAsync(It.IsAny())).ReturnsAsync(alertList); mockEventAlertRepository.Setup(m => m.Update(It.IsAny())).Throws(new Exception("oops")); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.MarkAllAsRead("123-04566")); mockUnitOfWork.Verify(m => m.CompleteAsync(), Times.Never()); mockEventAlertRepository.Verify(m => m.Update(It.IsAny()), Times.Once); } [Fact] public async void MarkAllAsRead_Update_Exception_On_2nd() { var count = 0; var alertList = new List { new EventAlert { Id = 1, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" }, new EventAlert { Id = 2, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" }, new EventAlert { Id = 3, Message = "Message", CreatedBy = "Some Guy", AccountNo = "123-04566" } }; var mockEventAlertRepository = new Mock(); var mockUnitOfWork = new Mock(); var mockRepoRepository = new Mock(); mockEventAlertRepository.Setup(repo => repo.ListUnreadByAccountNoAsync(It.IsAny())).ReturnsAsync(alertList); mockEventAlertRepository.Setup(m => m.Update(It.IsAny())).Callback(() => { count++; if (count == 2) { throw new Exception("oops"); } }); EventAlertService eventAlertService = new EventAlertService(mockEventAlertRepository.Object, mockUnitOfWork.Object, mockRepoRepository.Object); await Assert.ThrowsAsync(async () => await eventAlertService.MarkAllAsRead("123-04566")); mockUnitOfWork.Verify(m => m.CompleteAsync(), Times.Never()); mockEventAlertRepository.Verify(m => m.Update(It.IsAny()), Times.Exactly(2)); } } }