using System.Threading; using System.Threading.Tasks; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Promotion; using Moq; using Newtonsoft.Json; using WiBLL.Promotion; using WiBLL.WiProcess; using WiDAL.CustomCode.Promotion; using WiDAL.DTOs; using Xunit; namespace WiTests; public class WiProcessPromotionAdapterTests { private static LoginDTO Login() => new() { ClientId = -1, UserId = 7 }; private static WiProcessDTO CleanDto(int wiProcessId = 42) => new() { WiProcessId = wiProcessId, WiProcessCode = "ASSEMBLY", WiProcessName = "Assembly", DepartmentId = 10, DepartmentCode = "PROD", DisplayOrder = 1, IsActive = 1, SortOrder = 1 }; private static (Mock bll, Mock deptLookup, Mock processLookup) Mocks() => (new Mock(), new Mock(), new Mock()); private static WiProcessPromotionAdapter NewAdapter( (Mock bll, Mock deptLookup, Mock processLookup) m) => new(m.bll.Object, m.deptLookup.Object, m.processLookup.Object); private static async Task BuildBundle(WiProcessDTO dto) { var m = Mocks(); m.bll.Setup(b => b.GetById(dto.WiProcessId, It.IsAny(), It.IsAny())) .ReturnsAsync(JsonConvert.SerializeObject(dto)); var adapter = NewAdapter(m); return await adapter.ExportForPromotionAsync(dto.WiProcessId, Login(), CancellationToken.None); } [Fact] public async Task Validate_CleanWiProcess_IsOk() { var bundle = await BuildBundle(CleanDto()); var adapter = NewAdapter(Mocks()); var result = await adapter.ValidateForPromotionAsync(bundle, CancellationToken.None); Assert.True(result.IsPromotable); } [Fact] public async Task Import_FreshInsert_ResolvesDepartmentAndSaves() { var bundle = await BuildBundle(CleanDto()); var m = Mocks(); m.processLookup.Setup(l => l.GetWiProcessIdByCode("ASSEMBLY", It.IsAny(), It.IsAny())) .ReturnsAsync((int?)null); m.deptLookup.Setup(l => l.GetDepartmentIdByCode("PROD", It.IsAny(), It.IsAny())) .ReturnsAsync(55); WiProcessDTO? captured = null; m.bll.Setup(b => b.Save(It.IsAny(), It.IsAny(), It.IsAny())) .Callback((d, _, _) => { captured = d; d.WiProcessId = 904; }) .ReturnsAsync("Saved"); var adapter = NewAdapter(m); var newId = await adapter.ImportPromotedAsync(bundle, destinationSourceType: 3, existingDestinationId: null, Login(), CancellationToken.None); Assert.Equal(904, newId); Assert.NotNull(captured); Assert.Equal(55, captured!.DepartmentId); Assert.Equal("ASSEMBLY", captured.WiProcessCode); Assert.Equal((byte)3, captured.SourceType); } [Fact] public async Task Import_CodeAlreadyExistsAtDestination_UpdatesRatherThanDuplicating() { var bundle = await BuildBundle(CleanDto()); var m = Mocks(); m.processLookup.Setup(l => l.GetWiProcessIdByCode("ASSEMBLY", It.IsAny(), It.IsAny())) .ReturnsAsync(700); m.deptLookup.Setup(l => l.GetDepartmentIdByCode("PROD", It.IsAny(), It.IsAny())) .ReturnsAsync(55); int? capturedId = null; m.bll.Setup(b => b.Save(It.IsAny(), It.IsAny(), It.IsAny())) .Callback((d, _, _) => capturedId = d.WiProcessId) .ReturnsAsync("Updated"); var adapter = NewAdapter(m); var resultId = await adapter.ImportPromotedAsync(bundle, 3, existingDestinationId: null, Login(), CancellationToken.None); Assert.Equal(700, resultId); Assert.Equal(700, capturedId); } }