From e87196909ac67304a122d58df07a39ec445b1c56 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 31 Jan 2023 09:46:45 +0100 Subject: [PATCH] Uses URL path separator when generating UDIs for files nested in folders. (#13689) --- .../Extensions/UdiGetterExtensions.cs | 17 +++--- .../Builders/PartialViewBuilder.cs | 41 +++++++++++++++ .../Builders/ScriptBuilder.cs | 33 ++++++++++++ .../Builders/StylesheetBuilder.cs | 2 +- .../Extensions/UdiGetterExtensionsTests.cs | 52 +++++++++++++++++++ 5 files changed, 138 insertions(+), 7 deletions(-) create mode 100644 tests/Umbraco.Tests.Common/Builders/PartialViewBuilder.cs create mode 100644 tests/Umbraco.Tests.Common/Builders/ScriptBuilder.cs create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Core/Extensions/UdiGetterExtensionsTests.cs diff --git a/src/Umbraco.Core/Extensions/UdiGetterExtensions.cs b/src/Umbraco.Core/Extensions/UdiGetterExtensions.cs index 1ad94cbdc3..03ed07f2fe 100644 --- a/src/Umbraco.Core/Extensions/UdiGetterExtensions.cs +++ b/src/Umbraco.Core/Extensions/UdiGetterExtensions.cs @@ -232,9 +232,7 @@ public static class UdiGetterExtensions throw new ArgumentNullException("entity"); } - return new StringUdi( - Constants.UdiEntityType.Stylesheet, - entity.Path.TrimStart(Constants.CharArrays.ForwardSlash)).EnsureClosed(); + return GetUdiFromPath(Constants.UdiEntityType.Stylesheet, entity.Path); } /// @@ -249,8 +247,15 @@ public static class UdiGetterExtensions throw new ArgumentNullException("entity"); } - return new StringUdi(Constants.UdiEntityType.Script, entity.Path.TrimStart(Constants.CharArrays.ForwardSlash)) - .EnsureClosed(); + return GetUdiFromPath(Constants.UdiEntityType.Script, entity.Path); + } + + private static StringUdi GetUdiFromPath(string entityType, string path) + { + var id = path + .TrimStart(Constants.CharArrays.ForwardSlash) + .Replace("\\", "/"); + return new StringUdi(entityType, id).EnsureClosed(); } /// @@ -300,7 +305,7 @@ public static class UdiGetterExtensions ? Constants.UdiEntityType.PartialViewMacro : Constants.UdiEntityType.PartialView; - return new StringUdi(entityType, entity.Path.TrimStart(Constants.CharArrays.ForwardSlash)).EnsureClosed(); + return GetUdiFromPath(entityType, entity.Path); } /// diff --git a/tests/Umbraco.Tests.Common/Builders/PartialViewBuilder.cs b/tests/Umbraco.Tests.Common/Builders/PartialViewBuilder.cs new file mode 100644 index 0000000000..ead5a4f189 --- /dev/null +++ b/tests/Umbraco.Tests.Common/Builders/PartialViewBuilder.cs @@ -0,0 +1,41 @@ +// Copyright (c) Umbraco. +// See LICENSE for more details. + +using Umbraco.Cms.Core.Models; + +namespace Umbraco.Cms.Tests.Common.Builders; + +public class PartialViewBuilder + : BuilderBase +{ + private string _path; + private string _content; + private PartialViewType _viewType = PartialViewType.Unknown; + + public PartialViewBuilder WithPath(string path) + { + _path = path; + return this; + } + + public PartialViewBuilder WithContent(string content) + { + _content = content; + return this; + } + + public PartialViewBuilder WithViewType(PartialViewType viewType) + { + _viewType = viewType; + return this; + } + + public override IPartialView Build() + { + var path = _path ?? string.Empty; + var content = _content ?? string.Empty; + var viewType = _viewType; + + return new PartialView(viewType, path) { Content = content }; + } +} diff --git a/tests/Umbraco.Tests.Common/Builders/ScriptBuilder.cs b/tests/Umbraco.Tests.Common/Builders/ScriptBuilder.cs new file mode 100644 index 0000000000..9e521d0c0f --- /dev/null +++ b/tests/Umbraco.Tests.Common/Builders/ScriptBuilder.cs @@ -0,0 +1,33 @@ +// Copyright (c) Umbraco. +// See LICENSE for more details. + +using Umbraco.Cms.Core.Models; + +namespace Umbraco.Cms.Tests.Common.Builders; + +public class ScriptBuilder + : BuilderBase