diff --git a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs index 0c36f4f..ed2531c 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Base/RegressionTestBase.cs @@ -1,10 +1,19 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; +using Archetype.Umbraco.PropertyEditors; using Archetype.Umbraco.Serialization; +using Moq; using Newtonsoft.Json; using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; +using Umbraco.Core.Persistence; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; namespace Archetype.Tests.Serialization.Base { @@ -90,10 +99,64 @@ namespace Archetype.Tests.Serialization.Base protected void NestedModel_WithEscapedJson_Regression_Battery(T model) { - var archetype = ConvertModelToArchetype(model); - Assert.IsNotNull(ConvertModelToArchetype(model)); + var propGuid = new Guid(); + var cacheHelper = CacheHelper.CreateDisabledCacheHelper(); + var dtd = new DataTypeDefinition(-1, String.Empty) {Id = 0}; + + var dataTypeService = new Mock(); + dataTypeService.Setup(dts => dts.GetDataTypeDefinitionById(Guid.Parse(propGuid.ToString()))).Returns(dtd); + dataTypeService.Setup(dts => dts.GetPreValuesCollectionByDataTypeId(dtd.Id)).Returns(new PreValueCollection(new Dictionary())); - var nestedJson = archetype.SerializeForPersistence(); + var propValueEditor = new Mock(new PropertyValueEditor()); + propValueEditor.Setup(pe => pe.GetPropertyEditor(dtd)).Returns(new ArchetypePropertyEditor()); + + var serviceContext = new ServiceContext( + Mock.Of(), + Mock.Of(), + Mock.Of(), + dataTypeService.Object, + Mock.Of(), + Mock.Of(), + Mock.Of(), + Mock.Of(), + Mock.Of(), + Mock.Of(), + Mock.Of(), + Mock.Of(), + Mock.Of() + ); + + ApplicationContext.EnsureContext( + new DatabaseContext(Mock.Of()), serviceContext, cacheHelper, true); + + var archetype = ConvertModelToArchetype(model); + + foreach (var prop in archetype.Fieldsets.SelectMany(fs => fs.Properties)) + { + prop.DataTypeGuid = propGuid.ToString(); + if (prop.Value.ToString().Contains("fieldsets")) + prop.PropertyEditorAlias = Umbraco.Constants.PropertyEditorAlias; + } + + var archetypeJson = JsonConvert.SerializeObject(archetype); + Assert.IsNotNullOrEmpty(archetypeJson); + + var propEditor = new ArchetypePropertyEditor.ArchetypePropertyValueEditor(new PropertyValueEditor()); + + var convertedJson = (string)propEditor.ConvertEditorToDb(new ContentPropertyData(archetypeJson, + new PreValueCollection(new Dictionary()), new Dictionary()), + model); + + Assert.IsNotNullOrEmpty(convertedJson); + + var resultfromArchetypeJson = ConvertArchetypeJsonToModel(archetypeJson); + var resultfromConvertedJson = ConvertArchetypeJsonToModel(convertedJson); + + Assert.IsInstanceOf(resultfromArchetypeJson); + AssertAreEqual(model, resultfromArchetypeJson); + + Assert.IsInstanceOf(resultfromConvertedJson); + AssertAreEqual(model, resultfromConvertedJson); } protected void ComplexModel_Regression_Battery(T model) diff --git a/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs b/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs index baf33cd..4ddc60d 100644 --- a/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs +++ b/app/Umbraco/Archetype.Tests/Serialization/Regression/ArchetypeJsonConverterTest.cs @@ -134,7 +134,7 @@ namespace Archetype.Tests.Serialization.Regression public void NestedModel_WithEscapedJson_Regression_Battery() { var nestedModel = _testHelper.GetModel(); - NestedModel_WithEscapedJson_Regression_Battery(nestedModel); + NestedModel_WithEscapedJson_Regression_Battery(nestedModel); } [Test] diff --git a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs index 3192130..daa815c 100644 --- a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs +++ b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs @@ -127,7 +127,7 @@ namespace Archetype.Umbraco.PropertyEditors var dtd = ApplicationContext.Current.Services.DataTypeService.GetDataTypeDefinitionById(Guid.Parse(propDef.DataTypeGuid)); var preValues = ApplicationContext.Current.Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dtd.Id); var propData = new ContentPropertyData(propDef.Value, preValues, new Dictionary()); - var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias); + var propEditor = GetPropertyEditor(dtd); propDef.Value = propEditor.ValueEditor.ConvertEditorToDb(propData, propDef.Value); } catch (Exception ex) @@ -138,7 +138,16 @@ namespace Archetype.Umbraco.PropertyEditors } return archetype.SerializeForPersistence(); - } + } + + internal virtual PropertyEditor GetPropertyEditor(IDataTypeDefinition dtd) + { + return dtd.Id == 0 + ? dtd.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias) + ? new ArchetypePropertyEditor() + : new PropertyEditor() + : PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias); + } } #endregion