zcbot/windows-node/Zcbot.WindowsNode.Tests/NodeProtocolCodecTests.cs

45 lines
1.6 KiB
C#

using System.Text.Json;
namespace Zcbot.WindowsNode.Tests;
public sealed class NodeProtocolCodecTests
{
[Fact]
public void EncodeKeepsThePublishedEnvelopeShape()
{
var encoded = NodeProtocolCodec.Encode("heartbeat", new { available_slots = 1 });
using var document = JsonDocument.Parse(encoded);
var root = document.RootElement;
Assert.Equal(1, root.GetProperty("protocol_version").GetInt32());
Assert.True(Guid.TryParse(root.GetProperty("message_id").GetString(), out _));
Assert.Equal("heartbeat", root.GetProperty("type").GetString());
Assert.True(DateTimeOffset.TryParse(root.GetProperty("sent_at").GetString(), out _));
Assert.Equal(1, root.GetProperty("payload").GetProperty("available_slots").GetInt32());
}
[Fact]
public void DecodePreservesUnknownMessagesForTheBusinessDispatcher()
{
var message = NodeProtocolCodec.Decode(
"""{"type":"future_message","payload":{"value":42}}"""u8.ToArray());
Assert.NotNull(message);
Assert.Equal("future_message", message.Type);
Assert.Equal(42, message.Payload.GetProperty("value").GetInt32());
}
[Fact]
public void DecodeIgnoresAnEnvelopeWithoutAStringType()
{
Assert.Null(NodeProtocolCodec.Decode("""{"payload":{}}"""u8.ToArray()));
Assert.Null(NodeProtocolCodec.Decode("""{"type":2,"payload":{}}"""u8.ToArray()));
}
[Fact]
public void DecodeRejectsInvalidJson()
{
Assert.ThrowsAny<JsonException>(() => NodeProtocolCodec.Decode("{"u8.ToArray()));
}
}