using YZWater.Core.Models; using System.Text.Json; namespace YZWater.Core.Tests.Models; public class HubMessageTests { [Fact] public void ToJson_ProducesValidJson_WithTypeAndPayload() { var msg = HubMessage.AuthResult(true); var json = msg.ToJson(); var doc = JsonDocument.Parse(json); Assert.Equal("auth_result", doc.RootElement.GetProperty("type").GetString()); Assert.True(doc.RootElement.GetProperty("payload").GetBoolean()); } [Fact] public void FromJson_RoundTrips_Correctly() { var original = HubMessage.CommandResult(success: true, message: "泵已启动"); var json = original.ToJson(); var restored = HubMessage.FromJson(json); Assert.NotNull(restored); Assert.Equal("command_result", restored!.Type); var payload = restored.GetPayload(); Assert.NotNull(payload); Assert.True(payload!.Success); Assert.Equal("泵已启动", payload.Message); } [Fact] public void FromJson_InvalidJson_ThrowsException() { Assert.ThrowsAny(() => HubMessage.FromJson("not-json")); } [Fact] public void GetPayload_NullPayload_ReturnsDefault() { var msg = new HubMessage { Type = "empty" }; var result = msg.GetPayload(); Assert.Null(result); } [Fact] public void LockResult_Success_SetsPayloadCorrectly() { var msg = HubMessage.LockResult(success: true, currentOperator: "admin"); Assert.Equal("lock_result", msg.Type); var payload = msg.GetPayload(); Assert.NotNull(payload); Assert.True(payload!.Success); Assert.Equal("admin", payload.CurrentOperator); } [Fact] public void LockStatus_ReflectsParameters() { var msg = HubMessage.LockStatus(currentOperator: "engineer1", isLocked: true); var payload = msg.GetPayload(); Assert.NotNull(payload); Assert.True(payload!.IsLocked); Assert.Equal("engineer1", payload.CurrentOperator); } [Fact] public void ClientCount_SerializesIntegerPayload() { var msg = HubMessage.ClientCount(5); var json = msg.ToJson(); var doc = JsonDocument.Parse(json); Assert.Equal(5, doc.RootElement.GetProperty("payload").GetInt32()); } }