Skip to content

Commit

Permalink
fix: Fixed Action Executor bases
Browse files Browse the repository at this point in the history
Base should not parse values, I have instead introduced a new base class to handle parsing of inputs.
  • Loading branch information
thygesteffensen committed Mar 3, 2021
1 parent d505842 commit bfe0141
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,13 @@ public abstract class ActionExecutorBase

public string ActionName { get; private set; }

public ValueContainer Inputs { get; private set; }
public ValueContainer Inputs { get; protected set; }

public void InitializeActionExecutor(string actionName, JToken json)
{
ActionName = actionName;
Json = json;

var inputs = Json.SelectToken("$.inputs");
if (inputs != null)
{
Inputs = new ValueContainer(inputs);
}

ProcessJson();
}
protected abstract void ProcessJson();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@

namespace Parser.FlowParser.ActionExecutors.Implementations.ControlActions
{
public class TerminateActionExecutor : DefaultBaseActionExecutor
public class TerminateActionExecutor : InputsBaseActionExecutor
{
private readonly ILogger<TerminateActionExecutor> _logger;

public TerminateActionExecutor(ILogger<TerminateActionExecutor> logger)
public TerminateActionExecutor(ILogger<TerminateActionExecutor> logger, IExpressionEngine expressionEngine) :
base(expressionEngine)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
Expand All @@ -23,18 +24,20 @@ public override Task<ActionResult> Execute()
{
case "Succeeded":
case "Cancelled":
_logger.LogInformation($"Terminate Action {ActionName} reached with status {runStatus}.");
_logger.LogInformation("Terminate Action {ActionName} reached with status {RunStatus}",
ActionName, runStatus);
return Task.FromResult(new ActionResult
{
ActionStatus = ActionStatus.Succeeded,
ContinueExecution = false
});
case "Failed":
var exceptionMessage = "Terminate action with status: Failed.";

if (!Inputs.GetValue<Dictionary<string, ValueContainer>>()
.TryGetValue("runError", out var runErrorDict)) throw new PowerAutomateMockUpException(exceptionMessage);

.TryGetValue("runError", out var runErrorDict))
throw new PowerAutomateMockUpException(exceptionMessage);

var dict = runErrorDict.GetValue<Dictionary<string, ValueContainer>>();

if (dict.TryGetValue("code", out var code))
Expand All @@ -46,10 +49,11 @@ public override Task<ActionResult> Execute()
{
exceptionMessage += $" Error message: {message}.";
}

_logger.LogInformation(
$"Terminate Action {ActionName} reached with status {runStatus}. Error code: {code}. Error message: {message}. Throwing exception.");


_logger.LogInformation("Terminate Action {ActionName} reached with status {RunStatus}. " +
"Error code: {Code}. Error message: {Message}. Throwing exception",
ActionName, runStatus, code, message);

throw new PowerAutomateMockUpException(exceptionMessage);
default:
throw new Exception($"Unknown runStatus: {runStatus}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@

namespace Parser.FlowParser.ActionExecutors.Implementations.DataOperation
{
public class ComposeActionExecutor : DefaultBaseActionExecutor
public class ComposeActionExecutor : InputsBaseActionExecutor
{
private readonly IExpressionEngine _expressionEngine;

public ComposeActionExecutor(IExpressionEngine expressionEngine)
public ComposeActionExecutor(IExpressionEngine expressionEngine) : base(expressionEngine)
{
_expressionEngine = expressionEngine ?? throw new ArgumentNullException(nameof(expressionEngine));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System;
using Parser.ExpressionParser;

namespace Parser.FlowParser.ActionExecutors
{
public abstract class InputsBaseActionExecutor : ActionExecutorBase
{
private readonly IExpressionEngine _expressionEngine;

protected InputsBaseActionExecutor(IExpressionEngine expressionEngine)
{
_expressionEngine = expressionEngine ?? throw new ArgumentNullException(nameof(expressionEngine));
}

protected override void ProcessJson()
{
var inputs = Json.SelectToken("$.inputs");
if (inputs != null)
{
Inputs = new ValueContainer(inputs, _expressionEngine);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,23 @@ protected OpenApiConnectionActionExecutorBase(IExpressionEngine expressionEngine

protected override void ProcessJson()
{
var type = Json.SelectToken("$.type").Value<string>();
var type = Json.SelectToken("$.type")?.Value<string>();

var inputs = Json.SelectToken("$.inputs");

if (inputs == null) return;

Inputs = new ValueContainer(inputs, _expressionEngine);

if (type != "OpenApiConnection")
throw new InvalidOperationException(
"The expected Action Description type was OpenApiConnection, but the " +
$"Action Description type was {type}.");

var inputs = Json.SelectToken("$.inputs");

var content = inputs.ToObject<ActionInputs>();
Host = content.HostValues;
Parameters = new ValueContainer(new Dictionary<string, ValueContainer>());
foreach (var keyValuePar in content.Parameters)
{
Parameters[keyValuePar.Key] = _expressionEngine.ParseToValueContainer(keyValuePar.Value);
}
Host = content?.HostValues;
Parameters = Inputs["parameters"];
}

protected HostValues Host { get; set; }
Expand Down
20 changes: 9 additions & 11 deletions Test/ActionTests/TerminateActionTest.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Moq;
using Newtonsoft.Json.Linq;
using NUnit.Framework;
using Parser;
using Parser.ExpressionParser.Functions.Base;
using Parser.ExpressionParser;
using Parser.FlowParser.ActionExecutors;
using Parser.FlowParser.ActionExecutors.Implementations;
using Parser.FlowParser.ActionExecutors.Implementations.ControlActions;

namespace Test.ActionTests
Expand All @@ -16,18 +16,16 @@ public class TerminateActionTest
[Test]
public async Task TerminateSucceededTest()
{
/*var collection = new ServiceCollection();
collection.AddFlowRunner();
var sp = collection.BuildServiceProvider();
var actionExecutorFactory = sp.GetRequiredService<ActionExecutorFactory>();
var action = actionExecutorFactory.ResolveActionByType("Terminate");*/
var expressionMock = new Mock<IExpressionEngine>();
expressionMock.Setup(x => x.ParseToValueContainer(It.IsAny<string>()))
.Returns<string>(input => new ValueContainer(input));

var action = new TerminateActionExecutor(TestLogger.Create<TerminateActionExecutor>());
var action =
new TerminateActionExecutor(TestLogger.Create<TerminateActionExecutor>(), expressionMock.Object);

var json =
"{\"Terminate\": { \"runAfter\": {}, \"type\": \"Terminate\", \"inputs\": { \"runStatus\": \"Succeeded\" } } }";
action.InitializeActionExecutor("TerminateAction", JToken.Parse(json).First.First);
action.InitializeActionExecutor("TerminateAction", JToken.Parse(json).First?.First);

var resp = await action.Execute();

Expand All @@ -51,7 +49,7 @@ public void TerminateFailedNoMessageTest()

var exception = Assert.ThrowsAsync<PowerAutomateMockUpException>(async () => { await action.Execute(); });

Assert.AreEqual("Terminate action with status: Failed. Error code: 1234.",exception.Message);
Assert.AreEqual("Terminate action with status: Failed. Error code: 1234.", exception.Message);
}
}
}

0 comments on commit bfe0141

Please sign in to comment.