diff --git a/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java b/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java index 078d8c66..eff5891b 100644 --- a/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java +++ b/experimental/lambda/src/test/java/io/serverless/workflow/impl/CallTest.java @@ -116,7 +116,7 @@ void testSwitch() throws InterruptedException, ExecutionException { Workflow workflow = new Workflow() .withDocument( - new Document().withNamespace("test").withName("testSwith").withVersion("1.0")) + new Document().withNamespace("test").withName("testSwitch").withVersion("1.0")) .withDo( List.of( new TaskItem( diff --git a/experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java b/experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java index 503dc253..0686ca82 100644 --- a/experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java +++ b/experimental/lambda/src/test/java/io/serverless/workflow/impl/FluentDSLCallTest.java @@ -15,6 +15,7 @@ */ package io.serverless.workflow.impl; +import static io.serverlessworkflow.fluent.func.dsl.FuncDSL.function; import static org.assertj.core.api.Assertions.assertThat; import io.serverlessworkflow.api.types.FlowDirectiveEnum; @@ -22,6 +23,7 @@ import io.serverlessworkflow.fluent.func.FuncWorkflowBuilder; import io.serverlessworkflow.impl.WorkflowApplication; import io.serverlessworkflow.impl.WorkflowDefinition; +import io.serverlessworkflow.impl.WorkflowInstance; import java.util.Collection; import java.util.List; import java.util.concurrent.ExecutionException; @@ -47,6 +49,23 @@ void testJavaFunction() throws InterruptedException, ExecutionException { } } + @Test + void textExportFunction() { + try (WorkflowApplication app = WorkflowApplication.builder().build()) { + final Workflow workflow = + FuncWorkflowBuilder.workflow("testExportFunction") + .tasks( + function(JavaFunctions::getName, Person.class) + .exportAs( + (prevContext, w, t) -> t.output().asText().orElseThrow() + " Tirado")) + .build(); + WorkflowInstance instance = + app.workflowDefinition(workflow).instance(new Person("Francisco", 33)); + assertThat(instance.start().join().asText().orElseThrow()).isEqualTo("Francisco Javierito"); + assertThat(instance.context().asText().orElseThrow()).isEqualTo("Francisco Javierito Tirado"); + } + } + @Test void testForLoop() throws InterruptedException, ExecutionException { try (WorkflowApplication app = WorkflowApplication.builder().build()) { diff --git a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowContext.java b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowContext.java index 6243ab17..57e84fe9 100644 --- a/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowContext.java +++ b/impl/core/src/main/java/io/serverlessworkflow/impl/WorkflowContext.java @@ -23,6 +23,7 @@ public class WorkflowContext implements WorkflowContextData { WorkflowContext(WorkflowDefinition definition, WorkflowMutableInstance instance) { this.definition = definition; this.instance = instance; + this.context = definition.application().modelFactory().fromNull(); } @Override diff --git a/impl/test/src/test/java/io/serverlessworkflow/impl/test/WorkflowDefinitionTest.java b/impl/test/src/test/java/io/serverlessworkflow/impl/test/WorkflowDefinitionTest.java index 856d8dc0..b1e86fef 100644 --- a/impl/test/src/test/java/io/serverlessworkflow/impl/test/WorkflowDefinitionTest.java +++ b/impl/test/src/test/java/io/serverlessworkflow/impl/test/WorkflowDefinitionTest.java @@ -25,12 +25,14 @@ import io.serverlessworkflow.impl.WorkflowApplication; import io.serverlessworkflow.impl.WorkflowDefinition; import io.serverlessworkflow.impl.WorkflowException; +import io.serverlessworkflow.impl.WorkflowInstance; import io.serverlessworkflow.impl.WorkflowModel; import io.serverlessworkflow.impl.jackson.JsonUtils; import java.io.IOException; import java.time.Instant; import java.util.Arrays; import java.util.Map; +import java.util.Optional; import java.util.concurrent.CompletionException; import java.util.function.Consumer; import java.util.stream.Stream; @@ -76,7 +78,8 @@ private static Stream provideParameters() { args( "workflows-samples/for-sum.yaml", Map.of("input", Arrays.asList(1, 2, 3)), - o -> assertThat(o).isEqualTo(6)), + o -> assertThat(o).isEqualTo(6), + c -> assertThat(c).isEqualTo(Map.of("incr", Arrays.asList(2, 3, 4)))), args( "workflows-samples/switch-then-loop.yaml", Map.of("count", 1), @@ -116,16 +119,36 @@ private static Stream provideParameters() { } private static Arguments args( - String fileName, Map input, Consumer instance) { + String fileName, + Map input, + Consumer modelAssert, + Optional> context) { return Arguments.of( fileName, (Consumer) - d -> - instance.accept( - d.instance(input) - .start() - .thenApply(model -> JsonUtils.toJavaValue(JsonUtils.modelToJson(model))) - .join())); + d -> { + WorkflowInstance instance = d.instance(input); + modelAssert.accept( + instance + .start() + .thenApply(model -> JsonUtils.toJavaValue(JsonUtils.modelToJson(model))) + .join()); + context.ifPresent( + c -> c.accept(JsonUtils.toJavaValue(JsonUtils.fromValue(instance.context())))); + }); + } + + private static Arguments args( + String fileName, + Map input, + Consumer instance, + Consumer context) { + return args(fileName, input, instance, Optional.of(context)); + } + + private static Arguments args( + String fileName, Map input, Consumer instance) { + return args(fileName, input, instance, Optional.empty()); } private static Arguments argsJson( diff --git a/impl/test/src/test/resources/workflows-samples/for-sum.yaml b/impl/test/src/test/resources/workflows-samples/for-sum.yaml index 6d89d9ff..f177ac41 100644 --- a/impl/test/src/test/resources/workflows-samples/for-sum.yaml +++ b/impl/test/src/test/resources/workflows-samples/for-sum.yaml @@ -12,5 +12,8 @@ do: - accumulate: set: counter: ${.counter+$number} + export: + as: if .incr==null then {incr:[$number+1]} else .incr+=[$number+1] end output: as: .counter +