using Admin.NET.Plugin.AiDOP.Manufacturing; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.S6.Manufacturing; public class S6MdpSyncTransformServiceTests { [Fact] public void OrderFulfillmentPercent_ClampsEachOrderToZeroAndOneHundred() { var value = S6MdpSyncTransformService.CalculateOrderFulfillmentPercent(new[] { (PlanQty: (decimal?)100m, DoneQty: (decimal?)150m), (PlanQty: (decimal?)100m, DoneQty: (decimal?)-20m), (PlanQty: (decimal?)0m, DoneQty: (decimal?)100m) }); Assert.Equal(50m, value); } [Fact] public void RunFull_ContainsAllThreeOrderLevelKpis() { var source = ReadServiceSource(); Assert.Contains("result.MergeSub(\"S6_L1_001\"", source); Assert.Contains("result.MergeSub(\"S6_L1_002\"", source); Assert.Contains("result.MergeSub(\"S6_L1_003\"", source); } [Fact] public void OrderAndWorkOrderKpis_WriteToSeparateValueTables() { var source = ReadServiceSource(); Assert.Contains("UpsertKpiValueAsync(\"S6_L1_001\"", source); Assert.Contains("UpsertKpiValueAsync(\"S6_L1_002\"", source); Assert.Contains("UpsertKpiValueAsync(\"S6_L1_003\"", source); Assert.Contains("UpsertKpiValueAsync(\"S6_L2_002\"", source); Assert.Contains("UpsertKpiValueAsync(\"S6_L2_003\"", source); Assert.Contains("option, L2ValueTable)", source); Assert.Contains("valueTable = \"ado_s9_kpi_value_l1_day\"", source); } [Fact] public void StandardLayerQueries_UseTenantAndZtidParameters() { var source = ReadServiceSource(); Assert.DoesNotContain("where a.ztid=@ztid", source, StringComparison.OrdinalIgnoreCase); Assert.DoesNotContain("where ztid=@ztid", source, StringComparison.OrdinalIgnoreCase); Assert.Contains("tenant_id=@tenantId", source, StringComparison.OrdinalIgnoreCase); Assert.Contains("a.ztid=@ztid", source, StringComparison.OrdinalIgnoreCase); } [Fact] public void OrderLevelQueries_AvoidReservedLinesAlias() { var source = ReadServiceSource(); Assert.DoesNotContain(") lines", source, StringComparison.OrdinalIgnoreCase); Assert.Contains(") order_lines", source, StringComparison.OrdinalIgnoreCase); } private static string ReadServiceSource() { var dir = new DirectoryInfo(AppContext.BaseDirectory); while (dir != null) { var candidate = Path.Combine(dir.FullName, "server", "Plugins", "Admin.NET.Plugin.AiDOP", "Manufacturing", "S6MdpSyncTransformService.cs"); if (File.Exists(candidate)) return File.ReadAllText(candidate); dir = dir.Parent; } throw new FileNotFoundException("S6MdpSyncTransformService.cs"); } }