using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry;
using OpenTelemetry.Trace;
using Shouldly;
using Xunit;
using ZB.MOM.WW.OtOpcUa.Cluster;
using ZB.MOM.WW.OtOpcUa.Host.Observability;
using ZB.MOM.WW.Telemetry;
namespace ZB.MOM.WW.OtOpcUa.Host.IntegrationTests;
///
/// scadaproj#55 — the OTel Resource carries site.id (the node's application Cluster id),
/// node.role (its plain roles) and service.version (entry-assembly default), so two
/// OtOpcUa nodes are distinguishable by more than service.instance.id.
///
public sealed class ObservabilityResourceIdentityTests
{
private static IConfiguration EmptyConfig() => new ConfigurationBuilder().Build();
[Fact]
public void FusedNode_ReportsClusterIdAndCanonicalRoles()
{
var roles = EffectiveRoles.Resolve(["driver", "cluster-SITE-A", "admin"], envRoles: null);
var o = new ZbTelemetryOptions();
ObservabilityExtensions.ConfigureTelemetry(o, EmptyConfig(), roles);
o.SiteId.ShouldBe("SITE-A");
o.NodeRole.ShouldBe("admin,driver");
o.ServiceVersion.ShouldBeNull(); // null = the library's entry-assembly default
}
[Fact]
public void LegacyNodeWithoutClusterRole_OmitsSiteId()
{
var roles = EffectiveRoles.Resolve(["driver"], envRoles: null);
var o = new ZbTelemetryOptions();
ObservabilityExtensions.ConfigureTelemetry(o, EmptyConfig(), roles);
o.SiteId.ShouldBeNull();
o.NodeRole.ShouldBe("driver");
}
[Fact]
public void NoRoles_OmitsNodeRole()
{
ObservabilityExtensions.NodeRoleOf(EffectiveRoles.Resolve(null, null)).ShouldBeNull();
}
[Fact]
public void BuiltContainer_ResourceCarriesIdentityAndVersion()
{
var builder = WebApplication.CreateBuilder(new WebApplicationOptions { Args = [] });
builder.Services.AddOtOpcUaObservability(
builder.Configuration, EffectiveRoles.Resolve(["admin", "driver", "cluster-MAIN"], null));
using var app = builder.Build();
var attributes = app.Services.GetRequiredService().GetResource().Attributes
.ToDictionary(a => a.Key, a => a.Value);
attributes["service.name"].ShouldBe("otopcua");
attributes["site.id"].ShouldBe("MAIN");
attributes["node.role"].ShouldBe("admin,driver");
attributes["service.version"].ShouldBe(ZbResource.DefaultServiceVersion);
((string)attributes["service.version"]).ShouldNotBeNullOrWhiteSpace();
}
}