elsa-core/test/integration/Elsa.IntegrationTests/Serialization/JsonSerialization/Tests.cs
Sipke Schoorstra fb2f0f0271
Update InputJsonConverter to deserialize complex value types into their original type (#4878)
* Remove unused using directives in test classes

The using directives for System, System.Collections.Generic, System.IO, and others were not necessary in many of the test classes. These unused directives have been removed to enhance code readability and maintainability.

* Update source port retrieval in ConnectionJsonConverter

The source port retrieval code in ConnectionJsonConverter.cs has been updated. It now uses TryGetProperty instead of GetProperty, enabling it to handle cases where the "port" property may not exist. This enhances error handling and resilience in the activities module.

* Refactor InputJsonConverter for proper variable expressions handling

The InputJsonConverter in the Elsa.Workflows.Serialization has been expanded for efficient handling of variable expressions during the JSON conversion process. The refactor ensures appropriate extraction and assignment of values to variables. This adds robustness to the serialization process, maintaining variable types after serialization.

* Add tests for variable expressions serialization

A new `Tests.cs` file has been added under the `Elsa.IntegrationTests/Serialization/VariableExpressions` directory. This file contains tests for ensuring the serialization of variable expressions works correctly. A corresponding `SampleWorkflow` file has also been established, providing the workflows to be used in the tests.

* Refactor workflow builder extension class

The WorkflowDefinitionBuilderExtensions class has been deleted and replaced with WorkflowBuilderExtensions in Elsa.Workflows.Core. This new class retains similar functionality but includes more detailed comments and dynamic member access capabilities in its method definition.
2024-02-05 21:39:49 +01:00

123 lines
4.7 KiB
C#

using System.Text.Json;
using System.Text.Json.Nodes;
using Elsa.Testing.Shared;
using Elsa.Workflows.Contracts;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json.Linq;
using Xunit;
using Xunit.Abstractions;
namespace Elsa.IntegrationTests.Serialization.JsonSerialization;
public class SerializationTests(ITestOutputHelper testOutputHelper)
{
private readonly IServiceProvider _services = new TestApplicationBuilder(testOutputHelper).Build();
[Theory(DisplayName = "write")]
[InlineData(typeof(JsonObject), "JsonObjectIsland")]
[InlineData(typeof(JObject), "JObjectIsland")]
[InlineData(typeof(JsonArray), "JsonArrayIsland")]
[InlineData(typeof(JArray), "JArrayIsland")]
public void Test_Serialization_create_Island(Type type, string fileName)
{
var dict = GetContent(type);
var result = SerializeUsingPayloadSerializer(dict);
var expected = File.ReadAllText($"Serialization/JsonSerialization/{fileName}.json");
CompareJsonsObjects(expected, result);
}
[Theory(DisplayName = "roundtrip")]
[InlineData(typeof(JsonObject))]
[InlineData(typeof(JObject))]
[InlineData(typeof(JsonArray))]
[InlineData(typeof(JArray))]
public void Test_Serialization_roundtrip(Type type)
{
var dict = GetContent(type);
var jsonSerialized = SerializeUsingPayloadSerializer(dict);
var transformationModel = DeSerializeDictionaryUsingPayloadSerializer(jsonSerialized);
var result = transformationModel["Content"].ToString()!;
var expected = GetExpected(type);
CompareJsonsObjects(expected, result);
}
[Theory(DisplayName = "read")]
[InlineData(typeof(JsonObject), "JsonObjectIsland", "JsonObjectWithoutType")]
[InlineData(typeof(JObject), "JObjectIsland", "JObjectWithoutType")]
[InlineData(typeof(JsonArray), "JsonArrayIsland", "JsonArrayWithoutType")]
[InlineData(typeof(JArray), "JArrayIsland", "JArrayWithoutType")]
public void Test_Serialization_read(Type type, string fileName, string compareFileName)
{
var jsonContent = File.ReadAllText(@$"Serialization/JsonSerialization/{fileName}.json");
var transformationModel = DeSerializeDictionaryUsingPayloadSerializer(jsonContent);
string result;
if (type == typeof(JObject) || type == typeof(JArray))
{
result = Newtonsoft.Json.JsonConvert.SerializeObject(transformationModel);
}
else
{
result = type == typeof(JsonObject) ? JsonObject.Create(JsonSerializer.SerializeToElement(transformationModel))!.ToString() : JsonArray.Create(JsonSerializer.SerializeToElement(transformationModel["Content"]))!.ToString();
}
var expected = File.ReadAllText(@$"Serialization/JsonSerialization/{compareFileName}.json");
CompareJsonsObjects(expected, result);
}
private string SerializeUsingPayloadSerializer(object obj)
{
var payloadSerializer = _services.GetRequiredService<IPayloadSerializer>();
return payloadSerializer.Serialize(obj);
}
private IDictionary<string, object> DeSerializeDictionaryUsingPayloadSerializer(string jsonString)
{
var payloadSerializer = _services.GetRequiredService<IPayloadSerializer>();
return payloadSerializer.Deserialize<IDictionary<string, object>>(jsonString);
}
private void CompareJsonsObjects(string expected, string actual)
{
var jsonActual = NormalizeNewlines(JsonNode.Parse(actual!)?.ToString());
var jsonExpected = NormalizeNewlines(JsonNode.Parse(expected!)?.ToString());
Assert.Equal(jsonExpected, jsonActual);
}
private IDictionary<string, object> GetContent(Type type)
{
var isArray = type == typeof(JsonArray) || type == typeof(JArray);
var jsonContent = isArray ? "[{\"path\":\"folder1\",\"command\":\"add\"}]": "{\"file1\":{\"script\":[{\"path\":\"folder1\",\"command\":\"add\"}]} }";
var dict = new Dictionary<string, object>
{
{ "StatusCode", "Created" },
{ "Content",isArray ?
(type == typeof(JArray)? JArray.Parse(jsonContent):JsonArray.Parse(jsonContent)):
(type == typeof(JObject)? JObject.Parse(jsonContent):JsonObject.Parse(jsonContent))
}
};
return dict;
}
private string GetExpected(Type type)
{
if (type == typeof(JsonArray) || type == typeof(JArray)) {
return "[{\"path\":\"folder1\",\"command\":\"add\"}]";
}
else
{
return "{\"file1\":{\"script\":[{\"path\":\"folder1\",\"command\":\"add\"}]} }";
}
}
private static string? NormalizeNewlines(string? input) => input?.Replace("\r\n", "\n").Replace("\\r\\n", "\\n");
}