diff --git a/MesaFabApproval.API.Test/PCRBServiceTests.cs b/MesaFabApproval.API.Test/PCRBServiceTests.cs index cf1b95b..c3a2e7d 100644 --- a/MesaFabApproval.API.Test/PCRBServiceTests.cs +++ b/MesaFabApproval.API.Test/PCRBServiceTests.cs @@ -25,25 +25,33 @@ public static class MockMemoryCacheService { public class PCRBServiceTests { private readonly Mock> _loggerMock; private readonly Mock _dalServiceMock; - private readonly Mock _cacheMock; + private Mock _cacheMock; private readonly Mock _userServiceMock; private readonly Mock _approvalServiceMock; private readonly Mock _smtpServiceMock; - private readonly PCRBService _pcrbService; + private PCRBService _pcrbService; + + private static IEnumerable PCRBS = new List() { + new PCRB { + PlanNumber = 1, + OwnerID = 1, + Title = "Test Title", + ChangeLevel = "Level 1", + ReasonForChange = "Test Reason", + ChangeDescription = "Test Description", + IsITAR = false, + CurrentStep = 1, + InsertTimeStamp = DateTime.Now, + LastUpdateDate = DateTime.Now, + Type = "Type 1" + } + }; private static IEnumerable FOLLOW_UPS = new List() { new PCRBFollowUp { ID = 1, PlanNumber = 1, Step = 1, FollowUpDate = DateTime.Now } }; - public PCRBServiceTests() { - _loggerMock = new Mock>(); - _dalServiceMock = new Mock(); - _userServiceMock = new Mock(); - _approvalServiceMock = new Mock(); - _smtpServiceMock = new Mock(); - _cacheMock = MockMemoryCacheService.GetMemoryCache(FOLLOW_UPS); - - var appSettings = new AppSettings( + private static AppSettings appSettings = new AppSettings( Company: "Infineon", DbConnectionString: "connectionString", JwtAudience: "audience", @@ -56,6 +64,14 @@ public class PCRBServiceTests { WorkingDirectoryName: "workingDirectoryName" ); + public PCRBServiceTests() { + _loggerMock = new Mock>(); + _dalServiceMock = new Mock(); + _userServiceMock = new Mock(); + _approvalServiceMock = new Mock(); + _smtpServiceMock = new Mock(); + _cacheMock = MockMemoryCacheService.GetMemoryCache(FOLLOW_UPS); + _pcrbService = new PCRBService( _loggerMock.Object, _dalServiceMock.Object, @@ -67,6 +83,161 @@ public class PCRBServiceTests { ); } + [Fact] + public async Task CreateNewPCRB_WithValidParam_ShouldCreatePCRB() { + var pcrb = new PCRB { + OwnerID = 1, + Title = "Test Title", + ChangeLevel = "Level 1", + ReasonForChange = "Test Reason", + ChangeDescription = "Test Description", + IsITAR = false, + CurrentStep = 1, + InsertTimeStamp = DateTime.Now, + LastUpdateDate = DateTime.Now, + Type = "Type 1" + }; + + _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), pcrb)) + .ReturnsAsync(1); + + await _pcrbService.CreateNewPCRB(pcrb); + + _dalServiceMock.Verify(d => d.ExecuteAsync(It.IsAny(), pcrb), Times.Once); + } + + [Fact] + public async Task CreateNewPCRB_WithNullParam_ShouldThrowException() { + await Assert.ThrowsAsync(() => _pcrbService.CreateNewPCRB(null)); + } + + [Fact] + public async Task CreateNewPCRB_WithDatabaseFailure_ShouldThrowException() { + var pcrb = new PCRB { + OwnerID = 1, + Title = "Test Title", + ChangeLevel = "Level 1", + ReasonForChange = "Test Reason", + ChangeDescription = "Test Description", + IsITAR = false, + CurrentStep = 1, + InsertTimeStamp = DateTime.Now, + LastUpdateDate = DateTime.Now, + Type = "Type 1" + }; + + _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), pcrb)) + .ReturnsAsync(0); + + await Assert.ThrowsAsync(() => _pcrbService.CreateNewPCRB(pcrb)); + } + + [Fact] + public async Task CreateNewPCRB_WithDatabaseException_ShouldThrowException() { + var pcrb = new PCRB { + OwnerID = 1, + Title = "Test Title", + ChangeLevel = "Level 1", + ReasonForChange = "Test Reason", + ChangeDescription = "Test Description", + IsITAR = false, + CurrentStep = 1, + InsertTimeStamp = DateTime.Now, + LastUpdateDate = DateTime.Now, + Type = "Type 1" + }; + + _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), pcrb)) + .Throws(); + + await Assert.ThrowsAsync(() => _pcrbService.CreateNewPCRB(pcrb)); + } + + [Fact] + public async Task UpdatePCRB_WithValidParam_ShouldUpdatePCRB() { + _cacheMock = MockMemoryCacheService.GetMemoryCache(PCRBS); + + _pcrbService = new PCRBService( + _loggerMock.Object, + _dalServiceMock.Object, + _cacheMock.Object, + _userServiceMock.Object, + _approvalServiceMock.Object, + _smtpServiceMock.Object, + appSettings + ); + + var pcrb = new PCRB { + PlanNumber = 1, + OwnerID = 1, + Title = "Test Title", + ChangeLevel = "Level 1", + ReasonForChange = "Test Reason", + ChangeDescription = "Test Description", + IsITAR = false, + CurrentStep = 1, + LastUpdateDate = DateTime.Now, + ClosedDate = DateTime.Now, + Type = "Type 1" + }; + + _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), pcrb)) + .ReturnsAsync(1); + + await _pcrbService.UpdatePCRB(pcrb); + + _dalServiceMock.Verify(d => d.ExecuteAsync(It.IsAny(), pcrb), Times.Once); + } + + [Fact] + public async Task UpdatePCRB_WithNullParam_ShouldThrowException() { + await Assert.ThrowsAsync(() => _pcrbService.UpdatePCRB(null)); + } + + [Fact] + public async Task UpdatePCRB_WithDatabaseFailure_ShouldThrowException() { + var pcrb = new PCRB { + PlanNumber = 1, + OwnerID = 1, + Title = "Test Title", + ChangeLevel = "Level 1", + ReasonForChange = "Test Reason", + ChangeDescription = "Test Description", + IsITAR = false, + CurrentStep = 1, + LastUpdateDate = DateTime.Now, + ClosedDate = DateTime.Now, + Type = "Type 1" + }; + + _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), pcrb)) + .ReturnsAsync(0); + + await Assert.ThrowsAsync(() => _pcrbService.UpdatePCRB(pcrb)); + } + + [Fact] + public async Task UpdatePCRB_WithDatabaseException_ShouldThrowException() { + var pcrb = new PCRB { + PlanNumber = 1, + OwnerID = 1, + Title = "Test Title", + ChangeLevel = "Level 1", + ReasonForChange = "Test Reason", + ChangeDescription = "Test Description", + IsITAR = false, + CurrentStep = 1, + LastUpdateDate = DateTime.Now, + ClosedDate = DateTime.Now, + Type = "Type 1" + }; + + _dalServiceMock.Setup(d => d.ExecuteAsync(It.IsAny(), pcrb)) + .Throws(); + + await Assert.ThrowsAsync(() => _pcrbService.UpdatePCRB(pcrb)); + } + [Fact] public async Task CreateFollowUp_WithValidParam_ShouldCreateFollowUp() { var followUp = new PCRBFollowUp { diff --git a/MesaFabApproval.API/Services/PCRBService.cs b/MesaFabApproval.API/Services/PCRBService.cs index 6bfe1d5..4b44752 100644 --- a/MesaFabApproval.API/Services/PCRBService.cs +++ b/MesaFabApproval.API/Services/PCRBService.cs @@ -78,16 +78,15 @@ public class PCRBService : IPCRBService { if (pcrb is null) throw new ArgumentNullException("PCRB cannot be null"); + pcrb.LastUpdateDate = DateTime.Now; + StringBuilder queryBuilder = new(); queryBuilder.Append("insert into CCChangeControl (OwnerID, Title, ChangeLevel, ReasonForChange, "); - queryBuilder.Append("ChangeDescription, IsITAR, CurrentStep, InsertTimeStamp, LastUpdateDate) "); - queryBuilder.Append($"values ({pcrb.OwnerID}, '{pcrb.Title}', '{pcrb.ChangeLevel}', "); - queryBuilder.Append($"'{pcrb.ReasonForChange}', '{pcrb.ChangeDescription}', "); - queryBuilder.Append($"{Convert.ToInt32(pcrb.IsITAR)}, {pcrb.CurrentStep}, "); - queryBuilder.Append($"'{pcrb.InsertTimeStamp.ToString("yyyy-MM-dd HH:mm:ss")}', "); - queryBuilder.Append($"'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')"); + queryBuilder.Append("ChangeDescription, IsITAR, CurrentStep, InsertTimeStamp, LastUpdateDate, Type) "); + queryBuilder.Append("values (@OwnerID, @Title, @ChangeLevel, @ReasonForChange, @ChangeDescription, "); + queryBuilder.Append("@IsITAR, @CurrentStep, @InsertTimeStamp, @LastUpdateDate, @Type)"); - int rowsCreated = await _dalService.ExecuteAsync(queryBuilder.ToString()); + int rowsCreated = await _dalService.ExecuteAsync(queryBuilder.ToString(), pcrb); if (rowsCreated <= 0) throw new Exception("unable to insert new PCRB in the database"); } catch (Exception ex) { @@ -198,18 +197,16 @@ public class PCRBService : IPCRBService { if (pcrb is null) throw new ArgumentNullException("PCRB cannot be null"); - StringBuilder queryBuilder = new(); - queryBuilder.Append($"update CCChangeControl set OwnerID={pcrb.OwnerID}, "); - queryBuilder.Append($"Title='{pcrb.Title.Replace("'", "''")}', ChangeLevel='{pcrb.ChangeLevel}', "); - queryBuilder.Append($"CurrentStep={pcrb.CurrentStep}, ReasonForChange='{pcrb.ReasonForChange.Replace("'", "''")}', "); - queryBuilder.Append($"ChangeDescription='{pcrb.ChangeDescription.Replace("'", "''")}', "); - queryBuilder.Append($"IsITAR={Convert.ToInt32(pcrb.IsITAR)}, "); - queryBuilder.Append($"InsertTimeStamp='{pcrb.InsertTimeStamp.ToString("yyyy-MM-dd HH:mm:ss")}', "); - queryBuilder.Append($"ClosedDate='{pcrb.ClosedDate.ToString("yyyy-MM-dd HH:mm:ss")}', "); - queryBuilder.Append($"LastUpdateDate='{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}' "); - queryBuilder.Append($"where PlanNumber={pcrb.PlanNumber}"); + pcrb.LastUpdateDate = DateTime.Now; - int rowsAffected = await _dalService.ExecuteAsync(queryBuilder.ToString()); + StringBuilder queryBuilder = new(); + queryBuilder.Append("update CCChangeControl set OwnerID=@OwnerID, Title=@Title, ChangeLevel=@ChangeLevel, "); + queryBuilder.Append("Type=@Type, CurrentStep=@CurrentStep, ReasonForChange=@ReasonForChange, "); + queryBuilder.Append("ChangeDescription=@ChangeDescription, IsITAR=@IsITAR, ClosedDate=@ClosedDate, "); + queryBuilder.Append("LastUpdateDate=@LastUpdateDate "); + queryBuilder.Append($"where PlanNumber=@PlanNumber"); + + int rowsAffected = await _dalService.ExecuteAsync(queryBuilder.ToString(), pcrb); if (rowsAffected <= 0) throw new Exception("unable to perform update in database"); diff --git a/MesaFabApproval.Client/Pages/PCRBSingle.razor b/MesaFabApproval.Client/Pages/PCRBSingle.razor index bc8fe34..eef2240 100644 --- a/MesaFabApproval.Client/Pages/PCRBSingle.razor +++ b/MesaFabApproval.Client/Pages/PCRBSingle.razor @@ -137,6 +137,20 @@ + + + + + + +