using Shouldly; using Xunit; namespace ZB.MOM.WW.OtOpcUa.Driver.Historian.QuestDb.Tests; public sealed class QuestDbHistorianOptionsTests { private static QuestDbHistorianOptions Valid() => new() { ConnectionString = "Host=h;Port=8812" }; [Fact] public void Defaults_are_the_documented_ones() { var o = new QuestDbHistorianOptions(); o.ConnectionString.ShouldBe(""); o.TablePrefix.ShouldBe("hist_"); o.RetentionDays.ShouldBeNull(); o.CommandTimeout.ShouldBe(TimeSpan.FromSeconds(30)); o.AutoCreateSchema.ShouldBeTrue(); o.VisibilityTimeout.ShouldBe(TimeSpan.FromSeconds(5)); } [Fact] public void A_valid_configuration_has_no_errors() => Valid().Validate().ShouldBeEmpty(); [Fact] public void Missing_connection_string_names_the_key() { var o = Valid(); o.ConnectionString = " "; o.Validate().ShouldHaveSingleItem().ShouldContain("ServerHistorian:QuestDb:ConnectionString"); } [Theory] [InlineData("")] [InlineData("hist-")] [InlineData("hist.")] [InlineData("hist_; DROP")] public void Bad_prefix_names_the_key(string prefix) { var o = Valid(); o.TablePrefix = prefix; o.Validate().ShouldHaveSingleItem().ShouldContain("ServerHistorian:QuestDb:TablePrefix"); } [Theory] [InlineData("t0123456789ab_")] [InlineData("A_9")] public void Good_prefixes_pass(string prefix) { var o = Valid(); o.TablePrefix = prefix; o.Validate().ShouldBeEmpty(); } [Theory] [InlineData(0)] [InlineData(-3)] public void Retention_below_one_names_the_key(int days) { var o = Valid(); o.RetentionDays = days; o.Validate().ShouldHaveSingleItem().ShouldContain("ServerHistorian:QuestDb:RetentionDays"); } [Fact] public void Retention_of_one_is_valid() { var o = Valid(); o.RetentionDays = 1; o.Validate().ShouldBeEmpty(); } [Fact] public void Non_positive_command_timeout_names_the_key() { var o = Valid(); o.CommandTimeout = TimeSpan.Zero; o.Validate().ShouldHaveSingleItem().ShouldContain("ServerHistorian:QuestDb:CommandTimeout"); } [Fact] public void Negative_visibility_timeout_names_the_key_and_zero_is_valid() { var o = Valid(); o.VisibilityTimeout = TimeSpan.FromMilliseconds(-1); o.Validate().ShouldHaveSingleItem().ShouldContain("ServerHistorian:QuestDb:VisibilityTimeout"); o.VisibilityTimeout = TimeSpan.Zero; o.Validate().ShouldBeEmpty(); } }