From 2ff138f1e8566b73c9278967b667fb9c1849ac33 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 28 May 2026 11:52:28 -0400 Subject: [PATCH] feat(templates): apply InstanceConnectionBinding override during flattening --- .../Flattening/FlatteningService.cs | 3 +- .../ConnectionBindingOverrideTests.cs | 83 +++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 tests/ZB.MOM.WW.ScadaBridge.TemplateEngine.Tests/Flattening/ConnectionBindingOverrideTests.cs diff --git a/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/Flattening/FlatteningService.cs b/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/Flattening/FlatteningService.cs index aff9c2d2..de6c7f0d 100644 --- a/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/Flattening/FlatteningService.cs +++ b/src/ZB.MOM.WW.ScadaBridge.TemplateEngine/Flattening/FlatteningService.cs @@ -365,7 +365,8 @@ public class FlatteningService { BoundDataConnectionId = connection.Id, BoundDataConnectionName = connection.Name, - BoundDataConnectionProtocol = connection.Protocol + BoundDataConnectionProtocol = connection.Protocol, + DataSourceReference = binding.DataSourceReferenceOverride ?? existing.DataSourceReference }; } } diff --git a/tests/ZB.MOM.WW.ScadaBridge.TemplateEngine.Tests/Flattening/ConnectionBindingOverrideTests.cs b/tests/ZB.MOM.WW.ScadaBridge.TemplateEngine.Tests/Flattening/ConnectionBindingOverrideTests.cs new file mode 100644 index 00000000..cfbe30f6 --- /dev/null +++ b/tests/ZB.MOM.WW.ScadaBridge.TemplateEngine.Tests/Flattening/ConnectionBindingOverrideTests.cs @@ -0,0 +1,83 @@ +using ZB.MOM.WW.ScadaBridge.Commons.Entities.Instances; +using ZB.MOM.WW.ScadaBridge.Commons.Entities.Sites; +using ZB.MOM.WW.ScadaBridge.Commons.Entities.Templates; +using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums; +using ZB.MOM.WW.ScadaBridge.TemplateEngine.Flattening; + +namespace ZB.MOM.WW.ScadaBridge.TemplateEngine.Tests.Flattening; + +public class ConnectionBindingOverrideTests +{ + private readonly FlatteningService _sut = new(); + + private static Instance CreateInstance(string name = "TestInstance", int templateId = 1, int siteId = 1) => + new(name) { Id = 1, TemplateId = templateId, SiteId = siteId }; + + private static Template CreateTemplate(int id, string name) + { + return new Template(name) { Id = id }; + } + + private static Template CreateTemplateWithDataSourcedAttribute(string attributeName, string dataSourceReference) + { + var template = CreateTemplate(1, "Base"); + template.Attributes.Add(new TemplateAttribute(attributeName) + { + DataType = DataType.Double, + DataSourceReference = dataSourceReference + }); + return template; + } + + private static Dictionary SingleConnection(int id = 1) => + new() + { + [id] = new("OPC-Server1", "OpcUa", 1) { Id = id, PrimaryConfiguration = "opc.tcp://localhost:4840" } + }; + + [Fact] + public void Override_replaces_template_DataSourceReference_when_set() + { + var template = CreateTemplateWithDataSourcedAttribute("Speed", dataSourceReference: "TemplateDefault"); + var instance = CreateInstance(); + instance.ConnectionBindings.Add(new InstanceConnectionBinding("Speed") + { + DataConnectionId = 1, + DataSourceReferenceOverride = "ns=2;s=Pump1.Speed" + }); + + var result = _sut.Flatten( + instance, + [template], + new Dictionary>(), + new Dictionary>(), + SingleConnection(id: 1)); + + Assert.True(result.IsSuccess); + var attr = result.Value.Attributes.Single(a => a.CanonicalName == "Speed"); + Assert.Equal("ns=2;s=Pump1.Speed", attr.DataSourceReference); + } + + [Fact] + public void Null_override_falls_back_to_template_default() + { + var template = CreateTemplateWithDataSourcedAttribute("Speed", dataSourceReference: "TemplateDefault"); + var instance = CreateInstance(); + instance.ConnectionBindings.Add(new InstanceConnectionBinding("Speed") + { + DataConnectionId = 1, + DataSourceReferenceOverride = null + }); + + var result = _sut.Flatten( + instance, + [template], + new Dictionary>(), + new Dictionary>(), + SingleConnection(id: 1)); + + Assert.True(result.IsSuccess); + var attr = result.Value.Attributes.Single(a => a.CanonicalName == "Speed"); + Assert.Equal("TemplateDefault", attr.DataSourceReference); + } +}