17962d4233
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
47 lines
1.4 KiB
C#
47 lines
1.4 KiB
C#
using Shouldly;
|
|
using Xunit;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.Driver.Historian.SqlServer.Tests;
|
|
|
|
public sealed class SqlServerHistorianOptionsTests
|
|
{
|
|
private static SqlServerHistorianOptions Valid() => new() { ConnectionString = "Server=x" };
|
|
|
|
[Fact]
|
|
public void Defaults_with_a_connection_string_are_valid() => Valid().Validate().ShouldBeEmpty();
|
|
|
|
[Fact]
|
|
public void Missing_connection_string_is_rejected() =>
|
|
new SqlServerHistorianOptions().Validate().ShouldContain(e => e.Contains("ConnectionString"));
|
|
|
|
[Theory]
|
|
[InlineData("hist]; DROP TABLE x;--")]
|
|
[InlineData("1abc")]
|
|
[InlineData("a b")]
|
|
[InlineData("")]
|
|
[InlineData("a.b")]
|
|
public void Invalid_schema_names_are_rejected_before_any_sql_runs(string schema)
|
|
{
|
|
var o = Valid();
|
|
o.Schema = schema;
|
|
o.Validate().ShouldContain(e => e.Contains("Schema"));
|
|
Should.Throw<ArgumentException>(() => new SqlHistorianConnection(o));
|
|
}
|
|
|
|
[Fact]
|
|
public void Non_positive_timeout_is_rejected()
|
|
{
|
|
var o = Valid();
|
|
o.CommandTimeout = TimeSpan.Zero;
|
|
o.Validate().ShouldContain(e => e.Contains("CommandTimeout"));
|
|
}
|
|
|
|
[Fact]
|
|
public void Q_schema_qualifies_and_brackets()
|
|
{
|
|
var o = Valid();
|
|
o.Schema = "my_s";
|
|
new SqlHistorianConnection(o).Q("Tag").ShouldBe("[my_s].[Tag]");
|
|
}
|
|
}
|