diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index 908f620b11..765275cf51 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -15,7 +15,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - [DebuggerDisplay("Id: {Id}, Name: {Name}, ContentType: {ContentTypeBase.Alias}")] + [DebuggerDisplay("Id: {Id}, Name: {Name}, ContentType: {ContentType.Alias}")] public abstract class ContentBase : TreeEntityBase, IContentBase { protected static readonly ContentCultureInfosCollection NoInfos = new ContentCultureInfosCollection(); diff --git a/src/Umbraco.Core/Models/ISimpleContentType.cs b/src/Umbraco.Core/Models/ISimpleContentType.cs index 8c9413f934..40862afd9e 100644 --- a/src/Umbraco.Core/Models/ISimpleContentType.cs +++ b/src/Umbraco.Core/Models/ISimpleContentType.cs @@ -1,20 +1,17 @@ -namespace Umbraco.Core.Models +using Umbraco.Core.Models.Entities; + +namespace Umbraco.Core.Models { /// /// Represents a simplified view of a content type. /// - public interface ISimpleContentType + public interface ISimpleContentType : IUmbracoEntity { /// /// Gets the alias of the content type. /// string Alias { get; } - /// - /// Gets the identifier of the content type. - /// - int Id { get; } - /// /// Gets the default template of the content type. /// @@ -35,11 +32,6 @@ /// bool IsContainer { get; } - /// - /// Gets the name of the content type. - /// - string Name { get; } - /// /// Gets a value indicating whether content of that type can be created at the root of the tree. /// diff --git a/src/Umbraco.Core/Models/SimpleContentType.cs b/src/Umbraco.Core/Models/SimpleContentType.cs index db7e01fade..c0e235e92d 100644 --- a/src/Umbraco.Core/Models/SimpleContentType.cs +++ b/src/Umbraco.Core/Models/SimpleContentType.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -7,67 +9,56 @@ namespace Umbraco.Core.Models /// public class SimpleContentType : ISimpleContentType { + private readonly int _id; + private readonly string _name; + /// /// Initializes a new instance of the class. /// public SimpleContentType(IContentType contentType) + : this((IContentTypeBase)contentType) { - if (contentType == null) throw new ArgumentNullException(nameof(contentType)); - - - Id = contentType.Id; - Alias = contentType.Alias; DefaultTemplate = contentType.DefaultTemplate; - Variations = contentType.Variations; - Icon = contentType.Icon; - IsContainer = contentType.IsContainer; - Icon = contentType.Icon; - Name = contentType.Name; - AllowedAsRoot = contentType.AllowedAsRoot; - IsElement = contentType.IsElement; } /// /// Initializes a new instance of the class. /// public SimpleContentType(IMediaType mediaType) - { - if (mediaType == null) throw new ArgumentNullException(nameof(mediaType)); - - Id = mediaType.Id; - Alias = mediaType.Alias; - Variations = mediaType.Variations; - Icon = mediaType.Icon; - IsContainer = mediaType.IsContainer; - Icon = mediaType.Icon; - Name = mediaType.Name; - AllowedAsRoot = mediaType.AllowedAsRoot; - IsElement = mediaType.IsElement; - } + : this((IContentTypeBase)mediaType) + { } /// /// Initializes a new instance of the class. /// public SimpleContentType(IMemberType memberType) - { - if (memberType == null) throw new ArgumentNullException(nameof(memberType)); + : this((IContentTypeBase)memberType) + { } - Id = memberType.Id; - Alias = memberType.Alias; - Variations = memberType.Variations; - Icon = memberType.Icon; - IsContainer = memberType.IsContainer; - Icon = memberType.Icon; - Name = memberType.Name; - AllowedAsRoot = memberType.AllowedAsRoot; - IsElement = memberType.IsElement; + private SimpleContentType(IContentTypeBase contentType) + { + if (contentType == null) throw new ArgumentNullException(nameof(contentType)); + + _id = contentType.Id; + Alias = contentType.Alias; + Variations = contentType.Variations; + Icon = contentType.Icon; + IsContainer = contentType.IsContainer; + Icon = contentType.Icon; + _name = contentType.Name; + AllowedAsRoot = contentType.AllowedAsRoot; + IsElement = contentType.IsElement; } /// public string Alias { get; } /// - public int Id { get; } + public int Id + { + get => _id; + set => throw new NotSupportedException(); + } /// public ITemplate DefaultTemplate { get; } @@ -82,7 +73,11 @@ namespace Umbraco.Core.Models public bool IsContainer { get; } /// - public string Name { get; } + public string Name + { + get => _name; + set => throw new NotSupportedException(); + } /// public bool AllowedAsRoot { get; } @@ -121,5 +116,34 @@ namespace Umbraco.Core.Models return ((Alias != null ? Alias.GetHashCode() : 0) * 397) ^ Id; } } + + // we have to have all this, because we're an IUmbracoEntity, because that is + // required by the query expression visitor / SimpleContentTypeMapper + + public object DeepClone() => throw new NotImplementedException(); + + public Guid Key { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public DateTime CreateDate { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public DateTime UpdateDate { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public DateTime? DeleteDate { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public bool HasIdentity => throw new NotImplementedException(); + + public int CreatorId { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public int ParentId { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public void SetParent(ITreeEntity parent) => throw new NotImplementedException(); + + public int Level { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public string Path { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public int SortOrder { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public bool Trashed => throw new NotImplementedException(); + public bool IsDirty() => throw new NotImplementedException(); + public bool IsPropertyDirty(string propName) => throw new NotImplementedException(); + public IEnumerable GetDirtyProperties() => throw new NotImplementedException(); + public void ResetDirtyProperties() => throw new NotImplementedException(); + public bool WasDirty() => throw new NotImplementedException(); + public bool WasPropertyDirty(string propertyName) => throw new NotImplementedException(); + public void ResetWereDirtyProperties() => throw new NotImplementedException(); + public void ResetDirtyProperties(bool rememberDirty) => throw new NotImplementedException(); + public IEnumerable GetWereDirtyProperties() => throw new NotImplementedException(); } } diff --git a/src/Umbraco.Core/Persistence/Mappers/MapperCollectionBuilder.cs b/src/Umbraco.Core/Persistence/Mappers/MapperCollectionBuilder.cs index 80819933f5..e20f7c1911 100644 --- a/src/Umbraco.Core/Persistence/Mappers/MapperCollectionBuilder.cs +++ b/src/Umbraco.Core/Persistence/Mappers/MapperCollectionBuilder.cs @@ -25,6 +25,7 @@ namespace Umbraco.Core.Persistence.Mappers Add(); Add(); Add(); + Add(); Add(); Add(); Add(); diff --git a/src/Umbraco.Core/Persistence/Mappers/SimpleContentTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/SimpleContentTypeMapper.cs new file mode 100644 index 0000000000..3ad975defb --- /dev/null +++ b/src/Umbraco.Core/Persistence/Mappers/SimpleContentTypeMapper.cs @@ -0,0 +1,38 @@ +using System.Collections.Concurrent; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Dtos; + +namespace Umbraco.Core.Persistence.Mappers +{ + [MapperFor(typeof(ISimpleContentType))] + [MapperFor(typeof(SimpleContentType))] + public sealed class SimpleContentTypeMapper : BaseMapper + { + private static readonly ConcurrentDictionary PropertyInfoCacheInstance = new ConcurrentDictionary(); + + internal override ConcurrentDictionary PropertyInfoCache => PropertyInfoCacheInstance; + + protected override void BuildMap() + { + if (PropertyInfoCache.IsEmpty == false) return; + + CacheMap(src => src.Id, dto => dto.NodeId); + CacheMap(src => src.CreateDate, dto => dto.CreateDate); + CacheMap(src => src.Level, dto => dto.Level); + CacheMap(src => src.ParentId, dto => dto.ParentId); + CacheMap(src => src.Path, dto => dto.Path); + CacheMap(src => src.SortOrder, dto => dto.SortOrder); + CacheMap(src => src.Name, dto => dto.Text); + CacheMap(src => src.Trashed, dto => dto.Trashed); + CacheMap(src => src.Key, dto => dto.UniqueId); + CacheMap(src => src.CreatorId, dto => dto.UserId); + CacheMap(src => src.Alias, dto => dto.Alias); + CacheMap(src => src.AllowedAsRoot, dto => dto.AllowAtRoot); + CacheMap(src => src.Description, dto => dto.Description); + CacheMap(src => src.Icon, dto => dto.Icon); + CacheMap(src => src.IsContainer, dto => dto.IsContainer); + CacheMap(src => src.IsElement, dto => dto.IsElement); + CacheMap(src => src.Thumbnail, dto => dto.Thumbnail); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index d4b26cbbc0..eda02148fe 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -467,6 +467,7 @@ + diff --git a/src/Umbraco.Tests/Composing/TypeLoaderTests.cs b/src/Umbraco.Tests/Composing/TypeLoaderTests.cs index 2354dc8147..2dbd3055cb 100644 --- a/src/Umbraco.Tests/Composing/TypeLoaderTests.cs +++ b/src/Umbraco.Tests/Composing/TypeLoaderTests.cs @@ -264,7 +264,7 @@ AnotherContentFinder public void Resolves_Assigned_Mappers() { var foundTypes1 = _typeLoader.GetAssignedMapperTypes(); - Assert.AreEqual(29, foundTypes1.Count()); + Assert.AreEqual(30, foundTypes1.Count()); } [Test] diff --git a/src/Umbraco.Tests/Models/ContentExtensionsTests.cs b/src/Umbraco.Tests/Models/ContentExtensionsTests.cs index 5c95f1ead5..efa464a46c 100644 --- a/src/Umbraco.Tests/Models/ContentExtensionsTests.cs +++ b/src/Umbraco.Tests/Models/ContentExtensionsTests.cs @@ -1,22 +1,60 @@ using System; using System.Linq; +using Moq; using NUnit.Framework; using Umbraco.Core; +using Umbraco.Core.Composing; +using Umbraco.Core.Composing.Composers; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; +using Umbraco.Core.Services.Implement; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Tests.Testing; +using Umbraco.Web.PropertyEditors; namespace Umbraco.Tests.Models { [TestFixture] public class ContentExtensionsTests : UmbracoTestBase { - #region Others + private IContentTypeService _contentTypeService; + + protected override void Compose() + { + base.Compose(); + + Composition.Register(_ => Mock.Of()); + Composition.ComposeFileSystems(); + + Composition.Register(_ => Mock.Of()); + Composition.Register(_ => Mock.Of()); + + // all this is required so we can validate properties... + var editor = new TextboxPropertyEditor(Mock.Of()) { Alias = "test" }; + Composition.Register(_ => new DataEditorCollection(new[] { editor })); + Composition.Register(); + var dataType = Mock.Of(); + Mock.Get(dataType).Setup(x => x.Configuration).Returns(() => new object()); + var dataTypeService = Mock.Of(); + Mock.Get(dataTypeService) + .Setup(x => x.GetDataType(It.IsAny())) + .Returns(() => dataType); + + _contentTypeService = Mock.Of(); + var mediaTypeService = Mock.Of(); + var memberTypeService = Mock.Of(); + Composition.Register(_ => ServiceContext.CreatePartial(dataTypeService: dataTypeService, contentTypeBaseServiceProvider: new ContentTypeBaseServiceProvider(_contentTypeService, mediaTypeService, memberTypeService))); + } [Test] public void DirtyProperty_Reset_Clears_SavedPublishedState() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); content.PublishedState = PublishedState.Publishing; @@ -30,6 +68,8 @@ namespace Umbraco.Tests.Models public void DirtyProperty_OnlyIfActuallyChanged_Content() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // if you assign a content property with its value it is not dirty @@ -52,6 +92,8 @@ namespace Umbraco.Tests.Models public void DirtyProperty_OnlyIfActuallyChanged_User() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); var prop = content.Properties.First(); @@ -76,6 +118,8 @@ namespace Umbraco.Tests.Models public void DirtyProperty_UpdateDate() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); var prop = content.Properties.First(); @@ -99,6 +143,8 @@ namespace Umbraco.Tests.Models public void DirtyProperty_WasDirty_ContentProperty() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); content.ResetDirtyProperties(false); Assert.IsFalse(content.IsDirty()); @@ -126,6 +172,8 @@ namespace Umbraco.Tests.Models public void DirtyProperty_WasDirty_ContentSortOrder() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); content.ResetDirtyProperties(false); Assert.IsFalse(content.IsDirty()); @@ -153,6 +201,8 @@ namespace Umbraco.Tests.Models public void DirtyProperty_WasDirty_UserProperty() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); var prop = content.Properties.First(); content.ResetDirtyProperties(false); @@ -178,7 +228,5 @@ namespace Umbraco.Tests.Models //Assert.IsFalse(content.WasDirty()); // not impacted by user properties Assert.IsTrue(content.WasDirty()); // now it is! } - - #endregion } } diff --git a/src/Umbraco.Tests/Models/ContentTests.cs b/src/Umbraco.Tests/Models/ContentTests.cs index 844a609878..ad49fb226b 100644 --- a/src/Umbraco.Tests/Models/ContentTests.cs +++ b/src/Umbraco.Tests/Models/ContentTests.cs @@ -17,6 +17,7 @@ using Umbraco.Core.Models.Entities; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Serialization; using Umbraco.Core.Services; +using Umbraco.Core.Services.Implement; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Tests.TestHelpers.Stubs; using Umbraco.Tests.Testing; @@ -28,6 +29,8 @@ namespace Umbraco.Tests.Models [TestFixture] public class ContentTests : UmbracoTestBase { + private IContentTypeService _contentTypeService; + protected override void Compose() { base.Compose(); @@ -48,19 +51,24 @@ namespace Umbraco.Tests.Models Mock.Get(dataTypeService) .Setup(x => x.GetDataType(It.IsAny())) .Returns(() => dataType); - Composition.Register(_ => ServiceContext.CreatePartial(dataTypeService: dataTypeService)); + + _contentTypeService = Mock.Of(); + var mediaTypeService = Mock.Of(); + var memberTypeService = Mock.Of(); + Composition.Register(_ => ServiceContext.CreatePartial(dataTypeService: dataTypeService, contentTypeBaseServiceProvider: new ContentTypeBaseServiceProvider(_contentTypeService, mediaTypeService, memberTypeService))); } [Test] public void Variant_Culture_Names_Track_Dirty_Changes() { var contentType = new ContentType(-1) { Alias = "contentType" }; + contentType.Variations = ContentVariation.Culture; + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = new Content("content", -1, contentType) { Id = 1, VersionId = 1 }; const string langFr = "fr-FR"; - contentType.Variations = ContentVariation.Culture; - Assert.IsFalse(content.IsPropertyDirty("CultureInfos")); //hasn't been changed Thread.Sleep(500); //The "Date" wont be dirty if the test runs too fast since it will be the same date @@ -123,6 +131,7 @@ namespace Umbraco.Tests.Models //ensure that nothing is marked as dirty contentType.ResetDirtyProperties(false); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); var content = MockedContent.CreateSimpleContent(contentType); @@ -138,6 +147,8 @@ namespace Umbraco.Tests.Models public void All_Dirty_Properties_Get_Reset() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); content.ResetDirtyProperties(false); @@ -154,6 +165,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -167,6 +180,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -183,6 +198,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -199,6 +216,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); content.Id = 10; content.Key = new Guid("29181B97-CB8F-403F-86DE-5FEB497F4800"); @@ -278,6 +297,8 @@ namespace Umbraco.Tests.Models var contentType = MockedContentTypes.CreateTextPageContentType(); contentType.Id = 99; contentType.Variations = ContentVariation.Culture; + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); content.SetCultureName("Hello", "en-US"); @@ -387,6 +408,8 @@ namespace Umbraco.Tests.Models var contentType = MockedContentTypes.CreateTextPageContentType(); contentType.Id = 99; contentType.Variations = ContentVariation.Culture; + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); content.SetCultureName("Hello", "en-US"); @@ -458,6 +481,8 @@ namespace Umbraco.Tests.Models // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); contentType.Id = 99; + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); var i = 200; foreach (var property in content.Properties) @@ -509,6 +534,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -527,6 +554,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -591,6 +620,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -613,6 +644,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -642,6 +675,8 @@ namespace Umbraco.Tests.Models { // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act - note that the PropertyType's properties like SortOrder is not updated through the Content object @@ -663,6 +698,8 @@ namespace Umbraco.Tests.Models // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); var simpleContentType = MockedContentTypes.CreateSimpleContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -680,6 +717,8 @@ namespace Umbraco.Tests.Models // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); var simpleContentType = MockedContentTypes.CreateSimpleContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -697,6 +736,8 @@ namespace Umbraco.Tests.Models // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); var simpleContentType = MockedContentTypes.CreateSimpleContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -716,6 +757,8 @@ namespace Umbraco.Tests.Models // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); var simpleContentType = MockedContentTypes.CreateSimpleContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); // Act @@ -731,6 +774,8 @@ namespace Umbraco.Tests.Models public void Can_Verify_Content_Is_Published() { var contentType = MockedContentTypes.CreateTextPageContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "Textpage", -1); content.ResetDirtyProperties(); @@ -800,6 +845,8 @@ namespace Umbraco.Tests.Models // Arrange var contentType = MockedContentTypes.CreateTextPageContentType(); contentType.ResetDirtyProperties(); //reset + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateTextpageContent(contentType, "test", -1); content.ResetDirtyProperties(); diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index e3551921d8..1817414f69 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -4,15 +4,20 @@ using AutoMapper; using Moq; using NUnit.Framework; using Umbraco.Core; +using Umbraco.Core.Composing; +using Umbraco.Core.Composing.Composers; +using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Services; using Umbraco.Core.Dictionary; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services.Implement; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Web.Models.ContentEditing; using Umbraco.Tests.Testing; +using Umbraco.Web.PropertyEditors; using Current = Umbraco.Web.Composing.Current; namespace Umbraco.Tests.Models.Mapping @@ -21,12 +26,37 @@ namespace Umbraco.Tests.Models.Mapping [UmbracoTest(AutoMapper = true, Database = UmbracoTestOptions.Database.NewSchemaPerFixture)] public class ContentWebModelMappingTests : TestWithDatabaseBase { + private IContentTypeService _contentTypeService; + + protected override void Compose() { base.Compose(); Composition.RegisterUnique(f => Mock.Of()); - Composition.RegisterUnique(f => Mock.Of()); + + Composition.Register(_ => Mock.Of()); + Composition.ComposeFileSystems(); + + Composition.Register(_ => Mock.Of()); + Composition.Register(_ => Mock.Of()); + + // all this is required so we can validate properties... + var editor = new TextboxPropertyEditor(Mock.Of()) { Alias = "test" }; + Composition.Register(_ => new DataEditorCollection(new[] { editor })); + Composition.Register(); + var dataType = Mock.Of(); + Mock.Get(dataType).Setup(x => x.Configuration).Returns(() => new object()); + var dataTypeService = Mock.Of(); + Mock.Get(dataTypeService) + .Setup(x => x.GetDataType(It.IsAny())) + .Returns(() => dataType); + + _contentTypeService = Mock.Of(); + var mediaTypeService = Mock.Of(); + var memberTypeService = Mock.Of(); + Composition.RegisterUnique(_ => _contentTypeService); + Composition.Register(_ => ServiceContext.CreatePartial(dataTypeService: dataTypeService, contentTypeBaseServiceProvider: new ContentTypeBaseServiceProvider(_contentTypeService, mediaTypeService, memberTypeService))); } [DataEditor("Test.Test", "Test", "~/Test.html")] @@ -53,6 +83,8 @@ namespace Umbraco.Tests.Models.Mapping public void To_Media_Item_Simple() { var contentType = MockedContentTypes.CreateImageMediaType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedMedia.CreateMediaImage(contentType, -1); FixUsers(content); @@ -70,6 +102,8 @@ namespace Umbraco.Tests.Models.Mapping public void To_Content_Item_Simple() { var contentType = MockedContentTypes.CreateSimpleContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateSimpleContent(contentType); FixUsers(content); @@ -87,6 +121,8 @@ namespace Umbraco.Tests.Models.Mapping public void To_Content_Item_Dto() { var contentType = MockedContentTypes.CreateSimpleContentType(); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + var content = MockedContent.CreateSimpleContent(contentType); FixUsers(content); @@ -117,8 +153,8 @@ namespace Umbraco.Tests.Models.Mapping public void To_Display_Model() { var contentType = MockedContentTypes.CreateSimpleContentType(); - var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService); - contentTypeServiceMock.Setup(x => x.Get(contentType.Id)).Returns(() => contentType); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + Mock.Get(_contentTypeService).Setup(x => x.Get(It.IsAny())).Returns(contentType); var content = MockedContent.CreateSimpleContent(contentType); @@ -127,7 +163,7 @@ namespace Umbraco.Tests.Models.Mapping // need ids for tabs var id = 1; - foreach (var g in content.PropertyGroups) + foreach (var g in contentType.CompositionPropertyGroups) g.Id = id++; var result = Mapper.Map(content); @@ -141,7 +177,7 @@ namespace Umbraco.Tests.Models.Mapping AssertDisplayProperty(invariantContent, p); } - Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count()); + Assert.AreEqual(contentType.CompositionPropertyGroups.Count(), invariantContent.Tabs.Count()); Assert.IsTrue(invariantContent.Tabs.First().IsActive); Assert.IsTrue(invariantContent.Tabs.Except(new[] { invariantContent.Tabs.First() }).All(x => x.IsActive == false)); } @@ -151,9 +187,8 @@ namespace Umbraco.Tests.Models.Mapping { var contentType = MockedContentTypes.CreateSimpleContentType(); contentType.PropertyGroups.Clear(); - var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService); - contentTypeServiceMock.Setup(x => x.Get(contentType.Id)).Returns(() => contentType); - + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + Mock.Get(_contentTypeService).Setup(x => x.Get(It.IsAny())).Returns(contentType); var content = new Content("Home", -1, contentType) { Level = 1, SortOrder = 1, CreatorId = 0, WriterId = 0 }; @@ -168,7 +203,7 @@ namespace Umbraco.Tests.Models.Mapping AssertDisplayProperty(invariantContent, p); } - Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count()); + Assert.AreEqual(contentType.CompositionPropertyGroups.Count(), invariantContent.Tabs.Count()); } [Test] @@ -186,8 +221,8 @@ namespace Umbraco.Tests.Models.Mapping p.Id = idSeed; idSeed++; } - var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService); - contentTypeServiceMock.Setup(x => x.Get(contentType.Id)).Returns(() => contentType); + Mock.Get(_contentTypeService).As().Setup(x => x.Get(It.IsAny())).Returns(contentType); + Mock.Get(_contentTypeService).Setup(x => x.Get(It.IsAny())).Returns(contentType); var content = MockedContent.CreateSimpleContent(contentType); @@ -200,7 +235,7 @@ namespace Umbraco.Tests.Models.Mapping } //need ids for tabs var id = 1; - foreach (var g in content.PropertyGroups) + foreach (var g in contentType.CompositionPropertyGroups) { g.Id = id; id++; @@ -221,7 +256,7 @@ namespace Umbraco.Tests.Models.Mapping AssertDisplayProperty(invariantContent, p); } - Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count() - 1); + Assert.AreEqual(contentType.CompositionPropertyGroups.Count(), invariantContent.Tabs.Count() - 1); Assert.IsTrue(invariantContent.Tabs.Any(x => x.Label == Current.Services.TextService.Localize("general/properties"))); Assert.AreEqual(2, invariantContent.Tabs.Where(x => x.Label == Current.Services.TextService.Localize("general/properties")).SelectMany(x => x.Properties.Where(p => p.Alias.StartsWith("_umb_") == false)).Count()); } diff --git a/src/Umbraco.Tests/Models/MemberTests.cs b/src/Umbraco.Tests/Models/MemberTests.cs index c09f2e9460..5e92ad7ccf 100644 --- a/src/Umbraco.Tests/Models/MemberTests.cs +++ b/src/Umbraco.Tests/Models/MemberTests.cs @@ -67,20 +67,7 @@ namespace Umbraco.Tests.Models Assert.AreEqual(clone.Id, member.Id); Assert.AreEqual(clone.VersionId, member.VersionId); Assert.AreEqual(clone.AdditionalData, member.AdditionalData); - Assert.AreNotSame(clone.ContentType, member.ContentType); Assert.AreEqual(clone.ContentType, member.ContentType); - Assert.AreEqual(clone.ContentType.PropertyGroups.Count, member.ContentType.PropertyGroups.Count); - for (var index = 0; index < member.ContentType.PropertyGroups.Count; index++) - { - Assert.AreNotSame(clone.ContentType.PropertyGroups[index], member.ContentType.PropertyGroups[index]); - Assert.AreEqual(clone.ContentType.PropertyGroups[index], member.ContentType.PropertyGroups[index]); - } - Assert.AreEqual(clone.ContentType.PropertyTypes.Count(), member.ContentType.PropertyTypes.Count()); - for (var index = 0; index < member.ContentType.PropertyTypes.Count(); index++) - { - Assert.AreNotSame(clone.ContentType.PropertyTypes.ElementAt(index), member.ContentType.PropertyTypes.ElementAt(index)); - Assert.AreEqual(clone.ContentType.PropertyTypes.ElementAt(index), member.ContentType.PropertyTypes.ElementAt(index)); - } Assert.AreEqual(clone.ContentTypeId, member.ContentTypeId); Assert.AreEqual(clone.CreateDate, member.CreateDate); Assert.AreEqual(clone.CreatorId, member.CreatorId); @@ -112,6 +99,9 @@ namespace Umbraco.Tests.Models Assert.AreEqual(clone.Properties[index], member.Properties[index]); } + // this can be the same, it is immutable + Assert.AreSame(clone.ContentType, member.ContentType); + //This double verifies by reflection var allProps = clone.GetType().GetProperties(); foreach (var propertyInfo in allProps) diff --git a/src/Umbraco.Tests/Models/VariationTests.cs b/src/Umbraco.Tests/Models/VariationTests.cs index 0ccdabe928..36fb399fa7 100644 --- a/src/Umbraco.Tests/Models/VariationTests.cs +++ b/src/Umbraco.Tests/Models/VariationTests.cs @@ -227,6 +227,9 @@ namespace Umbraco.Tests.Models // now it will work contentType.Variations = ContentVariation.Culture; + // recreate content to re-capture content type variations + content = new Content("content", -1, contentType) { Id = 1, VersionId = 1 }; + // invariant name works content.Name = "name"; Assert.AreEqual("name", content.GetCultureName(null)); diff --git a/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs index 459dbeb587..2c4f3f1908 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/DocumentRepositoryTest.cs @@ -130,10 +130,11 @@ namespace Umbraco.Tests.Persistence.Repositories var hasPropertiesContentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage"); ServiceContext.FileService.SaveTemplate(hasPropertiesContentType.DefaultTemplate); // else, FK violation on contentType! + contentTypeRepository.Save(hasPropertiesContentType); + IContent content1 = MockedContent.CreateSimpleContent(hasPropertiesContentType); // save = create the initial version - contentTypeRepository.Save(hasPropertiesContentType); repository.Save(content1); versions.Add(content1.VersionId); // the first version @@ -399,9 +400,10 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository((IScopeAccessor)provider, out var contentTypeRepository); var contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage2", "Textpage"); ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate); // else, FK violation on contentType! + contentTypeRepository.Save(contentType); + IContent textpage = MockedContent.CreateSimpleContent(contentType); - contentTypeRepository.Save(contentType); repository.Save(textpage); scope.Complete(); @@ -487,9 +489,10 @@ namespace Umbraco.Tests.Persistence.Repositories var repository = CreateRepository((IScopeAccessor)provider, out var contentTypeRepository); var contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage1", "Textpage"); ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate); // else, FK violation on contentType! + contentTypeRepository.Save(contentType); + var textpage = MockedContent.CreateSimpleContent(contentType); - contentTypeRepository.Save(contentType); repository.Save(textpage); diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index cbd591950a..1c1b5e60f4 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -61,8 +61,9 @@ namespace Umbraco.Tests.Persistence.Repositories udb.EnableSqlCount = false; var mediaType = MockedContentTypes.CreateSimpleMediaType("umbTextpage1", "Textpage"); - var media = MockedMedia.CreateSimpleMedia(mediaType, "hello", -1); mediaTypeRepository.Save(mediaType); + + var media = MockedMedia.CreateSimpleMedia(mediaType, "hello", -1); repository.Save(media); udb.EnableSqlCount = true; @@ -271,7 +272,7 @@ namespace Umbraco.Tests.Persistence.Repositories var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1); repository.Save(folder); } - + var types = new[] { 1031 }; var query = scope.SqlContext.Query().Where(x => types.Contains(x.ContentTypeId)); @@ -302,7 +303,7 @@ namespace Umbraco.Tests.Persistence.Repositories var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1); repository.Save(folder); } - + var types = new[] { "Folder" }; var query = scope.SqlContext.Query().Where(x => types.Contains(x.ContentType.Alias)); diff --git a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs index dea15cd4ad..c46a090685 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MemberRepositoryTest.cs @@ -164,21 +164,19 @@ namespace Umbraco.Tests.Persistence.Repositories var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.Save(memberType); - var member = MockedMember.CreateSimpleMember(memberType, "Johnny Hefty", "johnny@example.com", "123", "hefty"); repository.Save(member); - var sut = repository.Get(member.Id); - Assert.That(sut.ContentType.PropertyGroups.Count(), Is.EqualTo(2)); - Assert.That(sut.ContentType.PropertyTypes.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count)); + Assert.That(memberType.CompositionPropertyGroups.Count(), Is.EqualTo(2)); + Assert.That(memberType.CompositionPropertyTypes.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count)); Assert.That(sut.Properties.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count)); - var grp = sut.PropertyGroups.FirstOrDefault(x => x.Name == Constants.Conventions.Member.StandardPropertiesGroupName); + var grp = memberType.CompositionPropertyGroups.FirstOrDefault(x => x.Name == Constants.Conventions.Member.StandardPropertiesGroupName); Assert.IsNotNull(grp); var aliases = Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray(); - foreach (var p in sut.PropertyTypes.Where(x => aliases.Contains(x.Alias))) + foreach (var p in memberType.CompositionPropertyTypes.Where(x => aliases.Contains(x.Alias))) { Assert.AreEqual(grp.Id, p.PropertyGroupId.Value); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs index 8f750f9238..1d50fcac9e 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/UserRepositoryTest.cs @@ -75,7 +75,7 @@ namespace Umbraco.Tests.Persistence.Repositories // Act repository.Save(user); - + // Assert Assert.That(user.HasIdentity, Is.True); @@ -96,9 +96,9 @@ namespace Umbraco.Tests.Persistence.Repositories // Act repository.Save(user1); - + repository.Save(use2); - + // Assert Assert.That(user1.HasIdentity, Is.True); @@ -117,7 +117,7 @@ namespace Umbraco.Tests.Persistence.Repositories var user = MockedUser.CreateUser(); repository.Save(user); - + // Act var resolved = repository.Get((int)user.Id); @@ -132,9 +132,7 @@ namespace Umbraco.Tests.Persistence.Repositories public void Can_Perform_Update_On_UserRepository() { var ct = MockedContentTypes.CreateBasicContentType("test"); - var content = MockedContent.CreateBasicContent(ct); var mt = MockedContentTypes.CreateSimpleMediaType("testmedia", "TestMedia"); - var media = MockedMedia.CreateSimpleMedia(mt, "asdf", -1); // Arrange var provider = TestObjects.GetScopeProvider(Logger); @@ -147,11 +145,12 @@ namespace Umbraco.Tests.Persistence.Repositories contentTypeRepo.Save(ct); mediaTypeRepo.Save(mt); - + + var content = MockedContent.CreateBasicContent(ct); + var media = MockedMedia.CreateSimpleMedia(mt, "asdf", -1); contentRepository.Save(content); mediaRepository.Save(media); - var user = CreateAndCommitUserWithGroup(userRepository, userGroupRepository); @@ -171,7 +170,7 @@ namespace Umbraco.Tests.Persistence.Repositories resolved.Username = "newName"; userRepository.Save(resolved); - + var updatedItem = (User) userRepository.Get(user.Id); // Assert @@ -204,13 +203,13 @@ namespace Umbraco.Tests.Persistence.Repositories // Act repository.Save(user); - + var id = user.Id; var repository2 = new UserRepository((IScopeAccessor) provider, AppCaches.Disabled, Logger, Mock.Of(),TestObjects.GetGlobalSettings()); repository2.Delete(user); - + var resolved = repository2.Get((int) id); @@ -373,7 +372,7 @@ namespace Umbraco.Tests.Persistence.Repositories scope.Database.AsUmbracoDatabase().EnableSqlCount = false; } } - + } [Test] @@ -429,7 +428,7 @@ namespace Umbraco.Tests.Persistence.Repositories { var user = MockedUser.CreateUser(); repository.Save(user); - + var group = MockedUserGroup.CreateUserGroup(); userGroupRepository.AddOrUpdateGroupWithUsers(@group, new[] { user.Id }); diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs index 1319d00c48..7a7aad6905 100644 --- a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs @@ -554,7 +554,6 @@ namespace Umbraco.Tests.Services IContent contentItem = MockedContent.CreateTextpageContent(contentType1, "Testing", -1); ServiceContext.ContentService.SaveAndPublish(contentItem); var initProps = contentItem.Properties.Count; - var initPropTypes = contentItem.PropertyTypes.Count(); //remove a property contentType1.RemovePropertyType(contentType1.PropertyTypes.First().Alias); @@ -563,7 +562,6 @@ namespace Umbraco.Tests.Services //re-load it from the db contentItem = ServiceContext.ContentService.GetById(contentItem.Id); - Assert.AreEqual(initPropTypes - 1, contentItem.PropertyTypes.Count()); Assert.AreEqual(initProps - 1, contentItem.Properties.Count); } diff --git a/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs b/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs index 459daa3da6..5f4a87c3eb 100644 --- a/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberTypeServiceTests.cs @@ -83,7 +83,6 @@ namespace Umbraco.Tests.Services IMember member = MockedMember.CreateSimpleMember(memberType, "test", "test@test.com", "pass", "test"); ServiceContext.MemberService.Save(member); var initProps = member.Properties.Count; - var initPropTypes = member.PropertyTypes.Count(); //remove a property (NOT ONE OF THE DEFAULTS) var standardProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); @@ -93,7 +92,6 @@ namespace Umbraco.Tests.Services //re-load it from the db member = ServiceContext.MemberService.GetById(member.Id); - Assert.AreEqual(initPropTypes - 1, member.PropertyTypes.Count()); Assert.AreEqual(initProps - 1, member.Properties.Count); } diff --git a/src/Umbraco.Tests/Testing/ContentBaseExtensions.cs b/src/Umbraco.Tests/Testing/ContentBaseExtensions.cs index 58d4dfbd7f..85ecf03dee 100644 --- a/src/Umbraco.Tests/Testing/ContentBaseExtensions.cs +++ b/src/Umbraco.Tests/Testing/ContentBaseExtensions.cs @@ -1,5 +1,7 @@ using System; using System.Linq; +using Umbraco.Core; +using Umbraco.Core.Composing; using Umbraco.Core.Models; namespace Umbraco.Tests.Testing @@ -7,7 +9,7 @@ namespace Umbraco.Tests.Testing public static class ContentBaseExtensions { /// - /// Set property values by alias with an annonymous object. + /// Set property values by alias with an anonymous object. /// /// Does not support variants. public static void PropertyValues(this IContentBase content, object value, string culture = null, string segment = null) @@ -15,11 +17,13 @@ namespace Umbraco.Tests.Testing if (value == null) throw new Exception("No properties has been passed in"); + var contentType = Current.Services.ContentTypeBaseServices.GetContentTypeOf(content); + var propertyInfos = value.GetType().GetProperties(); foreach (var propertyInfo in propertyInfos) { //Check if a PropertyType with alias exists thus being a valid property - var propertyType = content.PropertyTypes.FirstOrDefault(x => x.Alias == propertyInfo.Name); + 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"); diff --git a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs index 6fe921e13f..f7b1799d63 100644 --- a/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs +++ b/src/Umbraco.Tests/UmbracoExamine/IndexInitializer.cs @@ -110,7 +110,7 @@ namespace Umbraco.Tests.UmbracoExamine m.GetCultureName(It.IsAny()) == (string)x.Attribute("nodeName") && m.Path == (string)x.Attribute("path") && m.Properties == new PropertyCollection() && - m.ContentType == Mock.Of(mt => + m.ContentType == Mock.Of(mt => mt.Alias == (string)x.Attribute("nodeTypeAlias") && mt.Id == (int)x.Attribute("nodeType")))) .ToArray(); diff --git a/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs index 37600e2f89..d0c09d3340 100644 --- a/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/ContentControllerTests.cs @@ -43,6 +43,14 @@ namespace Umbraco.Tests.Web.Controllers [UmbracoTest(Database = UmbracoTestOptions.Database.None)] public class ContentControllerTests : TestWithDatabaseBase { + private IContentType _contentTypeForMockedContent; + + public override void SetUp() + { + base.SetUp(); + _contentTypeForMockedContent = null; + } + protected override void ComposeApplication(bool withApplication) { base.ComposeApplication(withApplication); @@ -115,23 +123,42 @@ namespace Umbraco.Tests.Web.Controllers }; } - private IContent GetMockedContent() + private IContentType GetMockedContentType() { - var content = MockedContent.CreateSimpleContent(MockedContentTypes.CreateSimpleContentType()); - content.Id = 123; - content.Path = "-1,123"; + var contentType = MockedContentTypes.CreateSimpleContentType(); //ensure things have ids var ids = 888; - foreach (var g in content.PropertyGroups) + foreach (var g in contentType.CompositionPropertyGroups) { g.Id = ids; ids++; } - foreach (var p in content.PropertyTypes) + foreach (var p in contentType.CompositionPropertyGroups) { p.Id = ids; ids++; } + + return contentType; + } + + private IContent GetMockedContent() + { + if (_contentTypeForMockedContent == null) + { + _contentTypeForMockedContent = GetMockedContentType(); + Mock.Get(Current.Services.ContentTypeService) + .Setup(x => x.Get(_contentTypeForMockedContent.Id)) + .Returns(_contentTypeForMockedContent); + Mock.Get(Current.Services.ContentTypeService) + .As() + .Setup(x => x.Get(_contentTypeForMockedContent.Id)) + .Returns(_contentTypeForMockedContent); + } + + var content = MockedContent.CreateSimpleContent(_contentTypeForMockedContent); + content.Id = 123; + content.Path = "-1,123"; return content; } @@ -229,7 +256,7 @@ namespace Umbraco.Tests.Web.Controllers Factory.GetInstance(), Factory.GetInstance(), helper); - + return controller; } @@ -251,9 +278,6 @@ namespace Umbraco.Tests.Web.Controllers { ApiController CtrlFactory(HttpRequestMessage message, UmbracoContext umbracoContext, UmbracoHelper helper) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); - contentServiceMock.Setup(x => x.GetById(123)).Returns(() => GetMockedContent()); - var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())); var controller = new ContentController( propertyEditorCollection, @@ -336,15 +360,11 @@ namespace Umbraco.Tests.Web.Controllers ApiController CtrlFactory(HttpRequestMessage message, UmbracoContext umbracoContext, UmbracoHelper helper) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content); contentServiceMock.Setup(x => x.Save(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success - var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService); - contentTypeServiceMock.Setup(x => x.Get(content.ContentTypeId)).Returns(() => MockedContentTypes.CreateSimpleContentType()); - var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())); var controller = new ContentController( propertyEditorCollection, @@ -369,8 +389,6 @@ namespace Umbraco.Tests.Web.Controllers Assert.AreEqual(HttpStatusCode.OK, response.Item1.StatusCode); var display = JsonConvert.DeserializeObject(response.Item2); Assert.AreEqual(1, display.Variants.Count()); - Assert.AreEqual(content.PropertyGroups.Count(), display.Variants.ElementAt(0).Tabs.Count()); - Assert.AreEqual(content.PropertyTypes.Count(), display.Variants.ElementAt(0).Tabs.ElementAt(0).Properties.Count()); } [Test] @@ -380,15 +398,11 @@ namespace Umbraco.Tests.Web.Controllers ApiController CtrlFactory(HttpRequestMessage message, UmbracoContext umbracoContext, UmbracoHelper helper) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content); contentServiceMock.Setup(x => x.Save(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success - var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService); - contentTypeServiceMock.Setup(x => x.Get(content.ContentTypeId)).Returns(() => MockedContentTypes.CreateSimpleContentType()); - var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())); var controller = new ContentController( propertyEditorCollection, @@ -428,15 +442,11 @@ namespace Umbraco.Tests.Web.Controllers ApiController CtrlFactory(HttpRequestMessage message, UmbracoContext umbracoContext, UmbracoHelper helper) { - var contentServiceMock = Mock.Get(Current.Services.ContentService); contentServiceMock.Setup(x => x.GetById(123)).Returns(() => content); contentServiceMock.Setup(x => x.Save(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(new OperationResult(OperationResultType.Success, new Core.Events.EventMessages())); //success - var contentTypeServiceMock = Mock.Get(Current.Services.ContentTypeService); - contentTypeServiceMock.Setup(x => x.Get(content.ContentTypeId)).Returns(() => MockedContentTypes.CreateSimpleContentType()); - var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty())); var controller = new ContentController( propertyEditorCollection,