Skip to content

Commit

Permalink
Check if element type is as requested (#15974)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: Mike Alhayek <mike@crestapps.com>
  • Loading branch information
tropcicstefan and MikeAlhayek committed May 10, 2024
1 parent 1ba8423 commit f5542fa
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 1 deletion.
Expand Up @@ -63,12 +63,14 @@ public static class ContentExtensions
/// <returns>The content element instance or. <code>null</code> if it doesn't exist.</returns>
public static ContentElement Get(this ContentElement contentElement, Type contentElementType, string name)
{
if (contentElement.Elements.TryGetValue(name, out var element))
if (contentElement.Elements.TryGetValue(name, out var element) &&
element.GetType().IsAssignableTo(contentElementType))
{
return element;
}

var elementData = contentElement.Data[name] as JsonObject;

if (elementData is null)
{
return null;
Expand Down
69 changes: 69 additions & 0 deletions test/OrchardCore.Tests/ContentManagement/ContentElementTests.cs
@@ -0,0 +1,69 @@
using System.Text.Json;
using OrchardCore.ContentManagement;
using OrchardCore.Title.Models;

namespace OrchardCore.Tests.ContentManagement;
public class ContentElementTests
{
[Fact]
public void Get_WhenCastingBaseTypeThenConcreteType_ReturnNewInstance()
{
var contentItem = new ContentItem();
var titlePart = new TitlePart
{
Title = "test"
};

contentItem.Weld(titlePart);

var json = JConvert.SerializeObject(contentItem);

var contentItem2 = JConvert.DeserializeObject<ContentItem>(json);

// act
// The order arrangement of the next two calls are important.
// First cast to ContentPart.
var contentPart = contentItem2.Get<ContentPart>(nameof(TitlePart));

// Second, cast to TitlePart.
var actualPart = contentItem2.Get<TitlePart>(nameof(TitlePart));

// assert
Assert.NotNull(contentPart);
Assert.NotNull(actualPart);

// actualPart should deserialized again, so it must not be same as contentPart.
Assert.NotSame(contentPart, actualPart);
}

[Fact]
public void Get_WhenCastingConcreteTypeThenBaseType_ReturnNewInstance()
{
var contentItem = new ContentItem();
var titlePart = new TitlePart
{
Title = "test"
};

contentItem.Weld(titlePart);

var json = JConvert.SerializeObject(contentItem);

var contentItem2 = JConvert.DeserializeObject<ContentItem>(json);

// act
// The order arrangement of the next two calls are important.
// First cast to TitlePart.
var actualPart = contentItem2.Get<TitlePart>(nameof(TitlePart));

// Second, cast to ContentPart.
var contentPart = contentItem2.Get<ContentPart>(nameof(TitlePart));

// assert
Assert.NotNull(contentPart);
Assert.NotNull(actualPart);

// contentPart should be returned from cache, so it must be same as actualPart.
Assert.Same(contentPart, actualPart);
}
}

0 comments on commit f5542fa

Please sign in to comment.