Add test for javascript

This commit is contained in:
Joseph Stewart 2021-07-31 18:35:10 -07:00 committed by Sipke Schoorstra
parent 60aa235b16
commit e51395ff21
3 changed files with 99 additions and 2 deletions

View file

@ -16,6 +16,7 @@ using Elsa.Services.WorkflowStorage;
using Jint;
using MediatR;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using NodaTime;
namespace Elsa.Scripting.JavaScript.Handlers
@ -27,12 +28,12 @@ namespace Elsa.Scripting.JavaScript.Handlers
private readonly IWorkflowStorageService _workflowStorageService;
private readonly ScriptOptions _scriptOptions;
public ConfigureJavaScriptEngine(IConfiguration configuration, IActivityTypeService activityTypeService, IWorkflowStorageService workflowStorageService, ScriptOptions scriptOptions)
public ConfigureJavaScriptEngine(IConfiguration configuration, IActivityTypeService activityTypeService, IWorkflowStorageService workflowStorageService, IOptions<ScriptOptions> scriptOptions)
{
_configuration = configuration;
_activityTypeService = activityTypeService;
_workflowStorageService = workflowStorageService;
_scriptOptions = scriptOptions;
_scriptOptions = scriptOptions.Value;
}
public async Task Handle(EvaluatingJavaScriptExpression notification, CancellationToken cancellationToken)

View file

@ -1,14 +1,19 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Elsa.Activities.Console;
using Elsa.Activities.Primitives;
using Elsa.ActivityResults;
using Elsa.Builders;
using Elsa.Core.IntegrationTests.Autofixture;
using Elsa.Expressions;
using Elsa.Models;
using Elsa.Serialization;
using Elsa.Services;
using Elsa.Services.Models;
using Elsa.Testing.Shared;
using Elsa.Testing.Shared.Helpers;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Xunit;
@ -25,6 +30,88 @@ namespace Elsa.Core.IntegrationTests.Scripting.JavaScript
var host = await hostBuilder.StartAsync();
}
[Fact(DisplayName = "JavaScript expressions cannot access configuration by default")]
public async Task JavaScriptCannotAccessConfigurationByDefault()
{
var services = new ServiceCollection()
.AddSingleton<IConfiguration>(_ => new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
{ "SomeSecret", "I am a secret" },
})
.Build())
.AddSingleton<AssertableActivityState>()
.AddElsa(elsa => elsa
.AddActivity<WriteConfigActivity>()
.AddWorkflow<ConfigurationAccessWorkflow>())
.BuildServiceProvider();
var workflowStarter = services.GetRequiredService<IBuildsAndStartsWorkflow>();
var activityState = services.GetRequiredService<AssertableActivityState>();
await workflowStarter.BuildAndStartWorkflowAsync<ConfigurationAccessWorkflow>();
Assert.Single(activityState.Messages, "Config secret: ");
}
[Fact(DisplayName = "JavaScript expressions can have configuration access enabled")]
public async Task JavaScriptExpressionsHaveConfigurationAccessEnabled()
{
var services = new ServiceCollection()
.AddSingleton<IConfiguration>(_ => new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
{ "SomeSecret", "I am a secret" },
})
.Build())
.AddSingleton<AssertableActivityState>()
.AddElsa(elsa => elsa
.AddActivity<WriteConfigActivity>()
.AddWorkflow<ConfigurationAccessWorkflow>())
.WithJavaScriptOptions(x =>
{
x.EnableConfigurationAccess = true;
})
.BuildServiceProvider();
var workflowStarter = services.GetRequiredService<IBuildsAndStartsWorkflow>();
var activityState = services.GetRequiredService<AssertableActivityState>();
await workflowStarter.BuildAndStartWorkflowAsync<ConfigurationAccessWorkflow>();
Assert.Single(activityState.Messages, "Config secret: I am a secret");
}
private class ConfigurationAccessWorkflow : IWorkflow
{
public void Build(IWorkflowBuilder builder)
{
builder.StartWith<WriteConfigActivity>();
}
}
private class WriteConfigActivity : Activity
{
private IExpressionEvaluator _expressionEvaluator;
private AssertableActivityState _activityState;
public WriteConfigActivity(IExpressionEvaluator evaluator, AssertableActivityState activityState)
{
_expressionEvaluator = evaluator;
_activityState = activityState;
}
protected override async ValueTask<IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context)
{
var javaScriptExpression = "getConfig('SomeSecret')";
var expressionResult = await _expressionEvaluator.TryEvaluateAsync<string>(javaScriptExpression, "JavaScript", context);
_activityState.Messages.Add($"Config secret: {expressionResult.Value ?? ""}");
return Done();
}
}
private class HostedWorkflowRunner : IHostedService
{
private readonly IStartsWorkflow _workflowRunner;

View file

@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace Elsa.Testing.Shared.Helpers
{
public class AssertableActivityState
{
public List<string> Messages { get; set; } = new();
}
}