Migrate historian from SQL to aahClientManaged SDK and resolve all OPC UA Part 11 gaps
Replace direct SQL queries against Historian Runtime database with the Wonderware Historian managed SDK (ArchestrA.HistorianAccess). Add HistoryServerCapabilities node, AggregateFunctions folder, continuation points, ReadAtTime interpolation, ReturnBounds, ReadModified rejection, HistoricalDataConfiguration per node, historical event access, and client-side StandardDeviation aggregate support. Remove screenshot tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,7 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.Configuration
|
||||
configuration.GetSection("GalaxyRepository").Bind(config.GalaxyRepository);
|
||||
configuration.GetSection("Dashboard").Bind(config.Dashboard);
|
||||
configuration.GetSection("Security").Bind(config.Security);
|
||||
configuration.GetSection("Historian").Bind(config.Historian);
|
||||
return config;
|
||||
}
|
||||
|
||||
@@ -315,5 +316,75 @@ namespace ZB.MOM.WW.LmxOpcUa.Tests.Configuration
|
||||
configuration.GetSection("OpcUa").Bind(config);
|
||||
config.ApplicationUri.ShouldBe("urn:test:app");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Historian_Section_BindsFromJson()
|
||||
{
|
||||
var config = LoadFromJson();
|
||||
config.Historian.Enabled.ShouldBe(false);
|
||||
config.Historian.ServerName.ShouldBe("localhost");
|
||||
config.Historian.IntegratedSecurity.ShouldBe(true);
|
||||
config.Historian.Port.ShouldBe(32568);
|
||||
config.Historian.CommandTimeoutSeconds.ShouldBe(30);
|
||||
config.Historian.MaxValuesPerRead.ShouldBe(10000);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Historian_Section_BindsCustomValues()
|
||||
{
|
||||
var configuration = new ConfigurationBuilder()
|
||||
.AddInMemoryCollection(new[]
|
||||
{
|
||||
new KeyValuePair<string, string>("Historian:Enabled", "true"),
|
||||
new KeyValuePair<string, string>("Historian:ServerName", "historian-server"),
|
||||
new KeyValuePair<string, string>("Historian:IntegratedSecurity", "false"),
|
||||
new KeyValuePair<string, string>("Historian:UserName", "testuser"),
|
||||
new KeyValuePair<string, string>("Historian:Password", "testpass"),
|
||||
new KeyValuePair<string, string>("Historian:Port", "12345"),
|
||||
new KeyValuePair<string, string>("Historian:CommandTimeoutSeconds", "60"),
|
||||
new KeyValuePair<string, string>("Historian:MaxValuesPerRead", "5000")
|
||||
})
|
||||
.Build();
|
||||
|
||||
var config = new HistorianConfiguration();
|
||||
configuration.GetSection("Historian").Bind(config);
|
||||
|
||||
config.Enabled.ShouldBe(true);
|
||||
config.ServerName.ShouldBe("historian-server");
|
||||
config.IntegratedSecurity.ShouldBe(false);
|
||||
config.UserName.ShouldBe("testuser");
|
||||
config.Password.ShouldBe("testpass");
|
||||
config.Port.ShouldBe(12345);
|
||||
config.CommandTimeoutSeconds.ShouldBe(60);
|
||||
config.MaxValuesPerRead.ShouldBe(5000);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Validator_HistorianEnabled_EmptyServerName_ReturnsFalse()
|
||||
{
|
||||
var config = new AppConfiguration();
|
||||
config.Historian.Enabled = true;
|
||||
config.Historian.ServerName = "";
|
||||
ConfigurationValidator.ValidateAndLog(config).ShouldBe(false);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Validator_HistorianEnabled_InvalidPort_ReturnsFalse()
|
||||
{
|
||||
var config = new AppConfiguration();
|
||||
config.Historian.Enabled = true;
|
||||
config.Historian.Port = 0;
|
||||
ConfigurationValidator.ValidateAndLog(config).ShouldBe(false);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Validator_HistorianEnabled_NoIntegratedSecurity_EmptyUserName_ReturnsFalse()
|
||||
{
|
||||
var config = new AppConfiguration();
|
||||
config.Historian.Enabled = true;
|
||||
config.Historian.IntegratedSecurity = false;
|
||||
config.Historian.UserName = "";
|
||||
ConfigurationValidator.ValidateAndLog(config).ShouldBe(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
using ZB.MOM.WW.LmxOpcUa.Host.Configuration;
|
||||
|
||||
namespace ZB.MOM.WW.LmxOpcUa.Tests.Configuration
|
||||
{
|
||||
public class HistorianConfigurationTests
|
||||
{
|
||||
[Fact]
|
||||
public void DefaultConfig_Disabled()
|
||||
{
|
||||
var config = new HistorianConfiguration();
|
||||
config.Enabled.ShouldBe(false);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultConfig_ServerNameLocalhost()
|
||||
{
|
||||
var config = new HistorianConfiguration();
|
||||
config.ServerName.ShouldBe("localhost");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultConfig_IntegratedSecurityTrue()
|
||||
{
|
||||
var config = new HistorianConfiguration();
|
||||
config.IntegratedSecurity.ShouldBe(true);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultConfig_UserNameNull()
|
||||
{
|
||||
var config = new HistorianConfiguration();
|
||||
config.UserName.ShouldBeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultConfig_PasswordNull()
|
||||
{
|
||||
var config = new HistorianConfiguration();
|
||||
config.Password.ShouldBeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultConfig_Port32568()
|
||||
{
|
||||
var config = new HistorianConfiguration();
|
||||
config.Port.ShouldBe(32568);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultConfig_CommandTimeout30()
|
||||
{
|
||||
var config = new HistorianConfiguration();
|
||||
config.CommandTimeoutSeconds.ShouldBe(30);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DefaultConfig_MaxValuesPerRead10000()
|
||||
{
|
||||
var config = new HistorianConfiguration();
|
||||
config.MaxValuesPerRead.ShouldBe(10000);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user