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 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 IJsonSerializer jsonSerializer;
private readonly IUrlGenerator urlGenerator;
@ -153,7 +153,19 @@ namespace Squidex.Domain.Apps.Core.HandleRules
(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);
@ -327,7 +339,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules
return null;
}
private static string TransformText(string? text, string? transform)
private static string? TransformText(string? text, string? 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)

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);
}
[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()
[Theory]
[InlineData("${EVENT_INVALID ? file}", "file")]
public void Should_provide_fallback_if_path_is_invalid(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);
}
[Fact]
public void Should_evaluate_script_if_ends_with_whitespace()
[Theory]
[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]
@ -588,5 +570,45 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules
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