using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform; public class T8KpiTenantIsolationContractTests { [Theory] [InlineData("MaterialWarehouse", "S5MdpSyncTransformService.cs")] [InlineData("FinishedWarehouse", "S7MdpSyncTransformService.cs")] [InlineData("Manufacturing", "S6MdpSyncTransformService.cs")] public void StandardLayerQueries_FilterByTenantAndDoNotReadT8Tables(string moduleDirectory, string serviceFile) { var source = ReadServiceSource(moduleDirectory, serviceFile); Assert.Contains("@tenantId", source, StringComparison.OrdinalIgnoreCase); Assert.DoesNotContain("mdp_std_t8_", source, StringComparison.OrdinalIgnoreCase); Assert.Contains( "new SugarParameter(\"@tenantId\", option.TargetTenantId)", source, StringComparison.Ordinal); } [Fact] public void S5_FulfillmentAndEfficiency_KeepTenantPredicate() { var source = ReadServiceSource("MaterialWarehouse", "S5MdpSyncTransformService.cs"); Assert.Contains("tenant_id=@tenantId", source, StringComparison.OrdinalIgnoreCase); Assert.Contains("position_code='WAREHOUSE'", source, StringComparison.Ordinal); Assert.Contains("biz_doc_type='PROD_ISSUE'", source, StringComparison.Ordinal); } [Fact] public void S7_CycleFulfillmentAndEfficiency_KeepTenantPredicate() { var source = ReadServiceSource("FinishedWarehouse", "S7MdpSyncTransformService.cs"); Assert.Contains("tenant_id=@tenantId", source, StringComparison.OrdinalIgnoreCase); Assert.Contains("position_code='WAREHOUSE'", source, StringComparison.Ordinal); Assert.Contains("biz_doc_type='SALES_SHIP'", source, StringComparison.Ordinal); } private static string ReadServiceSource(string moduleDirectory, string serviceFile) { var dir = new DirectoryInfo(AppContext.BaseDirectory); while (dir != null) { var candidate = Path.Combine( dir.FullName, "server", "Plugins", "Admin.NET.Plugin.AiDOP", moduleDirectory, serviceFile); if (File.Exists(candidate)) return File.ReadAllText(candidate); dir = dir.Parent; } throw new FileNotFoundException(serviceFile); } }