AyCode.Core/AyCode.Services.Tests/SignalRs/PostJsonDataMessageTests.cs

123 lines
4.8 KiB
C#

using AyCode.Core.Extensions;
using AyCode.Services.SignalRs;
namespace AyCode.Services.Tests.SignalRs;
[TestClass]
public class PostJsonDataMessageTests
{
[TestMethod]
public void SignalParams_SetGet_RoundTrip_ForInt()
{
var signalParams = new SignalParams { Status = SignalResponseStatus.Success };
signalParams.SetParameterValues([42]);
var paramInfos = typeof(PostJsonDataMessageTests)
.GetMethod(nameof(DummyIntMethod))!.GetParameters();
var deserialized = signalParams.GetParameterValues(paramInfos);
Assert.IsNotNull(deserialized);
Assert.AreEqual(1, deserialized!.Length);
Assert.AreEqual(42, deserialized[0]);
}
[TestMethod]
[DataRow(42)]
[DataRow("45")]
[DataRow(true)]
public void SignalParams_FullRoundTrip_AnyParameter(object testValue)
{
// Client packs via SetParameterValues
var signalParams = new SignalParams { Status = SignalResponseStatus.Success };
signalParams.SetParameterValues([testValue]);
// Wire round-trip: SignalParams → byte[] → SignalParams
var wireBytes = signalParams.ToBinary();
var restored = wireBytes.BinaryTo<SignalParams>()!;
// Server unpacks via GetParameterValues
var paramInfos = new[] { GetParamInfoForType(testValue.GetType()) };
var serverParams = restored.GetParameterValues(paramInfos);
Assert.IsNotNull(serverParams);
Assert.AreEqual(testValue, serverParams![0]);
// Response round-trip (SignalResponseDataMessage is in-memory DTO, not serialized as envelope on wire)
var serviceResult = $"{serverParams[0]}";
var responseData = SignalRSerializationHelper.CreateResponseData(serviceResult, AyCode.Core.Serializers.Binaries.AcBinarySerializerOptions.Default);
var clientResponse = new SignalResponseDataMessage
{
MessageTag = 100,
Status = SignalResponseStatus.Success,
DataSerializerType = AyCode.Core.Serializers.AcSerializerType.Binary,
ResponseData = responseData != null ? new SignalData(responseData) : null
};
var finalResult = clientResponse.GetResponseData<string>();
Assert.AreEqual(testValue.ToString(), finalResult);
}
[TestMethod]
public void SignalParams_MultipleParams_RoundTrip()
{
var guid = Guid.NewGuid();
var signalParams = new SignalParams { Status = SignalResponseStatus.Success };
signalParams.SetParameterValues([42, "hello", true, guid]);
// Wire round-trip
var wireBytes = signalParams.ToBinary();
var restored = wireBytes.BinaryTo<SignalParams>()!;
var paramInfos = typeof(PostJsonDataMessageTests)
.GetMethod(nameof(DummyMultiMethod))!.GetParameters();
var deserialized = restored.GetParameterValues(paramInfos);
Assert.IsNotNull(deserialized);
Assert.AreEqual(4, deserialized!.Length);
Assert.AreEqual(42, deserialized[0]);
Assert.AreEqual("hello", deserialized[1]);
Assert.AreEqual(true, deserialized[2]);
Assert.AreEqual(guid, deserialized[3]);
}
[TestMethod]
public void SignalParams_WireFormat_ParametersIsByteArray()
{
var signalParams = new SignalParams { Status = SignalResponseStatus.Success };
signalParams.SetParameterValues([42, "hello"]);
// Parameters property is byte[] (not byte[][])
Assert.IsNotNull(signalParams.Parameters);
Assert.IsInstanceOfType<byte[]>(signalParams.Parameters);
}
[TestMethod]
public void SignalParams_NullParameters_ReturnsNull()
{
var signalParams = new SignalParams { Status = SignalResponseStatus.Success };
var paramInfos = typeof(PostJsonDataMessageTests)
.GetMethod(nameof(DummyIntMethod))!.GetParameters();
var result = signalParams.GetParameterValues(paramInfos);
Assert.IsNull(result);
}
// Dummy methods for ParameterInfo extraction
public static void DummyIntMethod(int value) { }
public static void DummyMultiMethod(int a, string b, bool c, Guid d) { }
public static void DummyIntStringMethod(int a, string b) { }
private static System.Reflection.ParameterInfo GetParamInfoForType(Type type)
{
if (type == typeof(int)) return typeof(PostJsonDataMessageTests).GetMethod(nameof(DummyInt))!.GetParameters()[0];
if (type == typeof(string)) return typeof(PostJsonDataMessageTests).GetMethod(nameof(DummyString))!.GetParameters()[0];
if (type == typeof(bool)) return typeof(PostJsonDataMessageTests).GetMethod(nameof(DummyBool))!.GetParameters()[0];
throw new NotSupportedException($"No dummy method for type {type.Name}");
}
public static void DummyInt(int v) { }
public static void DummyString(string v) { }
public static void DummyBool(bool v) { }
}