45 lines
1.6 KiB
C#
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()));
|
|
}
|
|
}
|