using NSubstitute; using ZB.MOM.WW.ScadaBridge.Commons.Entities.ExternalSystems; using ZB.MOM.WW.ScadaBridge.Commons.Entities.InboundApi; using ZB.MOM.WW.ScadaBridge.Commons.Entities.Instances; using ZB.MOM.WW.ScadaBridge.Commons.Entities.Notifications; using ZB.MOM.WW.ScadaBridge.Commons.Entities.Scripts; using ZB.MOM.WW.ScadaBridge.Commons.Entities.Sites; using ZB.MOM.WW.ScadaBridge.Commons.Entities.Templates; using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Repositories; using ZB.MOM.WW.ScadaBridge.Commons.Types.Templates; using ZB.MOM.WW.ScadaBridge.Commons.Types.Transport; using ZB.MOM.WW.ScadaBridge.Transport.Export; namespace ZB.MOM.WW.ScadaBridge.Transport.Tests.Export; public sealed class DependencyResolverTests { private readonly ITemplateEngineRepository _templates = Substitute.For(); private readonly IExternalSystemRepository _externalSystems = Substitute.For(); private readonly INotificationRepository _notifications = Substitute.For(); private readonly IInboundApiRepository _inboundApi = Substitute.For(); private readonly ISiteRepository _sites = Substitute.For(); private DependencyResolver Sut() => new(_templates, _externalSystems, _notifications, _inboundApi, _sites); private static ExportSelection SelectTemplates(params int[] ids) => new( TemplateIds: ids, SharedScriptIds: Array.Empty(), ExternalSystemIds: Array.Empty(), DatabaseConnectionIds: Array.Empty(), NotificationListIds: Array.Empty(), SmtpConfigurationIds: Array.Empty(), ApiMethodIds: Array.Empty(), IncludeDependencies: true); private static ExportSelection SelectApiMethods(params int[] ids) => new( TemplateIds: Array.Empty(), SharedScriptIds: Array.Empty(), ExternalSystemIds: Array.Empty(), NotificationListIds: Array.Empty(), DatabaseConnectionIds: Array.Empty(), SmtpConfigurationIds: Array.Empty(), ApiMethodIds: ids, IncludeDependencies: true); private static ExportSelection SelectSites(int[] siteIds, bool includeDeps = true) => new( TemplateIds: Array.Empty(), SharedScriptIds: Array.Empty(), ExternalSystemIds: Array.Empty(), DatabaseConnectionIds: Array.Empty(), NotificationListIds: Array.Empty(), SmtpConfigurationIds: Array.Empty(), ApiMethodIds: Array.Empty(), IncludeDependencies: includeDeps, SiteIds: siteIds); private static ExportSelection SelectInstances(int[] instanceIds, bool includeDeps = true, int[]? siteIds = null) => new( TemplateIds: Array.Empty(), SharedScriptIds: Array.Empty(), ExternalSystemIds: Array.Empty(), DatabaseConnectionIds: Array.Empty(), NotificationListIds: Array.Empty(), SmtpConfigurationIds: Array.Empty(), ApiMethodIds: Array.Empty(), IncludeDependencies: includeDeps, SiteIds: siteIds ?? Array.Empty(), InstanceIds: instanceIds); private static ExportSelection SelectSmsConfigs(params int[] ids) => new( TemplateIds: Array.Empty(), SharedScriptIds: Array.Empty(), ExternalSystemIds: Array.Empty(), DatabaseConnectionIds: Array.Empty(), NotificationListIds: Array.Empty(), SmtpConfigurationIds: Array.Empty(), ApiMethodIds: Array.Empty(), IncludeDependencies: true, SmsConfigurationIds: ids); // Templates registered via StubTemplate. Backs both the by-id accessor and the // batched stub + by-name accessors the resolver uses for closure expansion // (review 2026-10-21 04/P5). private readonly List