feat(host): add NodeName to NodeOptions + INodeIdentityProvider

- NodeName: semantic role-within-cluster identifier (node-a/node-b on sites,
  central-a/central-b on central). Bound from ScadaLink:Node:NodeName.
- INodeIdentityProvider exposes the trimmed name (null if unconfigured) so
  downstream audit writers can stamp the new SourceNode column.
This commit is contained in:
Joseph Doherty
2026-05-23 15:38:27 -04:00
parent 9e5e32d0f2
commit 2e10cbe42d
6 changed files with 110 additions and 0 deletions

View File

@@ -0,0 +1,50 @@
using Microsoft.Extensions.Options;
using ScadaLink.Commons.Interfaces.Services;
namespace ScadaLink.Host.Tests;
/// <summary>
/// Tests for NodeIdentityProvider — surfaces the operator-configured semantic
/// node name (e.g. node-a / node-b / central-a / central-b) used by downstream
/// audit writers to stamp the SourceNode column.
/// </summary>
public class NodeIdentityProviderTests
{
private static INodeIdentityProvider BuildProvider(string nodeName)
{
var options = Options.Create(new NodeOptions { NodeName = nodeName });
return new NodeIdentityProvider(options);
}
[Fact]
public void NodeIdentityProvider_returns_configured_NodeName()
{
var provider = BuildProvider("central-a");
Assert.Equal("central-a", provider.NodeName);
}
[Fact]
public void NodeIdentityProvider_returns_null_when_NodeName_unset()
{
var provider = BuildProvider(string.Empty);
Assert.Null(provider.NodeName);
}
[Fact]
public void NodeIdentityProvider_returns_null_when_NodeName_whitespace()
{
var provider = BuildProvider(" ");
Assert.Null(provider.NodeName);
}
[Fact]
public void NodeIdentityProvider_trims_whitespace()
{
var provider = BuildProvider(" node-a ");
Assert.Equal("node-a", provider.NodeName);
}
}