using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform; public class MdpStandardUpsertContractTests { [Fact] public void S1ShipStandardUpsert_RefreshesFactoryScope() { var source = File.ReadAllText(FindFile( "server", "Plugins", "Admin.NET.Plugin.AiDOP", "Order", "S1MdpSyncTransformService.cs")); Assert.True(Count(source, "factory_id=VALUES(factory_id)") >= 3); Assert.Contains("shipper_no=VALUES(shipper_no)", source); Assert.DoesNotContain("SELECT tenant_id AS TenantId, 1 AS FactoryId,\n 'S1_L1_004'", source); Assert.DoesNotContain("SELECT tenant_id AS TenantId, 1 AS FactoryId,\n 'S1_L2_013'", source); Assert.DoesNotContain("SELECT tenant_id AS TenantId, 1 AS FactoryId,\n 'S1_L2_014'", source); Assert.DoesNotContain("SELECT tenant_id AS TenantId, 1 AS FactoryId,\n 'S1_L2_015'", source); } [Fact] public void S3DeliveryScheduleUpsert_RefreshesLifecycleDates() { var source = File.ReadAllText(FindFile( "server", "Plugins", "Admin.NET.Plugin.AiDOP", "Supply", "S3MdpSyncTransformService.cs")); Assert.Contains("request_date=VALUES(request_date)", source); Assert.Contains("submit_date=VALUES(submit_date)", source); Assert.Contains("last_sent_date=VALUES(last_sent_date)", source); Assert.Contains("send_date=VALUES(send_date)", source); Assert.Contains("arrive_date=VALUES(arrive_date)", source); Assert.Contains("issued_qty=VALUES(issued_qty)", source); Assert.Contains("shortage_qty=VALUES(shortage_qty)", source); Assert.Contains("ready_status=VALUES(ready_status)", source); Assert.Contains("factory_id=VALUES(factory_id)", source); } [Fact] public void S3S4DashboardDerivedQueries_StayFactoryScoped() { var source = File.ReadAllText(FindFile( "server", "Plugins", "Admin.NET.Plugin.AiDOP", "Controllers", "AidopKanbanController.cs")); Assert.Contains("GetS3ReadinessSummaryAsync(long tenantId, long factoryId)", source); Assert.Contains("GetS3DeliverySummaryAsync(long tenantId, long factoryId)", source); Assert.True(Count(source, "COALESCE(NULLIF(factory_id,0),1)=@factoryId") >= 10); } [Fact] public void S4ProcurementCycle_UsesActualReceiptDate() { var source = File.ReadAllText(FindFile( "server", "Plugins", "Admin.NET.Plugin.AiDOP", "ProcurementExecution", "S4MdpSyncTransformService.cs")); Assert.Contains("FROM mdp_std_delivery_result", source); Assert.Contains("MAX(receipt_date) AS receipt_date", source); Assert.Contains("TIMESTAMPDIFF(DAY, ds.request_date, r.receipt_date)", source); Assert.DoesNotContain( "TIMESTAMPDIFF(DAY, ds.request_date, COALESCE(ds.submit_date, ds.last_sent_date))", source); } private static int Count(string source, string token) { var count = 0; for (var index = 0; (index = source.IndexOf(token, index, StringComparison.Ordinal)) >= 0; index += token.Length) count++; return count; } private static string FindFile(params string[] parts) { var dir = new DirectoryInfo(AppContext.BaseDirectory); while (dir != null) { var candidate = Path.Combine(new[] { dir.FullName }.Concat(parts).ToArray()); if (File.Exists(candidate)) return candidate; dir = dir.Parent; } throw new FileNotFoundException(string.Join("/", parts)); } }