Browse Source

Optional values in rule formatter.

pull/528/head
Sebastian 6 years ago
parent
commit
66e1af4f37
  1. 20
      backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs
  2. 82
      backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs

20
backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs

@ -29,7 +29,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules
{ {
private const string Fallback = "null"; private const string Fallback = "null";
private static readonly Regex RegexPatternOld = new Regex(@"^(?<FullPath>(?<Type>[^_]*)_(?<Path>[^\s]*))", RegexOptions.Compiled); private static readonly Regex RegexPatternOld = new Regex(@"^(?<FullPath>(?<Type>[^_]*)_(?<Path>[^\s]*))", RegexOptions.Compiled);
private static readonly Regex RegexPatternNew = new Regex(@"^\{(?<FullPath>(?<Type>[\w]*)_(?<Path>[\w\.\-]*))[\s]*(\|[\s]*(?<Transform>[^\}]*)){0,1}\}", RegexOptions.Compiled); private static readonly Regex RegexPatternNew = new Regex(@"^\{(?<FullPath>(?<Type>[\w]+)_(?<Path>[\w\.\-]+))[\s]*(\|[\s]*(?<Transform>[^\?}]+))?(\?[\s]*(?<Fallback>[^\}\s]+))?[\s]*\}", RegexOptions.Compiled);
private readonly List<(string Pattern, Func<EnrichedEvent, string?> Replacer)> patterns = new List<(string Pattern, Func<EnrichedEvent, string?> Replacer)>(); private readonly List<(string Pattern, Func<EnrichedEvent, string?> Replacer)> patterns = new List<(string Pattern, Func<EnrichedEvent, string?> Replacer)>();
private readonly IJsonSerializer jsonSerializer; private readonly IJsonSerializer jsonSerializer;
private readonly IUrlGenerator urlGenerator; private readonly IUrlGenerator urlGenerator;
@ -153,7 +153,19 @@ namespace Squidex.Domain.Apps.Core.HandleRules
(length, text) = ResolveFromPath(match, @event); (length, text) = ResolveFromPath(match, @event);
} }
return (TransformText(text, match.Groups["Transform"]?.Value), length); var result = TransformText(text, match.Groups["Transform"]?.Value);
if (result == null)
{
result = match.Groups["Fallback"]?.Value;
}
if (string.IsNullOrEmpty(result))
{
result = Fallback;
}
return (result, length);
} }
return (Fallback, 0); return (Fallback, 0);
@ -327,7 +339,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules
return null; return null;
} }
private static string TransformText(string? text, string? transform) private static string? TransformText(string? text, string? transform)
{ {
if (text != null && !string.IsNullOrWhiteSpace(transform)) if (text != null && !string.IsNullOrWhiteSpace(transform))
{ {
@ -357,7 +369,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules
} }
} }
return text ?? Fallback; return text;
} }
private (int Length, string? Result) ResolveFromPath(Match match, EnrichedEvent @event) private (int Length, string? Result) ResolveFromPath(Match match, EnrichedEvent @event)

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

@ -489,44 +489,26 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
Assert.Equal("From client:android", result); Assert.Equal("From client:android", result);
} }
[Fact] [Theory]
public void Should_format_json() [InlineData("${EVENT_INVALID ? file}", "file")]
{ public void Should_provide_fallback_if_path_is_invalid(string script, string expect)
var @event = new EnrichedContentEvent { Actor = new RefToken(RefTokenType.Client, "android") };
var result = sut.Format("Script(JSON.stringify({ actor: event.actor.toString() }))", @event);
Assert.Equal("{\"actor\":\"client:android\"}", result);
}
[Fact]
public void Should_format_json_with_special_characters()
{
var @event = new EnrichedContentEvent { Actor = new RefToken(RefTokenType.Client, "mobile\"android") };
var result = sut.Format("Script(JSON.stringify({ actor: event.actor.toString() }))", @event);
Assert.Equal("{\"actor\":\"client:mobile\\\"android\"}", result);
}
[Fact]
public void Should_evaluate_script_if_starting_with_whitespace()
{ {
var @event = new EnrichedContentEvent { Type = EnrichedContentEventType.Created }; var @event = new EnrichedAssetEvent { FileName = null! };
var result = sut.Format(" Script(`${event.type}`)", @event); var result = sut.Format(script, @event);
Assert.Equal("Created", result); Assert.Equal(expect, result);
} }
[Fact] [Theory]
public void Should_evaluate_script_if_ends_with_whitespace() [InlineData("${ASSET_FILENAME ? file}", "file")]
public void Should_provide_fallback_if_value_is_null(string script, string expect)
{ {
var @event = new EnrichedContentEvent { Type = EnrichedContentEventType.Created }; var @event = new EnrichedAssetEvent { FileName = null! };
var result = sut.Format("Script(`${event.type}`) ", @event); var result = sut.Format(script, @event);
Assert.Equal("Created", result); Assert.Equal(expect, result);
} }
[Theory] [Theory]
@ -588,5 +570,45 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
Assert.Equal(expect, result); Assert.Equal(expect, result);
} }
[Fact]
public void Should_format_json()
{
var @event = new EnrichedContentEvent { Actor = new RefToken(RefTokenType.Client, "android") };
var result = sut.Format("Script(JSON.stringify({ actor: event.actor.toString() }))", @event);
Assert.Equal("{\"actor\":\"client:android\"}", result);
}
[Fact]
public void Should_format_json_with_special_characters()
{
var @event = new EnrichedContentEvent { Actor = new RefToken(RefTokenType.Client, "mobile\"android") };
var result = sut.Format("Script(JSON.stringify({ actor: event.actor.toString() }))", @event);
Assert.Equal("{\"actor\":\"client:mobile\\\"android\"}", result);
}
[Fact]
public void Should_evaluate_script_if_starting_with_whitespace()
{
var @event = new EnrichedContentEvent { Type = EnrichedContentEventType.Created };
var result = sut.Format(" Script(`${event.type}`)", @event);
Assert.Equal("Created", result);
}
[Fact]
public void Should_evaluate_script_if_ends_with_whitespace()
{
var @event = new EnrichedContentEvent { Type = EnrichedContentEventType.Created };
var result = sut.Format("Script(`${event.type}`) ", @event);
Assert.Equal("Created", result);
}
} }
} }

Loading…
Cancel
Save