Skip to content

Commit 52504fd

Browse files
committed
fix(Sdk): Moved the methods used to load external definitions out of the WorkflowReader into a new IWorkflowExternalDefinitionResolver service
1 parent 69e40fe commit 52504fd

13 files changed

+459
-248
lines changed

src/ServerlessWorkflow.Sdk.UnitTests/Cases/Services/WorkflowReaderTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public async Task Read_Json_ExternalDefinitions_ShouldWork()
163163
var yaml = File.ReadAllText(Path.Combine("Resources", "Workflows", "externalref.json"));
164164

165165
//act
166-
var workflow = await this.Reader.ParseAsync(yaml);
166+
var workflow = await this.Reader.ParseAsync(yaml, new WorkflowReaderOptions() { LoadExternalDefinitions = true });
167167

168168
//assert
169169
workflow

src/ServerlessWorkflow.Sdk.UnitTests/Cases/Validation/WorkflowValidationTests.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
using FluentValidation;
33
using Microsoft.Extensions.DependencyInjection;
44
using Moq;
5+
using Newtonsoft.Json;
56
using ServerlessWorkflow.Sdk.Models;
7+
using ServerlessWorkflow.Sdk.Services.Validation;
68
using System;
79
using System.Collections.Generic;
10+
using System.IO;
811
using Xunit;
912

1013
namespace ServerlessWorkflow.Sdk.UnitTests.Cases.Validation
@@ -25,6 +28,8 @@ public WorkflowValidationTests()
2528

2629
protected IValidator<WorkflowDefinition> WorkflowDefinitionValidator { get; }
2730

31+
protected IWorkflowValidator WorkflowValidator = Sdk.Services.Validation.WorkflowValidator.Create();
32+
2833
[Fact]
2934
public void Validate_Workflow_NoId_ShouldFail()
3035
{
@@ -275,12 +280,29 @@ public void Validate_Workflow_DuplicateRetryPolicyNames_ShouldFail()
275280

276281
//assert
277282
result.Should()
278-
.NotBeNull();
283+
.NotBeNull();
279284
result.Errors.Should()
280285
.NotBeNullOrEmpty()
281286
.And.Contain(e => e.PropertyName == nameof(WorkflowDefinition.Retries));
282287
}
283288

289+
[Fact]
290+
public async void Validate_Workflow_WithExternalReferences_ShouldWork()
291+
{
292+
//arrange
293+
var json = File.ReadAllText(Path.Combine("resources", "workflows", "external-function-definition.json"));
294+
var workflow = JsonConvert.DeserializeObject<WorkflowDefinition>(json);
295+
296+
//act
297+
var result = await this.WorkflowValidator.ValidateAsync(workflow);
298+
var loadedWorflowJson = JsonConvert.SerializeObject(workflow);
299+
var deserializedWorkflow = JsonConvert.DeserializeObject<WorkflowDefinition>(loadedWorflowJson);
300+
301+
//assert
302+
result.IsValid.Should().BeTrue();
303+
deserializedWorkflow.Functions.Should().BeNullOrEmpty();
304+
}
305+
284306
}
285307

286308
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"id": "undefined",
3+
"name": "Undefined",
4+
"version": "0.1.0",
5+
"specVersion": "0.8",
6+
"functions": "file://resources/functions/petstore.json",
7+
"states": [
8+
{
9+
"name": "Test",
10+
"type": "operation",
11+
"actions": [
12+
{
13+
"name": "test",
14+
"functionRef": {
15+
"refName": "GetPetById"
16+
}
17+
}
18+
],
19+
"end": true
20+
}
21+
]
22+
}

src/ServerlessWorkflow.Sdk.UnitTests/ServerlessWorkflow.Sdk.UnitTests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@
6262
<None Update="Resources\secrets\default.yaml">
6363
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
6464
</None>
65+
<None Update="Resources\workflows\external-function-definition.json">
66+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
67+
</None>
6568
<None Update="Resources\workflows\externalref.json">
6669
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
6770
</None>

src/ServerlessWorkflow.Sdk/Extensions/IServiceCollectionExtensions.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ public static IServiceCollection AddServerlessWorkflow(this IServiceCollection s
4545
{
4646
var newtonsoftJsonDefaultConfig = (JsonSerializerSettings settings) =>
4747
{
48+
settings.ContractResolver = new NonPublicSetterContractResolver();
4849
settings.NullValueHandling = NullValueHandling.Ignore;
49-
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
50+
settings.DefaultValueHandling = DefaultValueHandling.Ignore;
5051
};
5152
var defaultSettings = JsonConvert.DefaultSettings;
5253
JsonConvert.DefaultSettings = () =>
@@ -74,6 +75,7 @@ public static IServiceCollection AddServerlessWorkflow(this IServiceCollection s
7475
inner => new OneOfDeserializer(inner),
7576
syntax => syntax.InsteadOf<Iso8601TimeSpanConverter>()));
7677
services.AddHttpClient();
78+
services.AddSingleton<IWorkflowExternalDefinitionResolver, WorkflowExternalDefinitionResolver>();
7779
services.AddSingleton<IWorkflowReader, WorkflowReader>();
7880
services.AddSingleton<IWorkflowWriter, WorkflowWriter>();
7981
services.AddSingleton<IWorkflowSchemaValidator, WorkflowSchemaValidator>();

src/ServerlessWorkflow.Sdk/Extensions/IWorkflowReaderExtensions.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,27 @@ public static async Task<WorkflowDefinition> ReadAsync(this IWorkflowReader read
3232
/// </summary>
3333
/// <param name="reader">The extended <see cref="IWorkflowReader"/></param>
3434
/// <param name="input">The input to parse</param>
35+
/// <param name="options"><see cref="WorkflowReaderOptions"/> to use</param>
3536
/// <param name="cancellationToken">A <see cref="CancellationToken"/></param>
3637
/// <returns>A new <see cref="WorkflowDefinition"/></returns>
37-
public static async Task<WorkflowDefinition> ParseAsync(this IWorkflowReader reader, string input, CancellationToken cancellationToken = default)
38+
public static async Task<WorkflowDefinition> ParseAsync(this IWorkflowReader reader, string input, WorkflowReaderOptions options, CancellationToken cancellationToken = default)
3839
{
3940
if (string.IsNullOrWhiteSpace(input))
4041
throw new ArgumentNullException(nameof(input));
4142
using Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(input));
42-
return await reader.ReadAsync(stream, cancellationToken);
43+
return await reader.ReadAsync(stream, options, cancellationToken);
44+
}
45+
46+
/// <summary>
47+
/// Parses the specified input into a new <see cref="WorkflowDefinition"/>
48+
/// </summary>
49+
/// <param name="reader">The extended <see cref="IWorkflowReader"/></param>
50+
/// <param name="input">The input to parse</param>
51+
/// <param name="cancellationToken">A <see cref="CancellationToken"/></param>
52+
/// <returns>A new <see cref="WorkflowDefinition"/></returns>
53+
public static async Task<WorkflowDefinition> ParseAsync(this IWorkflowReader reader, string input,CancellationToken cancellationToken = default)
54+
{
55+
return await reader.ParseAsync(input, new(), cancellationToken);
4356
}
4457

4558
}

src/ServerlessWorkflow.Sdk/ServerlessWorkflow.Sdk.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
<TargetFramework>net6.0</TargetFramework>
55
<Nullable>enable</Nullable>
66
<NeutralLanguage>en</NeutralLanguage>
7-
<AssemblyVersion>0.8.1.14</AssemblyVersion>
8-
<FileVersion>0.8.1.14</FileVersion>
9-
<Version>0.8.1.14</Version>
7+
<AssemblyVersion>0.8.1.16</AssemblyVersion>
8+
<FileVersion>0.8.1.16</FileVersion>
9+
<Version>0.8.1.16</Version>
1010
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
1111
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
1212
<PackageLicenseFile>LICENSE</PackageLicenseFile>

0 commit comments

Comments
 (0)