using MesaFabApproval.API.Services; using MesaFabApproval.Models; using MesaFabApproval.Shared.Models; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; using Moq; namespace MesaFabApproval.API.Test; public class PCRBFollowUpCommentsTests { private readonly Mock> _loggerMock; private readonly Mock _dalServiceMock; private readonly Mock _cacheMock; private readonly Mock _userServiceMock; private readonly Mock _approvalServiceMock; private readonly Mock _smtpServiceMock; private readonly PCRBService _pcrbService; private readonly AppSettings _appSettings; private static PCRBFollowUpComment FOLLOW_UP_COMMENT = new PCRBFollowUpComment { PlanNumber = 1, FollowUpID = 1, Comment = "Comment", UserID = 1 }; private static IEnumerable FOLLOW_UP_COMMENTS = new List() { FOLLOW_UP_COMMENT }; public PCRBFollowUpCommentsTests() { _loggerMock = new Mock>(); _dalServiceMock = new Mock(); _userServiceMock = new Mock(); _approvalServiceMock = new Mock(); _smtpServiceMock = new Mock(); _cacheMock = MockMemoryCacheService.GetMemoryCache(FOLLOW_UP_COMMENTS); _appSettings = new AppSettings( Company: "Infineon", DbConnectionString: "connectionString", JwtAudience: "audience", JwtIssuer: "issuer", JwtKey: "key", MrbAttachmentPath: "mrbAttachmentPath", PcrbAttachmentPath: "pcrbAttachmentPath", ShouldSendEmail: false, SiteBaseUrl: "siteBaseUrl", WorkingDirectoryName: "workingDirectoryName" ); _pcrbService = new PCRBService( _loggerMock.Object, _dalServiceMock.Object, _cacheMock.Object, _userServiceMock.Object, _approvalServiceMock.Object, _smtpServiceMock.Object, _appSettings ); } [Fact] public async Task CreateFollowUpComment_WithValidParam_ShouldCreateFollowUp() { _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), FOLLOW_UP_COMMENT)) .ReturnsAsync(1); await _pcrbService.CreateFollowUpComment(FOLLOW_UP_COMMENT); _dalServiceMock.Verify(d => d.ExecuteAsync(It.IsAny(), FOLLOW_UP_COMMENT), Times.Once); } [Fact] public async Task CreateFollowUpComment_WithNullParam_ShouldThrowException() { await Assert.ThrowsAsync(() => _pcrbService.CreateFollowUpComment(null)); } [Fact] public async Task CreateFollowUpComment_WithDatabaseFailure_ShouldThrowException() { _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), FOLLOW_UP_COMMENT)) .ReturnsAsync(0); await Assert.ThrowsAsync(() => _pcrbService.CreateFollowUpComment(FOLLOW_UP_COMMENT)); } [Fact] public async Task CreateFollowUpComment_WithDatabaseException_ShouldThrowException() { _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), FOLLOW_UP_COMMENT)) .Throws(); await Assert.ThrowsAsync(() => _pcrbService.CreateFollowUpComment(FOLLOW_UP_COMMENT)); } [Fact] public async Task GetFollowUpCommentsByPlanNumber_WithCacheBypass_ShouldReturnFollowUps() { int planNumber = 1; _dalServiceMock.Setup(d => d.QueryAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(FOLLOW_UP_COMMENTS); IEnumerable result = await _pcrbService.GetFollowUpCommentsByPlanNumber(planNumber, true); Assert.NotNull(result); Assert.Single(result); Assert.Equal(FOLLOW_UP_COMMENTS, result); _dalServiceMock.Verify(d => d.QueryAsync(It.IsAny(), It.IsAny()), Times.Once); } [Fact] public async Task GetFollowUpCommentsByPlanNumber_WithCacheBypass_AndDatabaseException_ShouldThrowException() { int planNumber = 1; _dalServiceMock.Setup(d => d.QueryAsync(It.IsAny(), It.IsAny())) .Throws(); await Assert.ThrowsAsync(() => _pcrbService.GetFollowUpCommentsByPlanNumber(planNumber, true)); } [Fact] public async Task GetFollowUpCommentsByPlanNumber_WithoutCacheBypass_ShouldReturnFollowUps() { int planNumber = 1; IEnumerable result = await _pcrbService.GetFollowUpCommentsByPlanNumber(planNumber, false); Assert.NotNull(result); Assert.Single(result); Assert.Equal(FOLLOW_UP_COMMENTS, result); } [Fact] public async Task UpdateFollowUpComment_WithValidParam_ShouldUpdateFollowUp() { _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), FOLLOW_UP_COMMENT)) .ReturnsAsync(1); await _pcrbService.UpdateFollowUpComment(FOLLOW_UP_COMMENT); _dalServiceMock.Verify(d => d.ExecuteAsync(It.IsAny(), FOLLOW_UP_COMMENT), Times.Once); } [Fact] public async Task UpdateFollowUpComment_WithNullParam_ShouldThrowException() { await Assert.ThrowsAsync(() => _pcrbService.UpdateFollowUpComment(null)); } [Fact] public async Task UpdateFollowUpComment_WithDatabaseFailure_ShouldThrowException() { _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), FOLLOW_UP_COMMENT)) .ReturnsAsync(0); await Assert.ThrowsAsync(() => _pcrbService.UpdateFollowUpComment(FOLLOW_UP_COMMENT)); } [Fact] public async Task UpdateFollowUpComment_WithDatabaseException_ShouldThrowException() { _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), FOLLOW_UP_COMMENT)) .Throws(); await Assert.ThrowsAsync(() => _pcrbService.UpdateFollowUpComment(FOLLOW_UP_COMMENT)); } [Fact] public async Task DeleteFollowUpComment_WithValidId_ShouldDeleteFollowUp() { int commentId = 1; _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(1); await _pcrbService.DeleteFollowUpComment(commentId); _dalServiceMock.Verify(d => d.ExecuteAsync(It.IsAny(), It.IsAny()), Times.Once); } [Fact] public async Task DeleteFollowUpComment_WithInvalidId_ShouldThrowException() { await Assert.ThrowsAsync(() => _pcrbService.DeleteFollowUpComment(0)); } [Fact] public async Task DeleteFollowUpComment_WithDatabaseFailure_ShouldThrowException() { int commentId = 1; _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(0); await Assert.ThrowsAsync(() => _pcrbService.DeleteFollowUpComment(commentId)); } [Fact] public async Task DeleteFollowUpComment_WithDatabaseException_ShouldThrowException() { int commentId = 1; _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), It.IsAny())) .Throws(); await Assert.ThrowsAsync(() => _pcrbService.DeleteFollowUpComment(commentId)); } }