diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/ResilienceFormModel.cs b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/ResilienceFormModel.cs index 8dd05184..729b6ab3 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/ResilienceFormModel.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Shared/Drivers/ResilienceFormModel.cs @@ -20,7 +20,7 @@ public sealed class ResilienceFormModel // capability name -> (timeout, retry, breaker), each nullable. public Dictionary Policies { get; set; } = - Capabilities.ToDictionary(c => c, _ => new CapabilityRow()); + Capabilities.ToDictionary(c => c, _ => new CapabilityRow(), StringComparer.OrdinalIgnoreCase); public sealed class CapabilityRow { diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/ResilienceFormModelTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/ResilienceFormModelTests.cs index 12e8a65f..cb95310a 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/ResilienceFormModelTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.AdminUI.Tests/ResilienceFormModelTests.cs @@ -26,6 +26,14 @@ public class ResilienceFormModelTests back.Policies["Write"].IsEmpty.ShouldBeTrue(); } + [Fact] + public void Malformed_json_yields_empty_model() + { + var m = ResilienceFormModel.FromJson("{ not valid json"); + m.BulkheadMaxConcurrent.ShouldBeNull(); + m.Policies["Read"].IsEmpty.ShouldBeTrue(); + } + [Fact] public void Emitted_json_is_consumable_by_the_runtime_parser() {