Merge branch 'v8/dev' into v8/contrib

This commit is contained in:
Sebastiaan Janssen
2021-04-07 16:27:34 +02:00
5 changed files with 82 additions and 18 deletions

View File

@@ -3,7 +3,9 @@ using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Composing;
using Umbraco.Core.Exceptions;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Mapping
{
@@ -42,16 +44,29 @@ namespace Umbraco.Core.Mapping
private readonly ConcurrentDictionary<Type, Dictionary<Type, Action<object, object, MapperContext>>> _maps
= new ConcurrentDictionary<Type, Dictionary<Type, Action<object, object, MapperContext>>>();
private readonly IScopeProvider _scopeProvider;
/// <summary>
/// Initializes a new instance of the <see cref="UmbracoMapper"/> class.
/// </summary>
/// <param name="profiles"></param>
public UmbracoMapper(MapDefinitionCollection profiles)
/// <param name="scopeProvider"></param>
public UmbracoMapper(MapDefinitionCollection profiles, IScopeProvider scopeProvider)
{
_scopeProvider = scopeProvider;
foreach (var profile in profiles)
profile.DefineMaps(this);
}
/// <summary>
/// Initializes a new instance of the <see cref="UmbracoMapper"/> class.
/// </summary>
/// <param name="profiles"></param>
[Obsolete("This constructor is no longer used and will be removed in future versions, use the other constructor instead")]
public UmbracoMapper(MapDefinitionCollection profiles) : this(profiles, Current.ScopeProvider)
{}
#region Define
private static TTarget ThrowCtor<TSource, TTarget>(TSource source, MapperContext context)
@@ -203,7 +218,10 @@ namespace Umbraco.Core.Mapping
if (ctor != null && map != null)
{
var target = ctor(source, context);
map(source, target, context);
using (var scope = _scopeProvider.CreateScope(autoComplete: true))
{
map(source, target, context);
}
return (TTarget)target;
}
@@ -248,11 +266,14 @@ namespace Umbraco.Core.Mapping
{
var targetList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(targetGenericArg));
foreach (var sourceItem in source)
using (var scope = _scopeProvider.CreateScope(autoComplete: true))
{
var targetItem = ctor(sourceItem, context);
map(sourceItem, targetItem, context);
targetList.Add(targetItem);
foreach (var sourceItem in source)
{
var targetItem = ctor(sourceItem, context);
map(sourceItem, targetItem, context);
targetList.Add(targetItem);
}
}
object target = targetList;
@@ -315,7 +336,10 @@ namespace Umbraco.Core.Mapping
// if there is a direct map, map
if (map != null)
{
map(source, target, context);
using (var scope = _scopeProvider.CreateScope(autoComplete: true))
{
map(source, target, context);
}
return target;
}

View File

@@ -761,7 +761,7 @@ context('Content', () => {
cy.umbracoTreeItem("content", [name]).click();
// Click add
cy.get(':nth-child(2) > .preview-row > .preview-col > .preview-cell').click(); // Choose 1 column layout.
cy.get('.umb-column > .templates-preview > :nth-child(2) > .ng-binding').click(); // Choose headline
cy.get('.umb-column > .templates-preview > :nth-child(2) > small').click(); // Choose headline
cy.get('.umb-cell-placeholder').click();
// Click macro
cy.get(':nth-child(4) > .umb-card-grid-item > :nth-child(1)').click();

View File

@@ -1,17 +1,40 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading;
using Moq;
using NUnit.Framework;
using Umbraco.Core.Events;
using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
using Umbraco.Core.Scoping;
using Umbraco.Web.Models.ContentEditing;
using PropertyCollection = Umbraco.Core.Models.PropertyCollection;
namespace Umbraco.Tests.Mapping
{
[TestFixture]
public class MappingTests
{
private IScopeProvider _scopeProvider;
[SetUp]
public void MockScopeProvider()
{
var scopeMock = new Mock<IScopeProvider>();
scopeMock.Setup(x => x.CreateScope(
It.IsAny<IsolationLevel>(),
It.IsAny<RepositoryCacheMode>(),
It.IsAny<IEventDispatcher>(),
It.IsAny<bool?>(),
It.IsAny<bool>(),
It.IsAny<bool>()))
.Returns(Mock.Of<IScope>);
_scopeProvider = scopeMock.Object;
}
[Test]
public void SimpleMap()
{
@@ -19,7 +42,7 @@ namespace Umbraco.Tests.Mapping
{
new MapperDefinition1(),
});
var mapper = new UmbracoMapper(definitions);
var mapper = new UmbracoMapper(definitions, _scopeProvider);
var thing1 = new Thing1 { Value = "value" };
var thing2 = mapper.Map<Thing1, Thing2>(thing1);
@@ -44,7 +67,7 @@ namespace Umbraco.Tests.Mapping
{
new MapperDefinition1(),
});
var mapper = new UmbracoMapper(definitions);
var mapper = new UmbracoMapper(definitions, _scopeProvider);
var thing1A = new Thing1 { Value = "valueA" };
var thing1B = new Thing1 { Value = "valueB" };
@@ -78,7 +101,7 @@ namespace Umbraco.Tests.Mapping
{
new MapperDefinition1(),
});
var mapper = new UmbracoMapper(definitions);
var mapper = new UmbracoMapper(definitions, _scopeProvider);
var thing3 = new Thing3 { Value = "value" };
var thing2 = mapper.Map<Thing3, Thing2>(thing3);
@@ -103,7 +126,7 @@ namespace Umbraco.Tests.Mapping
{
new MapperDefinition2(),
});
var mapper = new UmbracoMapper(definitions);
var mapper = new UmbracoMapper(definitions, _scopeProvider);
// can map a PropertyCollection
var source = new PropertyCollection();
@@ -119,7 +142,7 @@ namespace Umbraco.Tests.Mapping
new MapperDefinition1(),
new MapperDefinition3(),
});
var mapper = new UmbracoMapper(definitions);
var mapper = new UmbracoMapper(definitions, _scopeProvider);
// the mapper currently has a map from Thing1 to Thing2
// because Thing3 inherits from Thing1, it will map a Thing3 instance,
@@ -179,7 +202,7 @@ namespace Umbraco.Tests.Mapping
{
new MapperDefinition4(),
});
var mapper = new UmbracoMapper(definitions);
var mapper = new UmbracoMapper(definitions, _scopeProvider);
var thing5 = new Thing5()
{
@@ -203,7 +226,7 @@ namespace Umbraco.Tests.Mapping
{
new MapperDefinition5(),
});
var mapper = new UmbracoMapper(definitions);
var mapper = new UmbracoMapper(definitions, _scopeProvider);
var thing7 = new Thing7();

View File

@@ -1,4 +1,5 @@
using System;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Web.Security;
@@ -9,11 +10,13 @@ using Umbraco.Core.Cache;
using Umbraco.Core.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Dictionary;
using Umbraco.Core.Events;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Persistence;
using Umbraco.Core.Scoping;
using Umbraco.Core.Services;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.TestHelpers.Stubs;
@@ -98,10 +101,21 @@ namespace Umbraco.Tests.Testing.TestingTests
{
var umbracoContext = TestObjects.GetUmbracoContextMock();
var scopeProvider = new Mock<IScopeProvider>();
scopeProvider
.Setup(x => x.CreateScope(
It.IsAny<IsolationLevel>(),
It.IsAny<RepositoryCacheMode>(),
It.IsAny<IEventDispatcher>(),
It.IsAny<bool?>(),
It.IsAny<bool>(),
It.IsAny<bool>()))
.Returns(Mock.Of<IScope>);
var membershipHelper = new MembershipHelper(umbracoContext.HttpContext, Mock.Of<IPublishedMemberCache>(), Mock.Of<MembershipProvider>(), Mock.Of<RoleProvider>(), Mock.Of<IMemberService>(), Mock.Of<IMemberTypeService>(), Mock.Of<IUserService>(), Mock.Of<IPublicAccessService>(), Mock.Of<AppCaches>(), Mock.Of<ILogger>());
var umbracoHelper = new UmbracoHelper(Mock.Of<IPublishedContent>(), Mock.Of<ITagQuery>(), Mock.Of<ICultureDictionaryFactory>(), Mock.Of<IUmbracoComponentRenderer>(), Mock.Of<IPublishedContentQuery>(), membershipHelper);
var umbracoMapper = new UmbracoMapper(new MapDefinitionCollection(new[] { Mock.Of<IMapDefinition>() }));
var umbracoMapper = new UmbracoMapper(new MapDefinitionCollection(new[] { Mock.Of<IMapDefinition>() }), scopeProvider.Object);
// ReSharper disable once UnusedVariable
var umbracoApiController = new FakeUmbracoApiController(Mock.Of<IGlobalSettings>(), Mock.Of<IUmbracoContextAccessor>(), Mock.Of<ISqlContext>(), ServiceContext.CreatePartial(), AppCaches.NoCache, Mock.Of<IProfilingLogger>(), Mock.Of<IRuntimeState>(), umbracoHelper, umbracoMapper);

View File

@@ -638,7 +638,10 @@ namespace Umbraco.Web.Editors
{
var path = IOHelper.MapPath(systemDirectory + "/" + virtualPath);
var dirInfo = new DirectoryInfo(path);
return dirInfo.Attributes == FileAttributes.Directory;
// If you turn off indexing in Windows this will have the attribute:
// `FileAttributes.Directory | FileAttributes.NotContentIndexed`
return (dirInfo.Attributes & FileAttributes.Directory) != 0;
}
// this is an internal class for passing stylesheet data from the client to the controller while editing