diff --git a/test/unit/Elsa.Workflows.Core.UnitTests/Models/JsonActivityConstructorContextHelperTests.cs b/test/unit/Elsa.Workflows.Core.UnitTests/Models/JsonActivityConstructorContextHelperTests.cs new file mode 100644 index 000000000..fe9f84b94 --- /dev/null +++ b/test/unit/Elsa.Workflows.Core.UnitTests/Models/JsonActivityConstructorContextHelperTests.cs @@ -0,0 +1,77 @@ + +using System.Text.Json; +using System.Text.Json.Serialization; +using Elsa.Workflows.Models; + +namespace Elsa.Workflows.Core.UnitTests.Models; + +public sealed class JsonActivityConstructorContextHelperTests +{ + private static readonly JsonSerializerOptions _serializerOptions = new(); + + [Theory] + [InlineData("_Metadata")] + [InlineData("Metadata")] + [InlineData("_CustomProperties")] + [InlineData("CustomProperties")] + public void When_InputName_Is_ReservedKeyWord_Then_ThrowsException_WhenReadingInputs(string reservedInputName) + { + // Arrange + var activityDescriptor = new ActivityDescriptor + { + Inputs = + [ + new() + { + Name = reservedInputName, + Type = typeof(object), + IsSynthetic = true + } + ] + }; + var jsonElement = GetJsonElementWithReservedInputName(reservedInputName); + + // Act & Assert + Assert.Throws(() => + { + _ = JsonActivityConstructorContextHelper.CreateActivity( + activityDescriptor, + jsonElement, + _serializerOptions + ); + }); + } + + private static JsonElement GetJsonElementWithReservedInputName(string inputName) + { + const string json = "{\"workflowDefinitionId\":\"Id\",\"id\":\"Id\",\"nodeId\":\"NodeId\",\"name\":\"Workflow-as-activity\",\"type\":\"WorkflowAsActivity\",\"customProperties\":{\"canStartWorkflow\":false,\"runAsynchronously\":false},\"metadata\":{\"designer\":{\"position\":{\"x\":1525.99609375,\"y\":171.5625},\"size\":{\"width\":230.4296875,\"height\":68.4375}},\"displayText\":\"Test\"},\"\":{\"typeName\":\"Object\",\"expression\":{\"type\":\"JavaScript\",\"value\":\"return {\\n \\u0022key\\u0022 : obj.value\\n}\"},\"memoryReference\":{\"id\":\"memref:input--name\"}}}"; + var jsonWithInputName = json.Replace("", inputName); + return JsonElement.Parse(jsonWithInputName); + } + + private class WorkflowAsActivity : IActivity + { + public string Id { get; set; } = "Id"; + public string NodeId { get; set; } = "NodeId"; + public string? Name { get; set; } = "Workflow-as-activity"; + public string Type { get; set; } = "WorkflowAsActivity"; + public int Version { get; set; } = 1; + + [JsonIgnore] + public IDictionary CustomProperties { get; set; } = new Dictionary(); + public IDictionary SyntheticProperties { get; set; } = new Dictionary(); + + [JsonIgnore] + public IDictionary Metadata { get; set; } = new Dictionary(); + + public ValueTask CanExecuteAsync(ActivityExecutionContext context) + { + return new(true); + } + + public ValueTask ExecuteAsync(ActivityExecutionContext context) + { + return new(); + } + } +}