using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Shouldly; using Xunit; using ZB.MOM.WW.LmxOpcUa.Host.Configuration; using ZB.MOM.WW.LmxOpcUa.Host.GalaxyRepository; namespace ZB.MOM.WW.LmxOpcUa.IntegrationTests { /// /// Integration tests that exercise the real Galaxy repository queries against the test database configuration. /// public class GalaxyRepositoryServiceTests { /// /// Loads repository configuration from the integration test settings and controls whether extended attributes are /// enabled. /// /// A value indicating whether the extended attribute query path should be enabled. /// The repository configuration used by the integration test. private static GalaxyRepositoryConfiguration LoadConfig(bool extendedAttributes = false) { var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.test.json", false) .Build(); var config = new GalaxyRepositoryConfiguration(); configuration.GetSection("GalaxyRepository").Bind(config); config.ExtendedAttributes = extendedAttributes; return config; } /// /// Confirms that the standard attribute query returns rows from the repository. /// [Fact] public async Task GetAttributesAsync_StandardMode_ReturnsRows() { var config = LoadConfig(false); var service = new GalaxyRepositoryService(config); var results = await service.GetAttributesAsync(); results.ShouldNotBeEmpty(); // Standard mode: PrimitiveName and AttributeSource should be empty results.ShouldAllBe(r => r.PrimitiveName == "" && r.AttributeSource == ""); } /// /// Confirms that the extended attribute query returns more rows than the standard query path. /// [Fact] public async Task GetAttributesAsync_ExtendedMode_ReturnsMoreRows() { var standardConfig = LoadConfig(false); var extendedConfig = LoadConfig(true); var standardService = new GalaxyRepositoryService(standardConfig); var extendedService = new GalaxyRepositoryService(extendedConfig); var standardResults = await standardService.GetAttributesAsync(); var extendedResults = await extendedService.GetAttributesAsync(); extendedResults.Count.ShouldBeGreaterThan(standardResults.Count); } /// /// Confirms that the extended attribute query includes both primitive and dynamic attribute sources. /// [Fact] public async Task GetAttributesAsync_ExtendedMode_IncludesPrimitiveAttributes() { var config = LoadConfig(true); var service = new GalaxyRepositoryService(config); var results = await service.GetAttributesAsync(); results.ShouldContain(r => r.AttributeSource == "primitive"); results.ShouldContain(r => r.AttributeSource == "dynamic"); } /// /// Confirms that extended mode populates attribute-source metadata across the result set. /// [Fact] public async Task GetAttributesAsync_ExtendedMode_PrimitiveNamePopulated() { var config = LoadConfig(true); var service = new GalaxyRepositoryService(config); var results = await service.GetAttributesAsync(); // Some primitive attributes have non-empty primitive names // (though many have empty primitive_name for the root UDO) results.ShouldNotBeEmpty(); // All should have an attribute source results.ShouldAllBe(r => r.AttributeSource == "primitive" || r.AttributeSource == "dynamic"); } /// /// Confirms that standard-mode results always include fully qualified tag references. /// [Fact] public async Task GetAttributesAsync_StandardMode_AllHaveFullTagReference() { var config = LoadConfig(false); var service = new GalaxyRepositoryService(config); var results = await service.GetAttributesAsync(); results.ShouldAllBe(r => !string.IsNullOrEmpty(r.FullTagReference)); results.ShouldAllBe(r => r.FullTagReference.Contains(".")); } /// /// Confirms that extended-mode results always include fully qualified tag references. /// [Fact] public async Task GetAttributesAsync_ExtendedMode_AllHaveFullTagReference() { var config = LoadConfig(true); var service = new GalaxyRepositoryService(config); var results = await service.GetAttributesAsync(); results.ShouldAllBe(r => !string.IsNullOrEmpty(r.FullTagReference)); results.ShouldAllBe(r => r.FullTagReference.Contains(".")); } } }