Browse Source

Scripting improvement and ensure that status works as well.

pull/383/head 3.0.0-beta2
Sebastian Stehle 7 years ago
parent
commit
6d51c70ac9
  1. 11
      src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs
  2. 3
      src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs
  3. 16
      tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs
  4. 66
      tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs

11
src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs

@ -47,6 +47,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules
AddPattern("APP_ID", AppId); AddPattern("APP_ID", AppId);
AddPattern("APP_NAME", AppName); AddPattern("APP_NAME", AppName);
AddPattern("CONTENT_ACTION", ContentAction); AddPattern("CONTENT_ACTION", ContentAction);
AddPattern("CONTENT_STATUS", ContentStatus);
AddPattern("CONTENT_URL", ContentUrl); AddPattern("CONTENT_URL", ContentUrl);
AddPattern("SCHEMA_ID", SchemaId); AddPattern("SCHEMA_ID", SchemaId);
AddPattern("SCHEMA_NAME", SchemaName); AddPattern("SCHEMA_NAME", SchemaName);
@ -212,6 +213,16 @@ namespace Squidex.Domain.Apps.Core.HandleRules
return Fallback; return Fallback;
} }
private static string ContentStatus(EnrichedEvent @event)
{
if (@event is EnrichedContentEvent contentEvent)
{
return contentEvent.Status.ToString();
}
return Fallback;
}
private string ContentUrl(EnrichedEvent @event) private string ContentUrl(EnrichedEvent @event)
{ {
if (@event is EnrichedContentEvent contentEvent) if (@event is EnrichedContentEvent contentEvent)

3
src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs

@ -46,6 +46,9 @@ namespace Squidex.Domain.Apps.Core.Scripting
case Instant instant: case Instant instant:
result = JsValue.FromObject(engine, instant.ToDateTimeUtc()); result = JsValue.FromObject(engine, instant.ToDateTimeUtc());
return true; return true;
case Status status:
result = status.ToString();
return true;
case NamedContentData content: case NamedContentData content:
result = new ContentDataObject(engine, content); result = new ContentDataObject(engine, content);
return true; return true;

16
tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs

@ -170,6 +170,22 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
Assert.Equal("Go to null", sut.Format(script, new EnrichedAssetEvent())); Assert.Equal("Go to null", sut.Format(script, new EnrichedAssetEvent()));
} }
[Theory]
[InlineData("$CONTENT_STATUS")]
[InlineData("Script(`${event.status}`)")]
public void Should_format_content_status_when_found(string script)
{
Assert.Equal("Published", sut.Format(script, new EnrichedContentEvent { Status = Status.Published }));
}
[Theory]
[InlineData("$CONTENT_ACTION")]
[InlineData("Script(contentAction())")]
public void Should_null_when_content_status_not_found(string script)
{
Assert.Equal("null", sut.Format(script, new EnrichedAssetEvent()));
}
[Theory] [Theory]
[InlineData("$CONTENT_ACTION")] [InlineData("$CONTENT_ACTION")]
[InlineData("Script(`${event.type}`)")] [InlineData("Script(`${event.type}`)")]

66
tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs

@ -17,38 +17,38 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
{ {
public class JintScriptEngineTests public class JintScriptEngineTests
{ {
private readonly JintScriptEngine scriptEngine = new JintScriptEngine { Timeout = TimeSpan.FromSeconds(1) }; private readonly JintScriptEngine sut = new JintScriptEngine { Timeout = TimeSpan.FromSeconds(1) };
[Fact] [Fact]
public void Should_throw_validation_exception_when_calling_reject() public void Should_throw_validation_exception_when_calling_reject()
{ {
Assert.Throws<ValidationException>(() => scriptEngine.Execute(new ScriptContext(), "reject()")); Assert.Throws<ValidationException>(() => sut.Execute(new ScriptContext(), "reject()"));
Assert.Throws<ValidationException>(() => scriptEngine.Execute(new ScriptContext(), "reject('Not valid')")); Assert.Throws<ValidationException>(() => sut.Execute(new ScriptContext(), "reject('Not valid')"));
} }
[Fact] [Fact]
public void Should_throw_security_exception_when_calling_reject() public void Should_throw_security_exception_when_calling_reject()
{ {
Assert.Throws<DomainForbiddenException>(() => scriptEngine.Execute(new ScriptContext(), "disallow()")); Assert.Throws<DomainForbiddenException>(() => sut.Execute(new ScriptContext(), "disallow()"));
Assert.Throws<DomainForbiddenException>(() => scriptEngine.Execute(new ScriptContext(), "disallow('Not allowed')")); Assert.Throws<DomainForbiddenException>(() => sut.Execute(new ScriptContext(), "disallow('Not allowed')"));
} }
[Fact] [Fact]
public void Should_catch_script_syntax_errors() public void Should_catch_script_syntax_errors()
{ {
Assert.Throws<ValidationException>(() => scriptEngine.Execute(new ScriptContext(), "x => x")); Assert.Throws<ValidationException>(() => sut.Execute(new ScriptContext(), "x => x"));
} }
[Fact] [Fact]
public void Should_catch_script_runtime_errors() public void Should_catch_script_runtime_errors()
{ {
Assert.Throws<ValidationException>(() => scriptEngine.Execute(new ScriptContext(), "throw 'Error';")); Assert.Throws<ValidationException>(() => sut.Execute(new ScriptContext(), "throw 'Error';"));
} }
[Fact] [Fact]
public void Should_catch_script_runtime_errors_on_execute_and_transform() public void Should_catch_script_runtime_errors_on_execute_and_transform()
{ {
Assert.Throws<ValidationException>(() => scriptEngine.ExecuteAndTransform(new ScriptContext(), "throw 'Error';")); Assert.Throws<ValidationException>(() => sut.ExecuteAndTransform(new ScriptContext(), "throw 'Error';"));
} }
[Fact] [Fact]
@ -57,7 +57,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var content = new NamedContentData(); var content = new NamedContentData();
var context = new ScriptContext { Data = content }; var context = new ScriptContext { Data = content };
var result = scriptEngine.Transform(context, "x => x"); var result = sut.Transform(context, "x => x");
Assert.Same(content, result); Assert.Same(content, result);
} }
@ -68,7 +68,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var content = new NamedContentData(); var content = new NamedContentData();
var context = new ScriptContext { Data = content }; var context = new ScriptContext { Data = content };
Assert.Throws<ValidationException>(() => scriptEngine.ExecuteAndTransform(context, "x => x")); Assert.Throws<ValidationException>(() => sut.ExecuteAndTransform(context, "x => x"));
} }
[Fact] [Fact]
@ -77,7 +77,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var content = new NamedContentData(); var content = new NamedContentData();
var context = new ScriptContext { Data = content }; var context = new ScriptContext { Data = content };
var result = scriptEngine.ExecuteAndTransform(context, "var x = 0;"); var result = sut.ExecuteAndTransform(context, "var x = 0;");
Assert.Same(content, result); Assert.Same(content, result);
} }
@ -95,7 +95,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var context = new ScriptContext { Data = content, Operation = "MyOperation" }; var context = new ScriptContext { Data = content, Operation = "MyOperation" };
var result = scriptEngine.ExecuteAndTransform(context, @" var result = sut.ExecuteAndTransform(context, @"
var data = ctx.data; var data = ctx.data;
data.operation = { iv: ctx.operation }; data.operation = { iv: ctx.operation };
@ -127,7 +127,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var context = new ScriptContext { Data = content }; var context = new ScriptContext { Data = content };
var result = scriptEngine.Transform(context, @" var result = sut.Transform(context, @"
var data = ctx.data; var data = ctx.data;
delete data.number0; delete data.number0;
@ -160,7 +160,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var context = new ScriptContext { Data = content }; var context = new ScriptContext { Data = content };
var result = scriptEngine.Transform(context, @" var result = sut.Transform(context, @"
var data = ctx.data; var data = ctx.data;
data.slug = { iv: slugify(data.title.iv) }; data.slug = { iv: slugify(data.title.iv) };
@ -190,7 +190,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var context = new ScriptContext { Data = content }; var context = new ScriptContext { Data = content };
var result = scriptEngine.Transform(context, @" var result = sut.Transform(context, @"
var data = ctx.data; var data = ctx.data;
data.slug = { iv: slugify(data.title.iv, true) }; data.slug = { iv: slugify(data.title.iv, true) };
@ -222,7 +222,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var context = new ScriptContext { Data = content }; var context = new ScriptContext { Data = content };
var result = scriptEngine.ExecuteAndTransform(context, @" var result = sut.ExecuteAndTransform(context, @"
var data = ctx.data; var data = ctx.data;
delete data.number0; delete data.number0;
@ -263,12 +263,44 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting
var context = new ScriptContext { Data = content, OldData = oldContent, User = userPrincipal }; var context = new ScriptContext { Data = content, OldData = oldContent, User = userPrincipal };
var result = scriptEngine.ExecuteAndTransform(context, @" var result = sut.ExecuteAndTransform(context, @"
ctx.data.number0.iv = ctx.data.number0.iv + ctx.oldData.number0.iv * parseInt(ctx.user.id, 10); ctx.data.number0.iv = ctx.data.number0.iv + ctx.oldData.number0.iv * parseInt(ctx.user.id, 10);
replace(ctx.data);"); replace(ctx.data);");
Assert.Equal(expected, result); Assert.Equal(expected, result);
} }
[Fact]
public void Should_evaluate_to_true_when_expression_match()
{
var result = sut.Evaluate("value", new { i = 2 }, "value.i == 2");
Assert.True(result);
}
[Fact]
public void Should_evaluate_to_true_when_status_match()
{
var result = sut.Evaluate("value", new { status = Status.Published }, "value.status == 'Published'");
Assert.True(result);
}
[Fact]
public void Should_evaluate_to_false_when_expression_match()
{
var result = sut.Evaluate("value", new { i = 2 }, "value.i == 3");
Assert.False(result);
}
[Fact]
public void Should_evaluate_to_false_when_script_is_invalid()
{
var result = sut.Evaluate("value", new { i = 2 }, "function()");
Assert.False(result);
}
} }
} }

Loading…
Cancel
Save