diff --git a/src/ReC.Application/Common/Dto/PlaceholderExtensions.cs b/src/ReC.Application/Common/Dto/PlaceholderExtensions.cs index 35a864f..f7e3a71 100644 --- a/src/ReC.Application/Common/Dto/PlaceholderExtensions.cs +++ b/src/ReC.Application/Common/Dto/PlaceholderExtensions.cs @@ -1,7 +1,6 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Reflection; using System.Text.RegularExpressions; -using ReC.Application.Common.Exceptions; namespace ReC.Application.Common.Dto; @@ -14,10 +13,8 @@ public static partial class PlaceholderExtensions /// Replaces placeholders in the format {#ANY_STRING#COLUMN_NAME} with the corresponding /// property value resolved via from the provided objects. /// Values are converted to SQL-compatible string representations. + /// If a placeholder cannot be resolved, it is replaced with NULL. /// - /// - /// Thrown when a placeholder's column name cannot be resolved from any of the provided objects. - /// public static string ReplacePlaceholders(this string str, params object?[] objects) { return PlaceholderRegex().Replace(str, match => @@ -37,7 +34,7 @@ public static partial class PlaceholderExtensions return ToSqlLiteral(value); } - throw new PlaceholderResolutionException(placeholder, columnName, str); + return "NULL"; }); } diff --git a/tests/ReC.Tests/Application/Behaviors/InvokeActionTests.cs b/tests/ReC.Tests/Application/Behaviors/InvokeActionTests.cs index 9ac80ad..2d3db35 100644 --- a/tests/ReC.Tests/Application/Behaviors/InvokeActionTests.cs +++ b/tests/ReC.Tests/Application/Behaviors/InvokeActionTests.cs @@ -1,6 +1,5 @@ using System.ComponentModel.DataAnnotations.Schema; using ReC.Application.Common.Dto; -using ReC.Application.Common.Exceptions; namespace ReC.Tests.Application.Behaviors; @@ -211,46 +210,40 @@ public class InvokeActionTests #region ReplacePlaceholders - Exception Tests [Test] - public void ReplacePlaceholders_UnresolvableColumn_ThrowsPlaceholderResolutionException() + public void ReplacePlaceholders_UnresolvableColumn_ReturnsNull() { var input = "WHERE X = {#INT#NON_EXISTING}"; - var ex = Assert.Throws(() => - input.ReplacePlaceholders(_foo, _bar, _fuz)); - - Assert.That(ex!.ColumnName, Is.EqualTo("NON_EXISTING")); - Assert.That(ex.Placeholder, Is.EqualTo("{#INT#NON_EXISTING}")); - Assert.That(ex.Input, Is.EqualTo(input)); + var result = input.ReplacePlaceholders(_foo, _bar, _fuz); + Assert.That(result, Is.EqualTo("WHERE X = NULL")); } [Test] - public void ReplacePlaceholders_NoObjectsProvided_ThrowsPlaceholderResolutionException() + public void ReplacePlaceholders_NoObjectsProvided_ReturnsNull() { var input = "WHERE X = {#INT#BAZ}"; - Assert.Throws(() => - input.ReplacePlaceholders()); + var result = input.ReplacePlaceholders(); + Assert.That(result, Is.EqualTo("WHERE X = NULL")); } [Test] - public void ReplacePlaceholders_ObjectWithoutColumnAttributes_ThrowsPlaceholderResolutionException() + public void ReplacePlaceholders_ObjectWithoutColumnAttributes_ReturnsNull() { var model = new NoColumnModel { Id = 1, Name = "Test" }; var input = "WHERE X = {#INT#Id}"; - Assert.Throws(() => - input.ReplacePlaceholders(model)); + var result = input.ReplacePlaceholders(model); + Assert.That(result, Is.EqualTo("WHERE X = NULL")); } [Test] - public void ReplacePlaceholders_MixedResolvableAndUnresolvable_ThrowsOnUnresolvable() + public void ReplacePlaceholders_MixedResolvableAndUnresolvable_ReturnsNullForUnresolvable() { var input = "WHERE BAZ = {#INT#BAZ} AND X = {#INT#UNKNOWN}"; - var ex = Assert.Throws(() => - input.ReplacePlaceholders(_foo, _bar, _fuz)); - - Assert.That(ex!.ColumnName, Is.EqualTo("UNKNOWN")); + var result = input.ReplacePlaceholders(_foo, _bar, _fuz); + Assert.That(result, Is.EqualTo("WHERE BAZ = 2 AND X = NULL")); } #endregion