2017-11-27 19:17:50 +01:00
using System ;
using System.Linq ;
2019-02-05 19:58:33 +01:00
using Umbraco.Core ;
using Umbraco.Core.Composing ;
2017-11-27 19:17:50 +01:00
using Umbraco.Core.Models ;
2019-02-07 12:43:11 +11:00
using Umbraco.Core.Services ;
2017-11-27 19:17:50 +01:00
namespace Umbraco.Tests.Testing
{
public static class ContentBaseExtensions
{
2019-02-07 12:43:11 +11:00
public static void PropertyValues ( this IContentBase content , object value , string culture = null , string segment = null )
{
content . PropertyValues ( Current . Services . ContentTypeBaseServices , value , culture , segment ) ;
}
2017-11-27 19:17:50 +01:00
/// <summary>
2019-02-05 19:58:33 +01:00
/// Set property values by alias with an anonymous object.
2017-11-27 19:17:50 +01:00
/// </summary>
/// <remarks>Does not support variants.</remarks>
2019-02-07 12:43:11 +11:00
public static void PropertyValues ( this IContentBase content , IContentTypeBaseServiceProvider contentTypeServiceProvider , object value , string culture = null , string segment = null )
2017-11-27 19:17:50 +01:00
{
if ( value = = null )
throw new Exception ( "No properties has been passed in" ) ;
var propertyInfos = value . GetType ( ) . GetProperties ( ) ;
foreach ( var propertyInfo in propertyInfos )
{
2019-02-07 12:43:11 +11:00
if ( content . Properties . TryGetValue ( propertyInfo . Name , out var property ) )
2017-11-27 19:17:50 +01:00
{
2019-02-07 12:43:11 +11:00
property . SetValue ( propertyInfo . GetValue ( value , null ) , culture , segment ) ;
2017-11-27 19:17:50 +01:00
//Update item with newly added value
2019-02-07 12:43:11 +11:00
content . Properties . Add ( property ) ;
2017-11-27 19:17:50 +01:00
}
else
{
2019-02-07 12:43:11 +11:00
//TODO: Will this ever happen?? In theory we don't need to lookup the content type here since we can just check if the content contains properties with the correct name,
// however, i think this may be needed in the case where the content type contains property types that do not exist yet as properties on the
// content item? But can that happen? AFAIK it can't/shouldn't because of how we create content items in ContentBase we do _properties.EnsurePropertyTypes!
var contentType = contentTypeServiceProvider . GetContentTypeOf ( content ) ;
var propertyType = contentType . CompositionPropertyTypes . FirstOrDefault ( x = > x . Alias = = propertyInfo . Name ) ;
if ( propertyType = = null )
throw new Exception ( $"The property alias {propertyInfo.Name} is not valid, because no PropertyType with this alias exists" ) ;
2017-11-27 19:17:50 +01:00
//Create new Property to add to collection
2019-02-07 12:43:11 +11:00
property = propertyType . CreateProperty ( ) ;
2018-05-01 13:30:25 +10:00
property . SetValue ( propertyInfo . GetValue ( value , null ) , culture , segment ) ;
2017-11-27 19:17:50 +01:00
content . Properties . Add ( property ) ;
}
}
}
}
}