diff --git a/src/Umbraco.Core/Models/RelationType.cs b/src/Umbraco.Core/Models/RelationType.cs index 28290685c2..4c676feed6 100644 --- a/src/Umbraco.Core/Models/RelationType.cs +++ b/src/Umbraco.Core/Models/RelationType.cs @@ -31,8 +31,6 @@ namespace Umbraco.Core.Models _childObjectType = childObjectType; } - - /// /// Gets or sets the Name of the RelationType /// diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index 432033d966..a3f8953ac3 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -76,6 +76,9 @@ <_Parameter1>Umbraco.Tests.Integration + + <_Parameter1>Umbraco.Tests.Common + diff --git a/src/Umbraco.Tests.Common/Builders/Extensions/BuilderExtensions.cs b/src/Umbraco.Tests.Common/Builders/Extensions/BuilderExtensions.cs index cce3b88470..c105a8bded 100644 --- a/src/Umbraco.Tests.Common/Builders/Extensions/BuilderExtensions.cs +++ b/src/Umbraco.Tests.Common/Builders/Extensions/BuilderExtensions.cs @@ -33,6 +33,13 @@ namespace Umbraco.Tests.Common.Builders.Extensions return builder; } + public static T WithDeleteDate(this T builder, DateTime deleteDate) + where T : IWithDeleteDateBuilder + { + builder.DeleteDate = deleteDate; + return builder; + } + public static T WithAlias(this T builder, string alias) where T : IWithAliasBuilder { diff --git a/src/Umbraco.Tests.Common/Builders/Interfaces/IBuildPropertyGroups.cs b/src/Umbraco.Tests.Common/Builders/Interfaces/IBuildPropertyGroups.cs new file mode 100644 index 0000000000..0391061a84 --- /dev/null +++ b/src/Umbraco.Tests.Common/Builders/Interfaces/IBuildPropertyGroups.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Tests.Common.Builders.Interfaces +{ + public interface IBuildPropertyGroups + { + } +} diff --git a/src/Umbraco.Tests.Common/Builders/Interfaces/IBuildPropertyTypes.cs b/src/Umbraco.Tests.Common/Builders/Interfaces/IBuildPropertyTypes.cs new file mode 100644 index 0000000000..e0eb9e19d5 --- /dev/null +++ b/src/Umbraco.Tests.Common/Builders/Interfaces/IBuildPropertyTypes.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Tests.Common.Builders.Interfaces +{ + public interface IBuildPropertyTypes + { + } +} diff --git a/src/Umbraco.Tests.Common/Builders/MemberBuilder.cs b/src/Umbraco.Tests.Common/Builders/MemberBuilder.cs index cef4a35524..3925ac642b 100644 --- a/src/Umbraco.Tests.Common/Builders/MemberBuilder.cs +++ b/src/Umbraco.Tests.Common/Builders/MemberBuilder.cs @@ -155,7 +155,7 @@ namespace Umbraco.Tests.Common.Builders if (_memberTypeBuilder == null) { - throw new InvalidOperationException("A member cannot be constructed without providing a member type (use AddMemberType)."); + throw new InvalidOperationException("A member cannot be constructed without providing a member type. Use AddMemberType()."); } var memberType = _memberTypeBuilder.Build(); diff --git a/src/Umbraco.Tests.Common/Builders/MemberTypeBuilder.cs b/src/Umbraco.Tests.Common/Builders/MemberTypeBuilder.cs index b01b8a1680..d5a145331e 100644 --- a/src/Umbraco.Tests.Common/Builders/MemberTypeBuilder.cs +++ b/src/Umbraco.Tests.Common/Builders/MemberTypeBuilder.cs @@ -10,7 +10,8 @@ using Umbraco.Tests.Common.Builders.Interfaces; namespace Umbraco.Tests.Common.Builders { public class MemberTypeBuilder - : ChildBuilderBase, + : ChildBuilderBase, + IBuildPropertyGroups, IWithIdBuilder, IWithAliasBuilder, IWithNameBuilder, @@ -22,7 +23,7 @@ namespace Umbraco.Tests.Common.Builders IWithThumbnailBuilder, IWithTrashedBuilder { - private readonly List _propertyGroupBuilders = new List(); + private readonly List> _propertyGroupBuilders = new List>(); private int? _id; private string _alias; @@ -41,7 +42,8 @@ namespace Umbraco.Tests.Common.Builders public MemberTypeBuilder WithMembershipPropertyGroup() { - var builder = new PropertyGroupBuilder(this) + var builder = new PropertyGroupBuilder(this) + .WithId(99) .WithName(Constants.Conventions.Member.StandardPropertiesGroupName) .WithSortOrder(1) .AddPropertyType() @@ -90,14 +92,14 @@ namespace Umbraco.Tests.Common.Builders return this; } - public PropertyGroupBuilder AddPropertyGroup() + public PropertyGroupBuilder AddPropertyGroup() { - var builder = new PropertyGroupBuilder(this); + var builder = new PropertyGroupBuilder(this); _propertyGroupBuilders.Add(builder); return builder; } - public override MemberType Build() + public override IMemberType Build() { var id = _id ?? 1; var name = _name ?? Guid.NewGuid().ToString(); diff --git a/src/Umbraco.Tests.Common/Builders/PropertyBuilder.cs b/src/Umbraco.Tests.Common/Builders/PropertyBuilder.cs new file mode 100644 index 0000000000..6cb7a431f2 --- /dev/null +++ b/src/Umbraco.Tests.Common/Builders/PropertyBuilder.cs @@ -0,0 +1,71 @@ +using System; +using Umbraco.Core.Models; +using Umbraco.Tests.Common.Builders.Interfaces; + +namespace Umbraco.Tests.Common.Builders +{ + public class PropertyBuilder + : BuilderBase, + IBuildPropertyTypes, + IWithIdBuilder, + IWithKeyBuilder, + IWithCreateDateBuilder, + IWithUpdateDateBuilder + { + private PropertyTypeBuilder _propertyTypeBuilder; + + private int? _id; + private Guid? _key; + private DateTime? _createDate; + private DateTime? _updateDate; + + public PropertyTypeBuilder AddPropertyType() + { + var builder = new PropertyTypeBuilder(this); + _propertyTypeBuilder = builder; + return builder; + } + + public override IProperty Build() + { + var id = _id ?? 1; + var key = _key ?? Guid.NewGuid(); + var createDate = _createDate ?? DateTime.Now; + var updateDate = _updateDate ?? DateTime.Now; + + // Needs to be within collection to support publishing. + var propertyTypeCollection = new PropertyTypeCollection(true, new[] { _propertyTypeBuilder.Build() }); + + return new Property(id, propertyTypeCollection[0]) + { + Key = key, + CreateDate = createDate, + UpdateDate = updateDate, + }; + } + + int? IWithIdBuilder.Id + { + get => _id; + set => _id = value; + } + + Guid? IWithKeyBuilder.Key + { + get => _key; + set => _key = value; + } + + DateTime? IWithCreateDateBuilder.CreateDate + { + get => _createDate; + set => _createDate = value; + } + + DateTime? IWithUpdateDateBuilder.UpdateDate + { + get => _updateDate; + set => _updateDate = value; + } + } +} diff --git a/src/Umbraco.Tests.Common/Builders/PropertyGroupBuilder.cs b/src/Umbraco.Tests.Common/Builders/PropertyGroupBuilder.cs index 5f6fe12dff..5df61dd072 100644 --- a/src/Umbraco.Tests.Common/Builders/PropertyGroupBuilder.cs +++ b/src/Umbraco.Tests.Common/Builders/PropertyGroupBuilder.cs @@ -6,29 +6,53 @@ using Umbraco.Tests.Common.Builders.Interfaces; namespace Umbraco.Tests.Common.Builders { - public class PropertyGroupBuilder - : ChildBuilderBase, // TODO: likely want to generalise this, so can use for document and media types too. - IWithNameBuilder, - IWithSortOrderBuilder + public class PropertyGroupBuilder : PropertyGroupBuilder { - private readonly List _propertyTypeBuilders = new List(); + public PropertyGroupBuilder() : base(null) + { + } + } + public class NullPropertyGroupBuilderParent : IBuildPropertyGroups + { + } + + public class PropertyGroupBuilder + : ChildBuilderBase, + IBuildPropertyTypes, + IWithIdBuilder, + IWithKeyBuilder, + IWithCreateDateBuilder, + IWithUpdateDateBuilder, + IWithNameBuilder, + IWithSortOrderBuilder where TParent: IBuildPropertyGroups + { + private readonly List>> _propertyTypeBuilders = new List>>(); + + private int? _id; + private Guid? _key; + private DateTime? _createDate; + private DateTime? _updateDate; private string _name; private int? _sortOrder; - public PropertyGroupBuilder(MemberTypeBuilder parentBuilder) : base(parentBuilder) + public PropertyGroupBuilder(TParent parentBuilder) : base(parentBuilder) { } - public PropertyTypeBuilder AddPropertyType() + public PropertyTypeBuilder> AddPropertyType() { - var builder = new PropertyTypeBuilder(this); + var builder = new PropertyTypeBuilder>(this); _propertyTypeBuilders.Add(builder); return builder; } public override PropertyGroup Build() { + var id = _id ?? 1; + var key = _key ?? Guid.NewGuid(); + var createDate = _createDate ?? DateTime.Now; + var updateDate = _updateDate ?? DateTime.Now; var name = _name ?? Guid.NewGuid().ToString(); var sortOrder = _sortOrder ?? 0; @@ -40,17 +64,45 @@ namespace Umbraco.Tests.Common.Builders return new PropertyGroup(properties) { + Id = id, + Key = key, Name = name, SortOrder = sortOrder, + CreateDate = createDate, + UpdateDate = updateDate, }; } + int? IWithIdBuilder.Id + { + get => _id; + set => _id = value; + } + + Guid? IWithKeyBuilder.Key + { + get => _key; + set => _key = value; + } + string IWithNameBuilder.Name { get => _name; set => _name = value; } - + + DateTime? IWithCreateDateBuilder.CreateDate + { + get => _createDate; + set => _createDate = value; + } + + DateTime? IWithUpdateDateBuilder.UpdateDate + { + get => _updateDate; + set => _updateDate = value; + } + int? IWithSortOrderBuilder.SortOrder { get => _sortOrder; diff --git a/src/Umbraco.Tests.Common/Builders/PropertyTypeBuilder.cs b/src/Umbraco.Tests.Common/Builders/PropertyTypeBuilder.cs index 955e2fca4c..9dc61014b5 100644 --- a/src/Umbraco.Tests.Common/Builders/PropertyTypeBuilder.cs +++ b/src/Umbraco.Tests.Common/Builders/PropertyTypeBuilder.cs @@ -1,5 +1,4 @@ using System; -using Moq; using Umbraco.Core.Models; using Umbraco.Core.Strings; using Umbraco.Tests.Common.Builders.Extensions; @@ -7,65 +6,139 @@ using Umbraco.Tests.Common.Builders.Interfaces; namespace Umbraco.Tests.Common.Builders { - public class PropertyTypeBuilder - : ChildBuilderBase, + public class PropertyTypeBuilder : PropertyTypeBuilder + { + public PropertyTypeBuilder() : base(null) + { + } + } + + public class NullPropertyTypeBuilderParent : IBuildPropertyTypes + { + } + + public class PropertyTypeBuilder + : ChildBuilderBase, + IWithIdBuilder, + IWithKeyBuilder, IWithAliasBuilder, IWithNameBuilder, + IWithCreateDateBuilder, + IWithUpdateDateBuilder, IWithSortOrderBuilder, - IWithDescriptionBuilder + IWithDescriptionBuilder where TParent : IBuildPropertyTypes { + private int? _id; + private Guid? _key; private string _propertyEditorAlias; private ValueStorageType? _valueStorageType; private string _alias; private string _name; + private DateTime? _createDate; + private DateTime? _updateDate; private int? _sortOrder; private string _description; private int? _dataTypeId; + private Lazy _propertyGroupId; + private bool? _mandatory; + private string _mandatoryMessage; + private string _validationRegExp; + private string _validationRegExpMessage; - public PropertyTypeBuilder(PropertyGroupBuilder parentBuilder) : base(parentBuilder) + public PropertyTypeBuilder(TParent parentBuilder) : base(parentBuilder) { } - public PropertyTypeBuilder WithPropertyEditorAlias(string propertyEditorAlias) + public PropertyTypeBuilder WithPropertyEditorAlias(string propertyEditorAlias) { _propertyEditorAlias = propertyEditorAlias; return this; } - public PropertyTypeBuilder WithValueStorageType(ValueStorageType valueStorageType) + public PropertyTypeBuilder WithValueStorageType(ValueStorageType valueStorageType) { _valueStorageType = valueStorageType; return this; } - public PropertyTypeBuilder WithDataTypeId(int dataTypeId) + public PropertyTypeBuilder WithDataTypeId(int dataTypeId) { _dataTypeId = dataTypeId; return this; } + public PropertyTypeBuilder WithPropertyGroupId(int propertyGroupId) + { + _propertyGroupId = new Lazy(() => propertyGroupId); + return this; + } + + public PropertyTypeBuilder WithMandatory(bool mandatory, string mandatoryMessage = "") + { + _mandatory = mandatory; + _mandatoryMessage = mandatoryMessage; + return this; + } + + public PropertyTypeBuilder WithValidationRegExp(string validationRegExp, string validationRegExpMessage = "") + { + _validationRegExp = validationRegExp; + _validationRegExpMessage = validationRegExpMessage; + return this; + } + public override PropertyType Build() { + var id = _id ?? 0; + var key = _key ?? Guid.NewGuid(); var propertyEditorAlias = _propertyEditorAlias ?? Guid.NewGuid().ToString().ToCamelCase(); var valueStorageType = _valueStorageType ?? ValueStorageType.Ntext; var name = _name ?? Guid.NewGuid().ToString(); var alias = _alias ?? name.ToCamelCase(); + var createDate = _createDate ?? DateTime.Now; + var updateDate = _updateDate ?? DateTime.Now; var sortOrder = _sortOrder ?? 0; var dataTypeId = _dataTypeId ?? 0; var description = _description ?? string.Empty; + var propertyGroupId = _propertyGroupId ?? null; + var mandatory = _mandatory ?? false; + var mandatoryMessage = _mandatoryMessage ?? string.Empty; + var validationRegExp = _validationRegExp ?? string.Empty; + var validationRegExpMessage = _validationRegExpMessage ?? string.Empty; var shortStringHelper = new DefaultShortStringHelper(new DefaultShortStringHelperConfig()); return new PropertyType(shortStringHelper, propertyEditorAlias, valueStorageType) { + Id = id, + Key = key, Alias = alias, Name = name, SortOrder = sortOrder, DataTypeId = dataTypeId, Description = description, + CreateDate = createDate, + UpdateDate = updateDate, + PropertyGroupId = propertyGroupId, + Mandatory = mandatory, + MandatoryMessage = mandatoryMessage, + ValidationRegExp = validationRegExp, + ValidationRegExpMessage = validationRegExpMessage, }; } + int? IWithIdBuilder.Id + { + get => _id; + set => _id = value; + } + + Guid? IWithKeyBuilder.Key + { + get => _key; + set => _key = value; + } + string IWithAliasBuilder.Alias { get => _alias; @@ -78,6 +151,18 @@ namespace Umbraco.Tests.Common.Builders set => _name = value; } + DateTime? IWithCreateDateBuilder.CreateDate + { + get => _createDate; + set => _createDate = value; + } + + DateTime? IWithUpdateDateBuilder.UpdateDate + { + get => _updateDate; + set => _updateDate = value; + } + int? IWithSortOrderBuilder.SortOrder { get => _sortOrder; diff --git a/src/Umbraco.Tests.Common/Builders/RelationBuilder.cs b/src/Umbraco.Tests.Common/Builders/RelationBuilder.cs new file mode 100644 index 0000000000..2cea234200 --- /dev/null +++ b/src/Umbraco.Tests.Common/Builders/RelationBuilder.cs @@ -0,0 +1,95 @@ +using System; +using Umbraco.Core.Models; +using Umbraco.Tests.Common.Builders.Interfaces; + +namespace Umbraco.Tests.Common.Builders +{ + public class RelationBuilder + : BuilderBase, + IWithIdBuilder, + IWithKeyBuilder, + IWithCreateDateBuilder, + IWithUpdateDateBuilder + { + private RelationTypeBuilder _relationTypeBuilder; + + private int? _id; + private int? _parentId; + private int? _childId; + private Guid? _key; + private DateTime? _createDate; + private DateTime? _updateDate; + private string _comment; + + public RelationBuilder WithComment(string comment) + { + _comment = comment; + return this; + } + + public RelationBuilder BetweenIds(int parentId, int childId) + { + _parentId = parentId; + _childId = childId; + return this; + } + + public RelationTypeBuilder AddRelationType() + { + var builder = new RelationTypeBuilder(this); + _relationTypeBuilder = builder; + return builder; + } + + public override Relation Build() + { + var id = _id ?? 0; + var parentId = _parentId ?? 0; + var childId = _childId ?? 0; + var key = _key ?? Guid.NewGuid(); + var createDate = _createDate ?? DateTime.Now; + var updateDate = _updateDate ?? DateTime.Now; + var comment = _comment ?? string.Empty; + + if (_relationTypeBuilder == null) + { + throw new InvalidOperationException("Cannot construct a Relation without a RelationType. Use AddRelationType()."); + } + + var relationType = _relationTypeBuilder.Build(); + + return new Relation(parentId, childId, relationType) + { + Comment = comment, + CreateDate = createDate, + Id = id, + Key = key, + UpdateDate = updateDate + }; + } + + int? IWithIdBuilder.Id + { + get => _id; + set => _id = value; + } + + Guid? IWithKeyBuilder.Key + { + get => _key; + set => _key = value; + } + + DateTime? IWithCreateDateBuilder.CreateDate + { + get => _createDate; + set => _createDate = value; + } + + DateTime? IWithUpdateDateBuilder.UpdateDate + { + get => _updateDate; + set => _updateDate = value; + } + } +} diff --git a/src/Umbraco.Tests.Common/Builders/RelationTypeBuilder.cs b/src/Umbraco.Tests.Common/Builders/RelationTypeBuilder.cs index 4ad39c6641..677d02bf09 100644 --- a/src/Umbraco.Tests.Common/Builders/RelationTypeBuilder.cs +++ b/src/Umbraco.Tests.Common/Builders/RelationTypeBuilder.cs @@ -4,15 +4,8 @@ using Umbraco.Tests.Common.Builders.Interfaces; namespace Umbraco.Tests.Common.Builders { - public class RelationTypeBuilder : RelationTypeBuilder - { - public RelationTypeBuilder() : base(null) - { - } - } - - public class RelationTypeBuilder - : ChildBuilderBase, + public class RelationTypeBuilder + : ChildBuilderBase, IWithIdBuilder, IWithAliasBuilder, IWithNameBuilder, @@ -32,7 +25,11 @@ namespace Umbraco.Tests.Common.Builders private Guid? _parentObjectType; private DateTime? _updateDate; - public RelationTypeBuilder(TParent parentBuilder) : base(parentBuilder) + public RelationTypeBuilder() : base(null) + { + } + + public RelationTypeBuilder(RelationBuilder parentBuilder) : base(parentBuilder) { } @@ -91,8 +88,7 @@ namespace Umbraco.Tests.Common.Builders var updateDate = _updateDate ?? DateTime.Now; var deleteDate = _deleteDate ?? null; - return new RelationType(name, alias, isBidirectional, parentObjectType, - childObjectType) + return new RelationType(name, alias, isBidirectional, parentObjectType, childObjectType) { Id = id, Key = key, @@ -102,19 +98,19 @@ namespace Umbraco.Tests.Common.Builders }; } - public RelationTypeBuilder WithIsBidirectional(bool isBidirectional) + public RelationTypeBuilder WithIsBidirectional(bool isBidirectional) { _isBidirectional = isBidirectional; return this; } - public RelationTypeBuilder WithChildObjectType(Guid childObjectType) + public RelationTypeBuilder WithChildObjectType(Guid childObjectType) { _childObjectType = childObjectType; return this; } - public RelationTypeBuilder WithParentObjectType(Guid parentObjectType) + public RelationTypeBuilder WithParentObjectType(Guid parentObjectType) { _parentObjectType = parentObjectType; return this; diff --git a/src/Umbraco.Tests.Common/Builders/StylesheetBuilder.cs b/src/Umbraco.Tests.Common/Builders/StylesheetBuilder.cs new file mode 100644 index 0000000000..ed871b9c31 --- /dev/null +++ b/src/Umbraco.Tests.Common/Builders/StylesheetBuilder.cs @@ -0,0 +1,34 @@ +using Umbraco.Core.Models; + +namespace Umbraco.Tests.Common.Builders +{ + public class StylesheetBuilder + : BuilderBase + { + private string _path; + private string _content; + + public StylesheetBuilder WithPath(string path) + { + _path = path; + return this; + } + + public StylesheetBuilder WithContent(string content) + { + _content = content; + return this; + } + + public override Stylesheet Build() + { + var path = _path ?? string.Empty; + var content = _content ?? string.Empty; + + return new Stylesheet(path) + { + Content = content, + }; + } + } +} diff --git a/src/Umbraco.Tests.Common/Builders/TemplateBuilder.cs b/src/Umbraco.Tests.Common/Builders/TemplateBuilder.cs new file mode 100644 index 0000000000..7f7fa0f098 --- /dev/null +++ b/src/Umbraco.Tests.Common/Builders/TemplateBuilder.cs @@ -0,0 +1,116 @@ +using System; +using Umbraco.Core.Models; +using Umbraco.Core.Strings; +using Umbraco.Tests.Common.Builders.Extensions; +using Umbraco.Tests.Common.Builders.Interfaces; + +namespace Umbraco.Tests.Common.Builders +{ + public class TemplateBuilder + : BuilderBase