using System.Text.Json; using System.Text.Json.Serialization; using Shouldly; using Xunit; using ZB.MOM.WW.OtOpcUa.Driver.Historian.Wonderware.Client; namespace ZB.MOM.WW.OtOpcUa.AdminUI.Tests; public sealed class HistorianWonderwareDriverPageFormSerializationTests { private static readonly JsonSerializerOptions _opts = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = false, }; [Fact] public void RoundTrip_PreservesKnownFields() { var original = new WonderwareHistorianClientOptions( PipeName: "otopcua-historian-prod", SharedSecret: "t0ps3cr3t", PeerName: "OtOpcUa-Primary", ConnectTimeout: TimeSpan.FromSeconds(20), CallTimeout: TimeSpan.FromSeconds(60)) { ProbeTimeoutSeconds = 25, }; var json = JsonSerializer.Serialize(original, _opts); var back = JsonSerializer.Deserialize(json, _opts); back.ShouldNotBeNull(); back.PipeName.ShouldBe("otopcua-historian-prod"); back.SharedSecret.ShouldBe("t0ps3cr3t"); back.PeerName.ShouldBe("OtOpcUa-Primary"); back.ConnectTimeout.ShouldBe(TimeSpan.FromSeconds(20)); back.CallTimeout.ShouldBe(TimeSpan.FromSeconds(60)); back.EffectiveConnectTimeout.ShouldBe(TimeSpan.FromSeconds(20)); back.EffectiveCallTimeout.ShouldBe(TimeSpan.FromSeconds(60)); back.ProbeTimeoutSeconds.ShouldBe(25); } [Fact] public void RoundTrip_NullTimeouts_UsesDefaults() { var original = new WonderwareHistorianClientOptions( PipeName: "otopcua-historian", SharedSecret: "secret"); var json = JsonSerializer.Serialize(original, _opts); var back = JsonSerializer.Deserialize(json, _opts); back.ShouldNotBeNull(); back.ConnectTimeout.ShouldBeNull(); back.CallTimeout.ShouldBeNull(); back.EffectiveConnectTimeout.ShouldBe(TimeSpan.FromSeconds(10)); back.EffectiveCallTimeout.ShouldBe(TimeSpan.FromSeconds(30)); } [Fact] public void Deserialize_DropsUnknownFields() { var jsonWithExtra = """ { "unknownField": "old-value", "pipeName": "otopcua-historian", "sharedSecret": "s3cr3t", "probeTimeoutSeconds": 20 } """; var optsWithSkip = new JsonSerializerOptions(_opts) { UnmappedMemberHandling = JsonUnmappedMemberHandling.Skip, }; var back = JsonSerializer.Deserialize(jsonWithExtra, optsWithSkip); back.ShouldNotBeNull(); back.ProbeTimeoutSeconds.ShouldBe(20); back.PipeName.ShouldBe("otopcua-historian"); } }