From e7cfe3d0966f67df72c1c2462288d7c67a39445d Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Thu, 17 Oct 2024 15:08:19 -0700 Subject: [PATCH] Allow using empty groupId for shape results --- .../Views/ShapeResult.cs | 19 ++- .../DisplayManagement/ShapeResultTests.cs | 123 +++--------------- .../Stubs/GroupDisplayDriverStub.cs | 10 +- 3 files changed, 29 insertions(+), 123 deletions(-) diff --git a/src/OrchardCore/OrchardCore.DisplayManagement/Views/ShapeResult.cs b/src/OrchardCore/OrchardCore.DisplayManagement/Views/ShapeResult.cs index cdf43734245..d92367fdcad 100644 --- a/src/OrchardCore/OrchardCore.DisplayManagement/Views/ShapeResult.cs +++ b/src/OrchardCore/OrchardCore.DisplayManagement/Views/ShapeResult.cs @@ -107,11 +107,16 @@ private async Task ApplyImplementationAsync(BuildShapeContext context, string di if (!string.IsNullOrEmpty(groupId)) { - _groupIds = StringValues.Concat(_groupIds, groupId); + OnGroup(groupId); } // If the shape's group doesn't match the currently rendered one, return. - if (!string.IsNullOrEmpty(context.GroupId) && !_groupIds.Contains(context.GroupId, StringComparer.OrdinalIgnoreCase)) + if (_groupIds.Count > 0 && !_groupIds.Contains(context.GroupId ?? string.Empty, StringComparer.OrdinalIgnoreCase)) + { + return; + } + + if (_groupIds.Count == 0 && !string.IsNullOrEmpty(context.GroupId)) { return; } @@ -312,15 +317,7 @@ public ShapeResult OnGroup(params string[] groupIds) { ArgumentNullException.ThrowIfNull(groupIds); - foreach (var groupId in groupIds) - { - if (string.IsNullOrEmpty(groupId)) - { - continue; - } - - _groupIds = StringValues.Concat(_groupIds, groupId); - } + _groupIds = StringValues.Concat(_groupIds, groupIds.Where(x => x != null).ToArray()); return this; } diff --git a/test/OrchardCore.Tests/DisplayManagement/ShapeResultTests.cs b/test/OrchardCore.Tests/DisplayManagement/ShapeResultTests.cs index 62a9f8f0bc8..d3b099a92d3 100644 --- a/test/OrchardCore.Tests/DisplayManagement/ShapeResultTests.cs +++ b/test/OrchardCore.Tests/DisplayManagement/ShapeResultTests.cs @@ -9,40 +9,26 @@ using OrchardCore.Scripting; using OrchardCore.Tests.DisplayManagement.Stubs; using OrchardCore.Tests.Stubs; + namespace OrchardCore.Tests.DisplayManagement; public class ShapeResultTests { - [Fact] - public async Task Shape_WhenCalled_ReturnShapeWhenNoGroupIsProvided() - { - var serviceProvider = GetServiceProvider(new GroupDisplayDriverStub()); - - var displayManager = serviceProvider.GetRequiredService>(); - var model = new GroupModel(); - - var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false); - - var testZone = shape.GetProperty(GroupDisplayDriverStub.ZoneName); - - Assert.NotNull(testZone); - - var shapeModel = testZone.Items[0] as ShapeViewModel; - - Assert.NotNull(shapeModel); - Assert.Equal(shapeModel.Value.Value, model.Value); - } - - [Fact] - public async Task Shape_WhenCalled_ReturnShapeWhenGroupIsMatched() + [Theory] + [InlineData("groupOne", "gRoUpTWo")] // case insensitive check. + [InlineData("groupOne", "groupOne")] + [InlineData("", "")] + [InlineData("", null)] + [InlineData(null, "")] + [InlineData(null, null)] + public async Task Shape_WhenCalled_ReturnShapeWhenGroupIsMatched(string groupId, string renderingGroupId) { - var groupId = "abc"; var serviceProvider = GetServiceProvider(new GroupDisplayDriverStub(groupId)); var displayManager = serviceProvider.GetRequiredService>(); var model = new GroupModel(); - var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false, groupId: groupId); + var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false, groupId: renderingGroupId); var testZone = shape.GetProperty(GroupDisplayDriverStub.ZoneName); @@ -54,91 +40,20 @@ public async Task Shape_WhenCalled_ReturnShapeWhenGroupIsMatched() Assert.Equal(shapeModel.Value.Value, model.Value); } - [Fact] - public async Task Shape_WhenCalled_NullGroupShouldBeTreatedAsEmptyString() + [Theory] + [InlineData("groupOne", "groupTwo")] + [InlineData("", "groupTwo")] + [InlineData(null, "groupTwo")] + [InlineData("groupOne", "")] + [InlineData("groupOne", null)] + public async Task Shape_WhenCalled_ReturnNullWhenIncorrectGroupIsSpecified(string groupId, string renderingGroupId) { - var serviceProvider = GetServiceProvider(new GroupDisplayDriverStub("")); - - var displayManager = serviceProvider.GetRequiredService>(); - var model = new GroupModel(); - - var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false, groupId: null); - - var testZone = shape.GetProperty(GroupDisplayDriverStub.ZoneName); - - Assert.NotNull(testZone); - - var shapeModel = testZone.Items[0] as ShapeViewModel; - - Assert.NotNull(shapeModel); - Assert.Equal(shapeModel.Value.Value, model.Value); - } - - [Fact] - public async Task Shape_WhenCalled_ReturnShapeWhenMatchedToAnyGroup() - { - var groupId = "abc"; - var serviceProvider = GetServiceProvider(new GroupDisplayDriverStub("xyz", "test", groupId)); - - var displayManager = serviceProvider.GetRequiredService>(); - var model = new GroupModel(); - - var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false, groupId: groupId); - - var testZone = shape.GetProperty(GroupDisplayDriverStub.ZoneName); - - Assert.NotNull(testZone); - - var shapeModel = testZone.Items[0] as ShapeViewModel; - - Assert.NotNull(shapeModel); - Assert.Equal(shapeModel.Value.Value, model.Value); - } - - [Fact] - public async Task Shape_WhenCalled_ReturnShapeWhenMatchedToAnyGroupCaseInsensitive() - { - var serviceProvider = GetServiceProvider(new GroupDisplayDriverStub("xyz", "test")); - - var displayManager = serviceProvider.GetRequiredService>(); - var model = new GroupModel(); - - var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false, groupId: "xYz"); - - var testZone = shape.GetProperty(GroupDisplayDriverStub.ZoneName); - - Assert.NotNull(testZone); - - var shapeModel = testZone.Items[0] as ShapeViewModel; - - Assert.NotNull(shapeModel); - Assert.Equal(shapeModel.Value.Value, model.Value); - } - - [Fact] - public async Task Shape_WhenCalled_ReturnNullWhenIncorrectGroupIsSpecified() - { - var serviceProvider = GetServiceProvider(new GroupDisplayDriverStub("groupOne")); - - var displayManager = serviceProvider.GetRequiredService>(); - var model = new GroupModel(); - - var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false, groupId: "groupTwo"); - - var testZone = shape.GetProperty(GroupDisplayDriverStub.ZoneName); - - Assert.Null(testZone); - } - - [Fact] - public async Task Shape_WhenCalled_ReturnNullWhenGroupDoesNotMatchExactGroup() - { - var serviceProvider = GetServiceProvider(new GroupDisplayDriverStub()); + var serviceProvider = GetServiceProvider(new GroupDisplayDriverStub(groupId)); var displayManager = serviceProvider.GetRequiredService>(); var model = new GroupModel(); - var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false, groupId: "groupTwo"); + var shape = await displayManager.BuildEditorAsync(model, updater: null, isNew: false, groupId: renderingGroupId); var testZone = shape.GetProperty(GroupDisplayDriverStub.ZoneName); diff --git a/test/OrchardCore.Tests/DisplayManagement/Stubs/GroupDisplayDriverStub.cs b/test/OrchardCore.Tests/DisplayManagement/Stubs/GroupDisplayDriverStub.cs index fa9b5aa1a56..0baac3a888c 100644 --- a/test/OrchardCore.Tests/DisplayManagement/Stubs/GroupDisplayDriverStub.cs +++ b/test/OrchardCore.Tests/DisplayManagement/Stubs/GroupDisplayDriverStub.cs @@ -11,7 +11,7 @@ internal sealed class GroupDisplayDriverStub : DisplayDriver public GroupDisplayDriverStub(params string[] groupIds) { - _groupIds = groupIds; + _groupIds = groupIds ?? []; } public override IDisplayResult Edit(GroupModel model, BuildEditorContext context) @@ -19,13 +19,7 @@ public override IDisplayResult Edit(GroupModel model, BuildEditorContext context var result = View("test", model) .Location(ZoneName); - if (_groupIds != null) - { - foreach (var groupId in _groupIds) - { - result.OnGroup(groupId); - } - } + result.OnGroup(_groupIds); return result; }