From 66e1af4f37430574e11da704b1c4313f26eef6d7 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 28 May 2020 21:39:09 +0200 Subject: [PATCH] Optional values in rule formatter. --- .../HandleRules/RuleEventFormatter.cs | 20 ++++- .../HandleRules/RuleEventFormatterTests.cs | 82 ++++++++++++------- 2 files changed, 68 insertions(+), 34 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs index bd4ab1808..4a84a20fa 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs +++ b/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(@"^(?(?[^_]*)_(?[^\s]*))", RegexOptions.Compiled); - private static readonly Regex RegexPatternNew = new Regex(@"^\{(?(?[\w]*)_(?[\w\.\-]*))[\s]*(\|[\s]*(?[^\}]*)){0,1}\}", RegexOptions.Compiled); + private static readonly Regex RegexPatternNew = new Regex(@"^\{(?(?[\w]+)_(?[\w\.\-]+))[\s]*(\|[\s]*(?[^\?}]+))?(\?[\s]*(?[^\}\s]+))?[\s]*\}", RegexOptions.Compiled); private readonly List<(string Pattern, Func Replacer)> patterns = new List<(string Pattern, Func 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) diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs index a80910d2a..e941a6c27 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs +++ b/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); + } } }