using AyCode.Core.Extensions; using AyCode.Core.Serializers.Jsons; using AyCode.Services.SignalRs; namespace AyCode.Services.Tests.SignalRs; [TestClass] public class PostJsonDataMessageTests { [TestMethod] public void Debug_CreatePostMessage_ForInt() { var message = CreatePostMessageTest(42); Console.WriteLine($"Message type: {message.GetType().Name}"); if (message is SignalPostJsonDataMessage idMsg) { Console.WriteLine($"PostDataJson: {idMsg.PostDataJson}"); Console.WriteLine($"PostData.Ids.Count: {idMsg.PostData.Ids.Count}"); Console.WriteLine($"PostData.Ids[0]: {idMsg.PostData.Ids[0]}"); } var bytes = message.ToBinary(); Console.WriteLine($"Binary bytes: {bytes.Length}"); var deserialized = bytes.BinaryTo>(); Console.WriteLine($"Deserialized PostDataJson: {deserialized?.PostDataJson}"); Console.WriteLine($"Deserialized PostData type: {deserialized?.PostData?.GetType().Name}"); Console.WriteLine($"Deserialized PostData.Ids.Count: {deserialized?.PostData?.Ids.Count}"); Assert.IsNotNull(deserialized?.PostData); Assert.AreEqual(1, deserialized.PostData.Ids.Count); } [TestMethod] [DataRow(42)] [DataRow("45")] [DataRow(true)] public void IdMessage_FullRoundTrip_AnyParameter(object testValue) { dynamic GetValueByType(object value) { if (value is int valueInt) return valueInt; if (value is bool valueBool) return valueBool; if (value is string valueString) return valueString; Assert.Fail($"Type of testValue not implemented"); return null; } Console.WriteLine("=== Step 1: Client creates message ==="); var idMessage = new IdMessage(GetValueByType(testValue)); Console.WriteLine($"IdMessage.Ids[0]: '{idMessage.Ids[0]}'"); var clientMessage = new SignalPostJsonDataMessage(idMessage); Console.WriteLine($"Client PostDataJson: '{clientMessage.PostDataJson}'"); Console.WriteLine("\n=== Step 2: Binary serialization ==="); var bytes = clientMessage.ToBinary(); Console.WriteLine($"Binary bytes: {bytes.Length}"); Console.WriteLine("\n=== Step 3: Server deserializes ==="); var serverMessage = bytes.BinaryTo>(); Console.WriteLine($"Server PostDataJson: '{serverMessage?.PostDataJson}'"); Console.WriteLine($"Server PostData.Ids.Count: {serverMessage?.PostData?.Ids.Count}"); Console.WriteLine($"Server PostData.Ids[0]: '{serverMessage?.PostData?.Ids[0]}'"); Console.WriteLine("\n=== Step 4: Server deserializes parameter ==="); var paramJson = serverMessage!.PostData.Ids[0]; Console.WriteLine($"Parameter JSON: '{paramJson}'"); var paramValue = AcJsonDeserializer.Deserialize(paramJson, testValue.GetType()); Console.WriteLine($"Deserialized value: {paramValue}"); Console.WriteLine("\n=== Step 5: Service method returns ==="); var serviceResult = $"{paramValue}"; Console.WriteLine($"Service result: '{serviceResult}'"); Console.WriteLine("\n=== Step 6: Server creates response ==="); var response = new SignalResponseDataMessage(100, SignalResponseStatus.Success, serviceResult, AcJsonSerializerOptions.Default); Console.WriteLine($"Response created with Binary bytes: {response.ResponseData?.Length ?? 0}"); Console.WriteLine("\n=== Step 7: Response Binary ==="); var responseBytes = response.ToBinary(); Console.WriteLine($"Response Binary bytes: {responseBytes.Length}"); Console.WriteLine("\n=== Step 8: Client deserializes response ==="); var clientResponse = responseBytes.BinaryTo(); Console.WriteLine($"Client Response Status: {clientResponse?.Status}"); Console.WriteLine("\n=== Step 9: Client deserializes to string ==="); var finalResult = clientResponse?.GetResponseData(); Console.WriteLine($"Final result: '{finalResult}'"); Assert.AreEqual(GetValueByType(testValue).ToString(), finalResult); } private static ISignalRMessage CreatePostMessageTest(TPostData postData) { var type = typeof(TPostData); if (type == typeof(string) || type.IsEnum || type.IsValueType || type == typeof(DateTime)) return new SignalPostJsonDataMessage(new IdMessage(postData!)); return new SignalPostJsonDataMessage(postData); } }