feat: add suitelink client runtime and test harness
This commit is contained in:
109
tests/SuiteLink.Client.IntegrationTests/TagRoundTripTests.cs
Normal file
109
tests/SuiteLink.Client.IntegrationTests/TagRoundTripTests.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
namespace SuiteLink.Client.IntegrationTests;
|
||||
|
||||
public sealed class TagRoundTripTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task BooleanTag_RoundTrip_WhenConfigured()
|
||||
{
|
||||
if (!TryGetTagSettings(out var settings, out var tagName, "bool"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await RunRoundTripAsync(
|
||||
settings,
|
||||
tagName,
|
||||
SuiteLinkValue.FromBoolean(true),
|
||||
value => value.TryGetBoolean(out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task IntegerTag_RoundTrip_WhenConfigured()
|
||||
{
|
||||
if (!TryGetTagSettings(out var settings, out var tagName, "int"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await RunRoundTripAsync(
|
||||
settings,
|
||||
tagName,
|
||||
SuiteLinkValue.FromInt32(42),
|
||||
value => value.TryGetInt32(out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task FloatTag_RoundTrip_WhenConfigured()
|
||||
{
|
||||
if (!TryGetTagSettings(out var settings, out var tagName, "float"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await RunRoundTripAsync(
|
||||
settings,
|
||||
tagName,
|
||||
SuiteLinkValue.FromFloat32(12.25f),
|
||||
value => value.TryGetFloat32(out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task StringTag_RoundTrip_WhenConfigured()
|
||||
{
|
||||
if (!TryGetTagSettings(out var settings, out var tagName, "string"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
await RunRoundTripAsync(
|
||||
settings,
|
||||
tagName,
|
||||
SuiteLinkValue.FromString("integration-test"),
|
||||
value => value.TryGetString(out _));
|
||||
}
|
||||
|
||||
private static bool TryGetTagSettings(
|
||||
out IntegrationSettings settings,
|
||||
out string tagName,
|
||||
string type)
|
||||
{
|
||||
settings = null!;
|
||||
tagName = string.Empty;
|
||||
|
||||
if (!IntegrationSettings.TryLoad(out settings, out _))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
tagName = type switch
|
||||
{
|
||||
"bool" => settings.BooleanTag ?? string.Empty,
|
||||
"int" => settings.IntegerTag ?? string.Empty,
|
||||
"float" => settings.FloatTag ?? string.Empty,
|
||||
"string" => settings.StringTag ?? string.Empty,
|
||||
_ => string.Empty
|
||||
};
|
||||
|
||||
return !string.IsNullOrWhiteSpace(tagName);
|
||||
}
|
||||
|
||||
private static async Task RunRoundTripAsync(
|
||||
IntegrationSettings settings,
|
||||
string tagName,
|
||||
SuiteLinkValue writeValue,
|
||||
Func<SuiteLinkValue, bool> typeCheck)
|
||||
{
|
||||
await using var client = new SuiteLinkClient();
|
||||
|
||||
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(20));
|
||||
await client.ConnectAsync(settings.Connection, cts.Token);
|
||||
|
||||
var readBefore = await client.ReadAsync(tagName, TimeSpan.FromSeconds(10), cts.Token);
|
||||
Assert.True(typeCheck(readBefore.Value));
|
||||
|
||||
await client.WriteAsync(tagName, writeValue, cts.Token);
|
||||
|
||||
var readAfter = await client.ReadAsync(tagName, TimeSpan.FromSeconds(10), cts.Token);
|
||||
Assert.True(typeCheck(readAfter.Value));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user