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(() => NodeProtocolCodec.Decode("{"u8.ToArray())); } }