From 7245424c157bb6570a41f2db8d1301156f992424 Mon Sep 17 00:00:00 2001 From: Lou Baudoin Date: Fri, 22 Sep 2017 11:19:49 +0200 Subject: [PATCH] RDB-93 Regressietest - RDB-125 Extern leadopvolging komt niet in Nico's Mock --- Tapeti.Flow/Default/FlowStarter.cs | 30 ++++++++++++++++++++++++++---- Tapeti.Flow/IFlowProvider.cs | 2 ++ Test/MarcoController.cs | 12 ++++++++---- Test/Program.cs | 3 ++- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/Tapeti.Flow/Default/FlowStarter.cs b/Tapeti.Flow/Default/FlowStarter.cs index a21593f..215decb 100644 --- a/Tapeti.Flow/Default/FlowStarter.cs +++ b/Tapeti.Flow/Default/FlowStarter.cs @@ -20,20 +20,30 @@ namespace Tapeti.Flow.Default public Task Start(Expression>> methodSelector) where TController : class { - return CallControllerMethod(GetExpressionMethod(methodSelector), value => Task.FromResult((IYieldPoint)value)); + return CallControllerMethod(GetExpressionMethod(methodSelector), value => Task.FromResult((IYieldPoint)value), new object[] { }); } public Task Start(Expression>>> methodSelector) where TController : class { - return CallControllerMethod(GetExpressionMethod(methodSelector), value => (Task)value); + return CallControllerMethod(GetExpressionMethod(methodSelector), value => (Task)value, new object[] {}); + } + + public Task Start(Expression>> methodSelector, TParameter parameter) where TController : class + { + return CallControllerMethod(GetExpressionMethod(methodSelector), value => Task.FromResult((IYieldPoint)value), new object[] {parameter}); + } + + public Task Start(Expression>>> methodSelector, TParameter parameter) where TController : class + { + return CallControllerMethod(GetExpressionMethod(methodSelector), value => (Task)value, new object[] {parameter}); } - private async Task CallControllerMethod(MethodInfo method, Func> getYieldPointResult) where TController : class + private async Task CallControllerMethod(MethodInfo method, Func> getYieldPointResult, object[] parameters) where TController : class { var controller = config.DependencyResolver.Resolve(); - var yieldPoint = await getYieldPointResult(method.Invoke(controller, new object[] {})); + var yieldPoint = await getYieldPointResult(method.Invoke(controller, parameters)); var context = new MessageContext { @@ -57,5 +67,17 @@ namespace Tapeti.Flow.Default return method; } + + private static MethodInfo GetExpressionMethod(Expression>> methodSelector) + { + var callExpression = (methodSelector.Body as UnaryExpression)?.Operand as MethodCallExpression; + var targetMethodExpression = callExpression?.Object as ConstantExpression; + + var method = targetMethodExpression?.Value as MethodInfo; + if (method == null) + throw new ArgumentException("Unable to determine the starting method", nameof(methodSelector)); + + return method; + } } } diff --git a/Tapeti.Flow/IFlowProvider.cs b/Tapeti.Flow/IFlowProvider.cs index f4bc7d1..edb3968 100644 --- a/Tapeti.Flow/IFlowProvider.cs +++ b/Tapeti.Flow/IFlowProvider.cs @@ -27,6 +27,8 @@ namespace Tapeti.Flow { Task Start(Expression>> methodSelector) where TController : class; Task Start(Expression>>> methodSelector) where TController : class; + Task Start(Expression>> methodSelector, TParameter parameter) where TController : class; + Task Start(Expression>>> methodSelector, TParameter parameter) where TController : class; } /// diff --git a/Test/MarcoController.cs b/Test/MarcoController.cs index 1bf8ae3..a3a65f4 100644 --- a/Test/MarcoController.cs +++ b/Test/MarcoController.cs @@ -29,14 +29,18 @@ namespace Test [Start] - public async Task StartFlow() + public async Task StartFlow(bool go) { Console.WriteLine("Starting stand-alone flow"); await Task.Delay(1000); - return flowProvider.YieldWithRequestSync - (new PoloConfirmationRequestMessage(), - HandlePoloConfirmationResponse); + if (go) + return flowProvider.YieldWithRequestSync + (new PoloConfirmationRequestMessage(), + HandlePoloConfirmationResponse); + + Console.WriteLine("Ending stand-alone flow prematurely"); + return flowProvider.End(); } diff --git a/Test/Program.cs b/Test/Program.cs index 0e97ee9..dc9fef8 100644 --- a/Test/Program.cs +++ b/Test/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using SimpleInjector; using Tapeti; using Tapeti.DataAnnotations; @@ -55,7 +56,7 @@ namespace Test connection.GetPublisher().Publish(new FlowEndController.PingMessage()); - container.GetInstance().Start(c => c.StartFlow); + container.GetInstance().Start(c => c.StartFlow, true); var emitter = container.GetInstance(); emitter.Run().Wait();